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入门篇之字典
Oct 17 Python
利用Python实现颜色色值转换的小工具
Oct 27 Python
利用Python2下载单张图片与爬取网页图片实例代码
Dec 25 Python
使用pandas对两个dataframe进行join的实例
Jun 08 Python
python 将list转成字符串,中间用符号分隔的方法
Oct 23 Python
Python查找数组中数值和下标相等的元素示例【二分查找】
Feb 13 Python
Python目录和文件处理总结详解
Sep 02 Python
如何基于pythonnet调用halcon脚本
Jan 20 Python
python计算导数并绘图的实例
Feb 29 Python
python用tkinter实现一个简易能进行随机点名的界面
Sep 27 Python
python反扒机制的5种解决方法
Feb 06 Python
如何用Python进行时间序列分解和预测
Mar 01 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
PHP实现把文本中的URL转换为链接的auolink()函数分享
2014/07/29 PHP
php微信公众平台开发之获取用户基本信息
2015/08/17 PHP
ThinkPHP和UCenter接口冲突的解决方法
2016/07/25 PHP
限制复选框的最大可选数
2006/07/01 Javascript
javascript中的prototype属性实例分析说明
2010/08/09 Javascript
用js判断页面是否加载完成实现代码
2012/12/11 Javascript
一个JavaScript变量声明的知识点
2013/10/28 Javascript
js读取配置文件自写
2014/02/11 Javascript
按Enter键触发事件的jquery方法实现代码
2014/02/17 Javascript
js获取url中的参数且参数为中文时通过js解码
2014/03/19 Javascript
js锁屏解屏通过对$.ajax进行封装实现
2014/07/31 Javascript
jQuery实现的导航条切换可显示隐藏
2014/10/22 Javascript
JavaScript让网页出现渐隐渐显背景颜色的方法
2015/04/21 Javascript
JavaScript 对象详细整理总结
2016/09/29 Javascript
JS双击变input框批量修改内容
2016/12/12 Javascript
清除输入框内的空格
2016/12/21 Javascript
easyUI实现类似搜索框关键词自动提示功能示例代码
2016/12/27 Javascript
vue的.vue文件是怎么run起来的(vue-loader)
2018/12/10 Javascript
学习LayUI时自研的表单参数校验框架案例分析
2019/07/29 Javascript
解决ant-design-vue中menu菜单无法默认展开的问题
2020/10/31 Javascript
跟老齐学Python之一个免费的实验室
2014/09/14 Python
在Python程序中操作文件之flush()方法的使用教程
2015/05/24 Python
Python的条件语句与运算符优先级详解
2015/10/13 Python
Python决策树和随机森林算法实例详解
2018/01/30 Python
Python unittest基本使用方法代码实例
2020/06/29 Python
python smtplib发送多个email联系人的实现
2020/10/09 Python
全球最大的在线旅游公司:Expedia
2017/11/16 全球购物
加拿大领先的牛仔零售商:Bluenotes
2018/01/22 全球购物
高级运动鞋:GREATS
2019/07/19 全球购物
Chinti & Parker官网:奢华羊绒女装和创新针织设计
2021/01/01 全球购物
迷你西餐厅创业计划书范文
2013/12/31 职场文书
质量承诺书怎么写
2014/05/24 职场文书
初三语文教学计划
2015/01/22 职场文书
元旦联欢晚会主持词
2015/07/01 职场文书
Python字典和列表性能之间的比较
2021/06/07 Python
python自动化测试之Selenium详解
2022/03/13 Python