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执行外部程序的常用方法小结
Mar 21 Python
Python中eval带来的潜在风险代码分析
Dec 11 Python
python实现排序算法解析
Sep 08 Python
对python实时得到鼠标位置的示例讲解
Oct 14 Python
详解PyCharm+QTDesigner+PyUIC使用教程
Jun 13 Python
python应用文件读取与登录注册功能
Sep 23 Python
python对象转字典的两种实现方式示例
Nov 07 Python
Python list运算操作代码实例解析
Jan 20 Python
使用OpenCV对车道进行实时检测的实现示例代码
Jun 19 Python
Pycharm调试程序技巧小结
Aug 08 Python
Django如何实现防止XSS攻击
Oct 13 Python
python实现学员管理系统(面向对象版)
Jun 05 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面向对象分析设计的61条军规小结
2010/07/17 PHP
php _autoload自动加载类与机制分析
2012/02/10 PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
2016/05/19 PHP
再谈Yii Framework框架中的事件event原理与应用
2020/04/07 PHP
PJ Blog修改-禁止复制的代码和方法
2006/10/25 Javascript
疯掉了,尽然有js写的操作系统
2007/04/23 Javascript
javascript 多浏览器 事件大全
2010/03/23 Javascript
js模拟类继承小例子
2010/07/17 Javascript
js调用activeX获取u盘序列号的代码
2011/11/21 Javascript
屏蔽网页右键复制和ctrl+c复制的js代码
2013/01/04 Javascript
详解javascript new的运行机制
2016/01/26 Javascript
JS集成fckeditor及判断内容是否为空的方法
2016/05/27 Javascript
javascript中的深复制详解及实例分析
2016/12/29 Javascript
微信小程序 向左滑动删除功能的实现
2017/03/10 Javascript
Vue实现动态响应数据变化
2017/04/28 Javascript
详解vue移动端日期选择组件
2018/02/22 Javascript
JS获取表格视图所选行号的ids过程解析
2020/02/21 Javascript
基于element-ui封装可搜索的懒加载tree组件的实现
2020/05/22 Javascript
python+selenium识别验证码并登录的示例代码
2017/12/21 Python
如何利用Python模拟GitHub登录详解
2019/07/15 Python
python爬虫 模拟登录人人网过程解析
2019/07/31 Python
python微信公众号开发简单流程实现
2020/03/09 Python
简单了解Java Netty Reactor三种线程模型
2020/04/26 Python
Python run()函数和start()函数的比较和差别介绍
2020/05/03 Python
python神经网络编程实现手写数字识别
2020/05/27 Python
python 如何调用 dubbo 接口
2020/09/24 Python
Python自动化办公Excel模块openpyxl原理及用法解析
2020/11/05 Python
CSS3实现可关闭的下拉手风琴菜单效果
2015/08/31 HTML / CSS
美国最大网上鞋店:Zappos
2016/07/25 全球购物
印尼在线购买隐形眼镜网站:Lensza.co.id
2019/04/27 全球购物
澳大利亚游乐场设备品牌:Lifespan Kids
2019/05/24 全球购物
Conforama西班牙:您的家具、装饰和电器商店
2020/02/21 全球购物
美德少年事迹材料
2014/01/23 职场文书
2015应届毕业生自荐信范文
2015/03/05 职场文书
Python序列化与反序列化相关知识总结
2021/06/08 Python
spring boot项目application.properties文件存放及使用介绍
2021/06/30 Java/Android