Python实现语音识别和语音合成功能


Posted in Python onSeptember 20, 2019

声音的本质是震动,震动的本质是位移关于时间的函数,波形文件(.wav)中记录了不同采样时刻的位移。

通过傅里叶变换,可以将时间域的声音函数分解为一系列不同频率的正弦函数的叠加,通过频率谱线的特殊分布,建立音频内容和文本的对应关系,以此作为模型训练的基础。

案例:画出语音信号的波形和频率分布,(freq.wav数据地址)

# -*- encoding:utf-8 -*-
import numpy as np
import numpy.fft as nf
import scipy.io.wavfile as wf
import matplotlib.pyplot as plt
sample_rate, sigs = wf.read('../machine_learning_date/freq.wav')
print(sample_rate)   # 8000采样率
print(sigs.shape)  # (3251,)
sigs = sigs / (2 ** 15) # 归一化
times = np.arange(len(sigs)) / sample_rate
freqs = nf.fftfreq(sigs.size, 1 / sample_rate)
ffts = nf.fft(sigs)
pows = np.abs(ffts)
plt.figure('Audio')
plt.subplot(121)
plt.title('Time Domain')
plt.xlabel('Time', fontsize=12)
plt.ylabel('Signal', fontsize=12)
plt.tick_params(labelsize=10)
plt.grid(linestyle=':')
plt.plot(times, sigs, c='dodgerblue', label='Signal')
plt.legend()
plt.subplot(122)
plt.title('Frequency Domain')
plt.xlabel('Frequency', fontsize=12)
plt.ylabel('Power', fontsize=12)
plt.tick_params(labelsize=10)
plt.grid(linestyle=':')
plt.plot(freqs[freqs >= 0], pows[freqs >= 0], c='orangered', label='Power')
plt.legend()
plt.tight_layout()
plt.show()

Python实现语音识别和语音合成功能

语音识别

梅尔频率倒谱系数(MFCC)通过与声音内容密切相关的13个特殊频率所对应的能量分布,可以使用梅尔频率倒谱系数矩阵作为语音识别的特征。基于隐马尔科夫模型进行模式识别,找到测试样本最匹配的声音模型,从而识别语音内容。

MFCC

梅尔频率倒谱系数相关API:

import scipy.io.wavfile as wf
import python_speech_features as sf
sample_rate, sigs = wf.read('../data/freq.wav')
mfcc = sf.mfcc(sigs, sample_rate)

案例:画出MFCC矩阵:

python -m pip install python_speech_features
import scipy.io.wavfile as wf
import python_speech_features as sf
import matplotlib.pyplot as mp
sample_rate, sigs = wf.read(
  '../ml_data/speeches/training/banana/banana01.wav')
mfcc = sf.mfcc(sigs, sample_rate)
mp.matshow(mfcc.T, cmap='gist_rainbow')
mp.show()

Python实现语音识别和语音合成功能

隐马尔科夫模型

隐马尔科夫模型相关API:

import hmmlearn.hmm as hl
model = hl.GaussianHMM(n_components=4, covariance_type='diag', n_iter=1000)
# n_components: 用几个高斯分布函数拟合样本数据
# covariance_type: 相关矩阵的辅对角线进行相关性比较
# n_iter: 最大迭代上限
model.fit(mfccs) # 使用模型匹配测试mfcc矩阵的分值 score = model.score(test_mfccs)

案例:训练training文件夹下的音频,对testing文件夹下的音频文件做分类

1、读取training文件夹中的训练音频样本,每个音频对应一个mfcc矩阵,每个mfcc都有一个类别(apple)。

2、把所有类别为apple的mfcc合并在一起,形成训练集。

| mfcc |

    |

| mfcc | apple |

| mfcc |

    |

.....

由上述训练集样本可以训练一个用于匹配apple的HMM。

3、训练7个HMM分别对应每个水果类别。 保存在列表中。

4、读取testing文件夹中的测试样本,整理测试样本

| mfcc | apple |

| mfcc | lime   |

5、针对每一个测试样本:

1、分别使用7个HMM模型,对测试样本计算score得分。

2、取7个模型中得分最高的模型所属类别作为预测类别。

import os
import numpy as np
import scipy.io.wavfile as wf
import python_speech_features as sf
import hmmlearn.hmm as hl
​
#1. 读取training文件夹中的训练音频样本,每个音频对应一个mfcc矩阵,每个mfcc都有一个类别(apple)。
def search_file(directory):
  # 使传过来的directory匹配当前操作系统
  # {'apple':[url, url, url ... ], 'banana':[...]}  
  directory = os.path.normpath(directory)
  objects = {}
  # curdir:当前目录 
  # subdirs: 当前目录下的所有子目录
  # files: 当前目录下的所有文件名
  for curdir, subdirs, files in os.walk(directory):
    for file in files:
      if file.endswith('.wav'):
        label = curdir.split(os.path.sep)[-1]
        if label not in objects:
          objects[label] = []
        # 把路径添加到label对应的列表中
        path = os.path.join(curdir, file)
        objects[label].append(path)
  return objects
​
#读取训练集数据
train_samples = \
  search_file('../ml_data/speeches/training')
​
'''

2. 把所有类别为apple的mfcc合并在一起,形成训练集。

| mfcc |    |
  | mfcc | apple |
  | mfcc |    |
  .....
  由上述训练集样本可以训练一个用于匹配apple的HMM。
'''
train_x, train_y = [], []
# 遍历7次 apple/banana/...
for label, filenames in train_samples.items():
  mfccs = np.array([])
  for filename in filenames:
    sample_rate, sigs = wf.read(filename)
    mfcc = sf.mfcc(sigs, sample_rate)
    if len(mfccs)==0:
      mfccs = mfcc
    else:
      mfccs = np.append(mfccs, mfcc, axis=0)
  train_x.append(mfccs)
  train_y.append(label)
'''
训练集:
  train_x train_y
  ----------------
  | mfcc |    |
  | mfcc | apple |
  | mfcc |    |
  ----------------
  | mfcc |    |
  | mfcc | banana |
  | mfcc |    |
  -----------------
  | mfcc |    |
  | mfcc | lime  |
  | mfcc |    |
  -----------------
'''
# {'apple':object, 'banana':object ...}
models = {}
for mfccs, label in zip(train_x, train_y):
  model = hl.GaussianHMM(n_components=4, 
    covariance_type='diag', n_iter=1000)
  models[label] = model.fit(mfccs)
'''

4. 读取testing文件夹中的测试样本,针对每一个测试样本:

   1. 分别使用7个HMM模型,对测试样本计算score得分。

   2. 取7个模型中得分最高的模型所属类别作为预测类别。

'''
#读取测试集数据
test_samples = \
  search_file('../ml_data/speeches/testing')
​
test_x, test_y = [], []
for label, filenames in test_samples.items():
  mfccs = np.array([])
  for filename in filenames:
    sample_rate, sigs = wf.read(filename)
    mfcc = sf.mfcc(sigs, sample_rate)
    if len(mfccs)==0:
      mfccs = mfcc
    else:
      mfccs = np.append(mfccs, mfcc, axis=0)
  test_x.append(mfccs)
  test_y.append(label)
​
'''测试集:
  test_x test_y
  -----------------
  | mfcc | apple |
  -----------------
  | mfcc | banana |
  -----------------
  | mfcc | lime  |
  -----------------
'''
pred_test_y = []
for mfccs in test_x:
# 判断mfccs与哪一个HMM模型更加匹配
best_score, best_label = None, None
for label, model in models.items():
score = model.score(mfccs)
if (best_score is None) or (best_score<score):
best_score = score
best_label = label
pred_test_y.append(best_label)
​
print(test_y)
print(pred_test_y)

声音合成

根据需求获取某个声音的模型频域数据,根据业务需要可以修改模型数据,逆向生成时域数据,完成声音的合成。

案例:

import json
import numpy as np
import scipy.io.wavfile as wf
with open('../data/12.json', 'r') as f:
  freqs = json.loads(f.read())
tones = [
  ('G5', 1.5),
  ('A5', 0.5),
  ('G5', 1.5),
  ('E5', 0.5),
  ('D5', 0.5),
  ('E5', 0.25),
  ('D5', 0.25),
  ('C5', 0.5),
  ('A4', 0.5),
  ('C5', 0.75)]
sample_rate = 44100
music = np.empty(shape=1)
for tone, duration in tones:
  times = np.linspace(0, duration, duration * sample_rate)
  sound = np.sin(2 * np.pi * freqs[tone] * times)
  music = np.append(music, sound)
music *= 2 ** 15
music = music.astype(np.int16)
wf.write('../data/music.wav', sample_rate, music)

总结

以上所述是小编给大家介绍的Python实现语音识别和语音合成功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Win7下搭建python开发环境图文教程(安装Python、pip、解释器)
May 17 Python
python实现斐波那契数列的方法示例
Jan 12 Python
Python基于list的append和pop方法实现堆栈与队列功能示例
Jul 24 Python
让Python更加充分的使用Sqlite3
Dec 11 Python
利用Python实现在同一网络中的本地文件共享方法
Jun 04 Python
python 文件查找及内容匹配方法
Oct 25 Python
在Python中给Nan值更改为0的方法
Oct 30 Python
python判断列表的连续数字范围并分块的方法
Nov 16 Python
浅谈Python采集网页时正则表达式匹配换行符的问题
Dec 20 Python
Python如何读写二进制数组数据
Aug 01 Python
matplotlib相关系统目录获取方式小结
Feb 03 Python
基于Pygame实现简单的贪吃蛇游戏
Dec 06 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
Sep 20 #Python
Python使用__new__()方法为对象分配内存及返回对象的引用示例
Sep 20 #Python
Python 类方法和实例方法(@classmethod),静态方法(@staticmethod)原理与用法分析
Sep 20 #Python
Python 类属性与实例属性,类对象与实例对象用法分析
Sep 20 #Python
使用python脚本自动创建pip.ini配置文件代码实例
Sep 20 #Python
使用Python给头像戴上圣诞帽的图像操作过程解析
Sep 20 #Python
Python 函数用法简单示例【定义、参数、返回值、函数嵌套】
Sep 20 #Python
You might like
PHP性能优化准备篇图解PEAR安装
2011/12/05 PHP
php xml常用函数的集合(比较详细)
2013/06/06 PHP
css3实现背景模糊的三种方式
2021/03/09 HTML / CSS
javascript 动态添加事件代码
2008/11/30 Javascript
js限制文本框为整数和货币的函数代码
2010/10/13 Javascript
异步动态加载JS并运行(示例代码)
2013/12/13 Javascript
理解javascript中的with关键字
2016/02/15 Javascript
AngularJS 基础ng-class-even指令用法
2016/08/01 Javascript
14 个折磨人的 JavaScript 面试题
2016/08/08 Javascript
将JSON字符串转换成Map对象的方法
2016/11/30 Javascript
Extjs gridpanel 中的checkbox(复选框)根据某行的条件不能选中的解决方法
2017/02/17 Javascript
微信小程序 开发之全局配置
2017/05/05 Javascript
jQuery 开发之EasyUI 添加数据的实例
2017/09/26 jQuery
iview实现select tree树形下拉框的示例代码
2018/12/21 Javascript
JavaScript ES6中的简写语法总结与使用技巧
2018/12/30 Javascript
JS关闭子窗口并且刷新上一个窗口的实现示例
2020/03/10 Javascript
[01:32]2014DOTA2西雅图邀请赛 CIS我们有信心进入正赛
2014/07/08 DOTA
[36:22]VP vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
深入解析Python中的变量和赋值运算符
2015/10/12 Python
Python实现连接postgresql数据库的方法分析
2017/12/27 Python
在Python中输入一个以空格为间隔的数组方法
2018/11/13 Python
Python数据可视化:顶级绘图库plotly详解
2019/12/07 Python
Windows10+anacond+GPU+pytorch安装详细过程
2020/03/24 Python
解决jupyter notebook 前面书写后面内容消失的问题
2020/04/13 Python
3种适用于Python的疯狂秘密武器及原因解析
2020/04/29 Python
Python退出时强制运行一段代码的实现方法
2020/04/29 Python
Python如何使用神经网络进行简单文本分类
2021/02/25 Python
CSS3 实现童年的纸飞机
2019/05/05 HTML / CSS
美国创意礼品网站:UncommonGoods
2017/02/03 全球购物
老教师工作总结的自我评价
2013/09/27 职场文书
生物专业个人自荐信范文
2013/11/29 职场文书
写给女朋友的道歉信
2014/01/12 职场文书
单位成立周年感言
2014/01/26 职场文书
11月升旗仪式讲话稿
2014/02/15 职场文书
学校四群教育实施方案
2014/06/12 职场文书
浅谈redis整数集为什么不能降级
2021/07/25 Redis