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 多进程通信模块的简单实现
Feb 20 Python
python中二维阵列的变换实例
Oct 09 Python
python版本坑:md5例子(python2与python3中md5区别)
Jun 20 Python
浅谈Tensorflow由于版本问题出现的几种错误及解决方法
Jun 13 Python
Python tkinter的grid布局及Text动态显示方法
Oct 11 Python
python 绘制拟合曲线并加指定点标识的实现
Jul 10 Python
利用Python校准本地时间的方法教程
Oct 31 Python
Python实现微信好友的数据分析
Dec 16 Python
python几种常用功能实现代码实例
Dec 25 Python
python模拟预测一下新型冠状病毒肺炎的数据
Feb 01 Python
Django 404、500页面全局配置知识点详解
Mar 10 Python
拒绝盗图!教你怎么用python给图片加水印
Jun 04 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分页的功能模块
2015/06/16 PHP
PHP入门教程之日期与时间操作技巧总结(格式化,验证,获取,转换,计算等)
2016/09/11 PHP
php实现微信小程序授权登录功能(实现流程)
2019/11/13 PHP
通过正则格式化url查询字符串实现代码
2012/12/28 Javascript
javascript从image转换为base64位编码的String
2014/07/29 Javascript
JS数组(Array)处理函数整理
2014/12/07 Javascript
js实现iframe跨页面调用函数的方法
2014/12/13 Javascript
jQuery实现文本框邮箱输入自动补全效果
2015/11/17 Javascript
JavaScript实现设计模式中的单例模式的一些技巧总结
2016/05/17 Javascript
jQuery简单设置文本框回车事件的方法
2016/08/01 Javascript
浅谈jquery中使用canvas的问题
2016/10/10 Javascript
jQuery ajax的功能实现方法详解
2017/01/06 Javascript
BACKBONE.JS 简单入门范例
2017/10/17 Javascript
vue.js简单配置axios的方法详解
2017/12/13 Javascript
JavaScript ES2019中的8个新特性详解
2019/02/20 Javascript
通过图带你深入了解vue的响应式原理
2019/06/21 Javascript
js实现鼠标滑动到某个div禁止滚动
2020/09/17 Javascript
JavaScript实现网页下拉菜单效果
2020/11/20 Javascript
python使用xauth方式登录饭否网然后发消息
2014/04/11 Python
Python的randrange()方法使用教程
2015/05/15 Python
Python生成数字图片代码分享
2017/10/31 Python
python实现决策树、随机森林的简单原理
2018/03/26 Python
python3爬取数据至mysql的方法
2018/06/26 Python
python数据结构之线性表的顺序存储结构
2018/09/28 Python
小白入门篇使用Python搭建点击率预估模型
2018/10/12 Python
keras 特征图可视化实例(中间层)
2020/01/24 Python
基于CSS3实现的黑色个性导航菜单效果
2015/09/14 HTML / CSS
html5中如何将图片的绝对路径转换成文件对象
2018/01/11 HTML / CSS
发现世界上最好的珠宝设计师:JewelStreet
2017/12/17 全球购物
医药工作岗位求职信分享
2013/12/31 职场文书
函授教育个人学习的自我评价
2013/12/31 职场文书
《李时珍夜宿古寺》教学反思
2014/04/09 职场文书
2014年保育员工作总结
2014/12/02 职场文书
童年读书笔记
2015/06/26 职场文书
签证扫盲贴,41个常见签证知识,需要的拿走
2019/08/09 职场文书
Win11开始菜单添加休眠选项
2022/04/19 数码科技