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多线程编程(二):启动线程的两种方法
Apr 05 Python
在Python的Django框架中用流响应生成CSV文件的教程
May 02 Python
python使用pymysql实现操作mysql
Sep 13 Python
使用XML库的方式,实现RPC通信的方法(推荐)
Jun 14 Python
Python利用multiprocessing实现最简单的分布式作业调度系统实例
Nov 14 Python
python爬虫之urllib库常用方法用法总结大全
Nov 14 Python
Python3.5模块的定义、导入、优化操作图文详解
Apr 27 Python
Python Numpy库datetime类型的处理详解
Jul 13 Python
Python求正态分布曲线下面积实例
Nov 20 Python
Window系统下Python如何安装OpenCV库
Mar 05 Python
windows python3安装Jupyter Notebooks教程
Apr 13 Python
Python爬虫数据的分类及json数据使用小结
Mar 29 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 字符截取 解决中文的截取问题,不用mb系列
2009/09/29 PHP
无需重新编译php加入ftp扩展的解决方法
2013/02/07 PHP
php中mkdir函数用法实例分析
2014/11/15 PHP
php中PDO方式实现数据库的增删改查
2015/05/17 PHP
PHP函数超时处理方法
2016/02/14 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
纯js实现的论坛常用的运行代码的效果
2008/07/15 Javascript
jquery imgareaselect 使用利用js与程序结合实现图片剪切
2009/07/30 Javascript
7个Javascript地图脚本整理
2009/10/20 Javascript
比较详细的关于javascript 解析json的代码
2009/12/16 Javascript
JS动态修改图片的URL(src)的方法
2015/04/01 Javascript
Bootstrap3制作图片轮播效果
2016/05/12 Javascript
jQuery焦点图轮播插件KinSlideshow用法分析
2016/06/08 Javascript
第一次记录Bootstrap table学习笔记(1)
2017/05/18 Javascript
使用vue构建移动应用实战代码
2017/08/02 Javascript
纯html+css+javascript实现楼层跳跃式的页面布局(实例代码)
2017/10/25 Javascript
垃圾回收器的相关知识点总结
2018/05/13 Javascript
JavaScript碰撞检测原理及其实现代码
2020/03/12 Javascript
JS实现audio音频剪裁剪切复制播放与上传(步骤详解)
2020/07/28 Javascript
Python调用命令行进度条的方法
2015/05/05 Python
在Python中处理列表之reverse()方法的使用教程
2015/05/21 Python
python实现字典(dict)和字符串(string)的相互转换方法
2017/03/01 Python
使用python实现ANN
2017/12/20 Python
Python自动发送邮件的方法实例总结
2018/12/08 Python
关于pytorch中网络loss传播和参数更新的理解
2019/08/20 Python
Tensorflow进行多维矩阵的拆分与拼接实例
2020/02/07 Python
python模拟实现分发扑克牌
2020/04/22 Python
Selenium元素定位的30种方式(史上最全)
2020/05/11 Python
Keras实现支持masking的Flatten层代码
2020/06/16 Python
开展党的群众路线教育实践活动方案
2014/02/05 职场文书
社区活动策划方案
2014/08/21 职场文书
查摆剖析材料范文
2014/09/30 职场文书
人民的好儿女观后感
2015/06/18 职场文书
用 Python 元类的特性实现 ORM 框架
2021/05/19 Python
详解python网络进程
2021/06/15 Python
详解Python为什么不用设计模式
2021/06/24 Python