Python实现简单的语音识别系统


Posted in Python onDecember 13, 2017

最近认识了一个做Python语音识别的朋友,聊天时候说到,未来五到十年,Python人工智能会在国内掀起一股狂潮,对各种应用的冲击,不下于淘宝对实体经济的冲击。在本地(江苏某三线城市)做这一行,短期可能显不出效果,但从长远来看,绝对是一个高明的选择。朋友老家山东的,毕业来这里创业,也是十分有想法啊。

将AI课上学习的知识进行简单的整理,可以识别简单的0-9的单个语音。基本方法就是利用库函数提取mfcc,然后计算误差矩阵,再利用动态规划计算累积矩阵。并且限制了匹配路径的范围。具体的技术网上很多,不再细谈。

现有缺点就是输入的语音长度都是1s,如果不固定长度则识别效果变差。改进思路是提取有效语音部分。但是该部分尚未完全做好,只写了一个原形函数,尚未完善。

Python实现简单的语音识别系统

Python实现简单的语音识别系统

import wave
import numpy as np
import matplotlib.pyplot as plt
from python_speech_features import mfcc
from math import cos,sin,sqrt,pi
def read_file(file_name):
  with wave.open(file_name,'r') as file:
    params = file.getparams()
    _, _, framerate, nframes = params[:4] 
    str_data = file.readframes(nframes)
    wave_data = np.fromstring(str_data, dtype = np.short)
    time = np.arange(0, nframes) * (1.0/framerate)
    return wave_data, time 
  return index1,index2
def find_point(data):
  count1,count2 = 0,0
  for index,val in enumerate(data):
    if count1 <40:
      count1 = count1+1 if abs(val)>0.15 else 0
      index1 = index
    if count1==40 and count2 <5:
      count2 = count2+1 if abs(val)<0.001 else 0
      index2 = index
    if count2==5:break
  return index1,index2
def select_valid(data):
  start,end = find_point(normalized(data))
  print(start,end)
  return data[start:end]
def normalized(a):
  maximum = max(a)
  minimum = min(a)
  return a/maximum

def compute_mfcc_coff(file_prefix = ''):
  mfcc_feats = []
  s = range(10)
  I = [0,3,4,8]
  II = [5,7,9]
  Input = {'':s,'I':I,'II':II,'B':s}
  for index,file_name in enumerate(file_prefix+'{0}.wav'.format(i) for i in Input[file_prefix]):
    data,time = read_file(file_name)
    #data = select_valid(data)
    #if file_prefix=='II':data = select_valid(data)

    mfcc_feat = mfcc(data,48000)[:75]
    mfcc_feats.append(mfcc_feat)
  t = np.array(mfcc_feats)
  return np.array(mfcc_feats)
def create_dist():

  for i,m_i in enumerate(mfcc_coff_input):#get the mfcc of input
    for j,m_j in enumerate(mfcc_coff):#get the mfcc of dataset
      #build the distortion matrix bwtween i wav and j wav
      N = len(mfcc_coff[0])
      distortion_mat = np.array([[0]*len(m_i) for i in range(N)],dtype = np.double)
      for k1,mfcc1 in enumerate(m_i):
        for k2,mfcc2 in enumerate(m_j):
          distortion_mat[k1][k2] = sqrt(sum((mfcc1[1:]-mfcc2[1:])**2))
      yield i,j,distortion_mat

def create_Dist():

  for _i,_j,dist in create_dist():
    N = len(dist)
    Dist = np.array([[0]*N for i in range(N)],dtype = np.double)
    Dist[0][0] = dist[0][0]
    for i in range(N):
      for j in range(N):
        if i|j ==0:continue
        pos = [(i-1,j),(i,j-1),(i-1,j-1)]
        Dist[i][j] = dist[i][j] + min(Dist[k1][k2] for k1,k2 in pos if k1>-1 and k2>-1)


    #if _i==0 and _j==1 :print(_i,_j,'\n',Dist,len(Dist[0]),len(Dist[1]))
    yield _i,_j,Dist
def search_path(n):
  comparison = np.array([[0]*10 for i in range(n)],dtype = np.double)
  for _i,_j,Dist in create_Dist():
    N = len(Dist)
    cut_off = 5
    row = [(d,N-1,j) for j,d in enumerate(Dist[N-1]) if abs(N-1-j)<=cut_off]
    col = [(d,i,N-1) for i,d in enumerate(Dist[:,N-1]) if abs(N-1-i)<=cut_off]
    min_d,min_i,min_j = min(row+col )
    comparison[_i][_j] = min_d
    optimal_path_x,optimal_path_y = [min_i],[min_j]
    while min_i and min_j:
      optimal_path_x.append(min_i)
      optimal_path_y.append(min_j)
      pos = [(min_i-1,min_j),(min_i,min_j-1),(min_i-1,min_j-1)]
      #try:
      min_d,min_i,min_j = min(((Dist[int(k1)][int(k2)],k1,k2) for k1,k2 in pos\
      if abs(k1-k2)<=cut_off))

    if _i==_j and _i==4:
      plt.scatter(optimal_path_x[::-1],optimal_path_y[::-1],color = 'red')
      plt.show()
  return comparison

mfcc_coff_input = []
mfcc_coff = []

def match(pre):
  global mfcc_coff_input
  global mfcc_coff
  mfcc_coff_input = compute_mfcc_coff(pre)
  compare = np.array([[0]*10 for i in range(len(mfcc_coff_input))],dtype = np.double)
  for prefix in ['','B']:
    mfcc_coff = compute_mfcc_coff(prefix)
    compare += search_path(len(mfcc_coff_input))
  for l in compare:
    print([int(x) for x in l])
    print(min(((val,index)for index,val in enumerate(l)))[1])
data,time = read_file('8.wav')
match('I')
match('II')

总结

以上就是本文关于Python实现简单的语音识别系统的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
小白如何入门Python? 制作一个网站为例
Mar 06 Python
python下解压缩zip文件并删除文件的实例
Apr 24 Python
windows7 32、64位下python爬虫框架scrapy环境的搭建方法
Nov 29 Python
Python 多维List创建的问题小结
Jan 18 Python
Python获取网段内ping通IP的方法
Jan 31 Python
python实现图像检索的三种(直方图/OpenCV/哈希法)
Aug 08 Python
Python Django 封装分页成通用的模块详解
Aug 21 Python
Django框架之中间件MiddleWare的实现
Dec 30 Python
python 实现将Numpy数组保存为图像
Jan 09 Python
pytorch masked_fill报错的解决
Feb 18 Python
python实现从ftp服务器下载文件
Mar 03 Python
python使用QQ邮箱实现自动发送邮件
Jun 22 Python
关于反爬虫的一些简单总结
Dec 13 #Python
Python自动化运维_文件内容差异对比分析
Dec 13 #Python
Python实现自动发送邮件功能
Mar 02 #Python
django站点管理详解
Dec 12 #Python
Django 生成登陆验证码代码分享
Dec 12 #Python
python+django加载静态网页模板解析
Dec 12 #Python
Django入门使用示例
Dec 12 #Python
You might like
实例(Smarty+FCKeditor新闻系统)
2007/01/02 PHP
PHP 长文章分页函数 带使用方法,不会分割段落,翻页在底部
2009/10/22 PHP
关于PHP结束标签的使用细节探讨及联想
2013/03/04 PHP
php遍历解析xml字符串的方法
2016/05/05 PHP
PHP实现创建微信自定义菜单的方法示例
2017/07/14 PHP
仿163填写邮件地址自动显示下拉(无优化)
2008/11/05 Javascript
jquery在Chrome下获取图片的长宽问题解决
2013/03/20 Javascript
jQuery截取指定长度字符串的实现原理及代码
2014/07/01 Javascript
JSONObject使用方法详解
2015/12/17 Javascript
JavaScript每天必学之数组和对象部分
2016/09/17 Javascript
微信小程序开发之圆形菜单 仿建行圆形菜单实例
2016/12/12 Javascript
详解Vue学习笔记入门篇之组件的内容分发(slot)
2017/07/17 Javascript
Vue2.0如何发布项目实战
2017/07/27 Javascript
基于webpack4+vue-cli3项目实现换肤功能
2019/07/17 Javascript
Vue实现随机验证码功能
2020/12/29 Vue.js
Python urllib模块urlopen()与urlretrieve()详解
2013/11/01 Python
PyQt5每天必学之弹出消息框
2018/04/19 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
2019/08/12 Python
python自动保存百度盘资源到百度盘中的实例代码
2019/08/26 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
2019/10/28 Python
浅析Python 条件控制语句
2020/07/15 Python
python爬虫快速响应服务器的做法
2020/11/24 Python
CSS3截取字符串实例代码【推荐】
2018/06/07 HTML / CSS
纯HTML+CSS3制作导航菜单(附源码)
2013/04/24 HTML / CSS
皮姆斯勒语言学习:Pimsleur Language Programs
2018/06/30 全球购物
Ted Baker美国官网:英国时尚品牌
2018/10/29 全球购物
师德学习感言
2014/01/31 职场文书
办公自动化专业大学生职业规划书
2014/03/06 职场文书
企业文化建设实施方案
2014/03/22 职场文书
学校安全防火方案
2014/06/07 职场文书
乡镇党建工作汇报材料
2014/08/14 职场文书
基层党组织整改方案
2014/10/25 职场文书
详解nginx安装过程并代理下载服务器文件
2022/02/12 Servers
Redis中key的过期删除策略和内存淘汰机制
2022/04/12 Redis
python基础之//、/与%的区别详解
2022/06/10 Python
戴尔Win11系统no bootable devices found解决教程
2022/09/23 数码科技