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的数字类型变量与其方法
Nov 20 Python
快速解决PyCharm无法引用matplotlib的问题
May 24 Python
python 通过 socket 发送文件的实例代码
Aug 14 Python
python使用epoll实现服务端的方法
Oct 16 Python
python 划分数据集为训练集和测试集的方法
Dec 11 Python
django模板加载静态文件的方法步骤
Mar 01 Python
python图形开发GUI库pyqt5的详细使用方法及各控件的属性与方法
Feb 14 Python
python软件都是免费的吗
Jun 18 Python
容易被忽略的Python内置类型
Sep 03 Python
python 录制系统声音的示例
Dec 21 Python
Python文件的操作示例的详细讲解
Apr 08 Python
总结Python使用过程中的bug
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和ACCESS写聊天室(二)
2006/10/09 PHP
PHP实现仿Google分页效果的分页函数
2015/07/29 PHP
PHP如何通过带尾指针的链表实现'队列'
2020/10/22 PHP
在JavaScript中通过URL传递汉字的方法
2007/04/09 Javascript
关于 byval 与 byref 的区别分析总结
2007/10/08 Javascript
JS 数字转换研究总结
2013/12/26 Javascript
javascript自动恢复文本框点击清除后的默认文本
2016/01/12 Javascript
JavaScript实现图片滑动切换的代码示例分享
2016/03/06 Javascript
jQuery中常用动画效果函数(日常整理)
2016/09/17 Javascript
javascript实现根据汉字获取简拼
2016/09/25 Javascript
JS查找字符串中出现最多的字符及个数统计
2017/02/04 Javascript
React Native悬浮按钮组件的示例代码
2018/04/05 Javascript
Vue 指令实现按钮级别权限管理功能
2019/04/23 Javascript
vue 获取视频时长的实例代码
2019/08/20 Javascript
微信小程序进入广告实现代码实例
2019/09/19 Javascript
vue解决花括号数据绑定不成功的问题
2019/10/30 Javascript
[02:32]DOTA2亚洲邀请赛 C9战队出场宣传片
2015/02/07 DOTA
Python中的zipfile模块使用详解
2015/06/25 Python
利用python模拟实现POST请求提交图片的方法
2017/07/25 Python
python获取酷狗音乐top500的下载地址 MP3格式
2018/04/17 Python
对Python 数组的切片操作详解
2018/07/02 Python
python实现计算器功能
2019/10/31 Python
python3实现绘制二维点图
2019/12/04 Python
pytorch 实现将自己的图片数据处理成可以训练的图片类型
2020/01/08 Python
python3+opencv生成不规则黑白mask实例
2020/02/19 Python
Pyecharts地图显示不完成问题解决方案
2020/05/11 Python
Python远程linux执行命令实现
2020/11/11 Python
Python根据URL地址下载文件并保存至对应目录的实现
2020/11/15 Python
Python更改pip镜像源的方法示例
2020/12/01 Python
美国著名的品牌折扣店:Burlington
2017/06/08 全球购物
美国婚礼和派对礼品网站:Kate Aspen(新娘送礼会、迎婴派对)
2018/03/28 全球购物
Yves Rocher伊夫·黎雪美国官网:法国始创植物美肌1959
2019/01/09 全球购物
2013年入党人员的自我鉴定
2013/10/25 职场文书
事业单位竞聘上岗实施方案
2014/03/28 职场文书
精神文明单位申报材料
2014/05/02 职场文书
在职人员跳槽求职信
2015/03/20 职场文书