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生成验证码实例
Aug 21 Python
python中实现定制类的特殊方法总结
Sep 28 Python
Python常用的日期时间处理方法示例
Feb 08 Python
python基础入门学习笔记(Python环境搭建)
Jan 13 Python
Windows下Python2与Python3两个版本共存的方法详解
Feb 12 Python
TensorFlow实现Softmax回归模型
Mar 09 Python
解决Pycharm中import时无法识别自己写的程序方法
May 18 Python
Python基于最小二乘法实现曲线拟合示例
Jun 14 Python
详解python中list的使用
Mar 15 Python
python按行读取文件并找出其中指定字符串
Aug 08 Python
python实现图像高斯金字塔的示例代码
Dec 11 Python
python 网络编程要点总结
Jun 18 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数组交集的优化代码分析
2011/03/06 PHP
PHP ? EasyUI DataGrid 资料存的方式介绍
2012/11/07 PHP
php获取远程图片体积大小的实例
2013/11/12 PHP
用php简单实现加减乘除计算器
2014/01/06 PHP
yii操作session实例简介
2014/07/31 PHP
详细解读PHP中接口的应用
2015/08/12 PHP
Ext.get() 和 Ext.query()组合使用实现最灵活的取元素方式
2011/09/26 Javascript
浅析offsetLeft,Left,clientLeft之间的区别
2013/11/30 Javascript
jQuery+CSS实现一个侧滑导航菜单代码
2016/05/09 Javascript
js精准的倒计时函数分享
2016/06/29 Javascript
基于chosen插件实现人员选择树搜索自动筛选功能
2016/09/24 Javascript
JS弹出窗口的运用与技巧大全
2016/11/01 Javascript
对象不支持indexOf属性或方法的解决方法(必看)
2017/05/28 Javascript
详解JS获取HTML DOM元素的8种方法
2017/06/17 Javascript
Angular angular-file-upload文件上传的示例代码
2018/08/23 Javascript
解决vue-router在同一个路由下切换,取不到变化的路由参数问题
2018/09/01 Javascript
Vue动态修改网页标题的方法及遇到问题
2019/06/09 Javascript
微信小程序 扭蛋抽奖机css3动画实现详解
2019/07/19 Javascript
详解JS预解析原理
2020/06/16 Javascript
python对html过滤处理的方法
2018/10/21 Python
Python split() 函数拆分字符串将字符串转化为列的方法
2019/07/16 Python
解决python明明pip安装成功却找不到包的问题
2019/08/28 Python
python 伯努利分布详解
2020/02/25 Python
pycharm新建Vue项目的方法步骤(图文)
2020/03/04 Python
浅谈pandas dataframe对除数是零的处理
2020/07/20 Python
25个CSS3动画按钮和菜单教程分享
2012/10/03 HTML / CSS
AmazeUI 缩略图的实现示例
2020/08/18 HTML / CSS
俄罗斯GamePark游戏商店网站:购买游戏、游戏机和配件
2020/03/13 全球购物
System.Array.CopyTo()和System.Array.Clone()有什么区别
2016/06/20 面试题
你在项目中用到了xml技术的哪些方面?如何实现的?
2014/01/26 面试题
学雷锋先进个人事迹
2014/05/26 职场文书
纪念一二九运动演讲稿
2014/09/16 职场文书
2014年大学学生会工作总结
2014/12/02 职场文书
2015年组织委员工作总结
2015/04/23 职场文书
小学远程教育工作总结
2015/08/13 职场文书
2017年寒假社区服务活动总结
2016/04/06 职场文书