使用python实现语音文件的特征提取方法


Posted in Python onJanuary 09, 2019

概述

语音识别是当前人工智能的比较热门的方向,技术也比较成熟,各大公司也相继推出了各自的语音助手机器人,如百度的小度机器人、阿里的天猫精灵等。语音识别算法当前主要是由RNN、LSTM、DNN-HMM等机器学习和深度学习技术做支撑。但训练这些模型的第一步就是将音频文件数据化,提取当中的语音特征。

MP3文件转化为WAV文件

录制音频文件的软件大多数都是以mp3格式输出的,但mp3格式文件对语音的压缩比例较重,因此首先利用ffmpeg将转化为wav原始文件有利于语音特征的提取。其转化代码如下:

from pydub import AudioSegment
import pydub

def MP32WAV(mp3_path,wav_path):
 """
 这是MP3文件转化成WAV文件的函数
 :param mp3_path: MP3文件的地址
 :param wav_path: WAV文件的地址
 """
 pydub.AudioSegment.converter = "D:\\ffmpeg\\bin\\ffmpeg.exe"
 MP3_File = AudioSegment.from_mp3(file=mp3_path)
 MP3_File.export(wav_path,format="wav")

读取WAV语音文件,对语音进行采样

利用wave库对语音文件进行采样。

代码如下:

import wave
import json

def Read_WAV(wav_path):
 """
 这是读取wav文件的函数,音频数据是单通道的。返回json
 :param wav_path: WAV文件的地址
 """
 wav_file = wave.open(wav_path,'r')
 numchannel = wav_file.getnchannels()   # 声道数
 samplewidth = wav_file.getsampwidth()  # 量化位数
 framerate = wav_file.getframerate()  # 采样频率
 numframes = wav_file.getnframes()   # 采样点数
 print("channel", numchannel)
 print("sample_width", samplewidth)
 print("framerate", framerate)
 print("numframes", numframes)
 Wav_Data = wav_file.readframes(numframes)
 Wav_Data = np.fromstring(Wav_Data,dtype=np.int16)
 Wav_Data = Wav_Data*1.0/(max(abs(Wav_Data)))  #对数据进行归一化
 # 生成音频数据,ndarray不能进行json化,必须转化为list,生成JSON
 dict = {"channel":numchannel,
   "samplewidth":samplewidth,
   "framerate":framerate,
   "numframes":numframes,
   "WaveData":list(Wav_Data)}
 return json.dumps(dict)

绘制声波折线图与频谱图

代码如下:

from matplotlib import pyplot as plt

def DrawSpectrum(wav_data,framerate):
 """
 这是画音频的频谱函数
 :param wav_data: 音频数据
 :param framerate: 采样频率
 """
 Time = np.linspace(0,len(wav_data)/framerate*1.0,num=len(wav_data))
 plt.figure(1)
 plt.plot(Time,wav_data)
 plt.grid(True)
 plt.show()
 plt.figure(2)
 Pxx, freqs, bins, im = plt.specgram(wav_data,NFFT=1024,Fs = 16000,noverlap=900)
 plt.show()
 print(Pxx)
 print(freqs)
 print(bins)
 print(im)

首先利用百度AI开发平台的语音合API生成的MP3文件进行上述过程的结果。

声波折线图

使用python实现语音文件的特征提取方法

频谱图

使用python实现语音文件的特征提取方法

全部代码

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time : 2018/7/5 13:11
# @Author : DaiPuwei
# @FileName: VoiceExtract.py
# @Software: PyCharm
# @E-mail :771830171@qq.com
# @Blog :https://blog.csdn.net/qq_30091945

import numpy as np
from pydub import AudioSegment
import pydub
import os
import wave
import json
from matplotlib import pyplot as plt

def MP32WAV(mp3_path,wav_path):
 """
 这是MP3文件转化成WAV文件的函数
 :param mp3_path: MP3文件的地址
 :param wav_path: WAV文件的地址
 """
 pydub.AudioSegment.converter = "D:\\ffmpeg\\bin\\ffmpeg.exe"   #说明ffmpeg的地址
 MP3_File = AudioSegment.from_mp3(file=mp3_path)
 MP3_File.export(wav_path,format="wav")

def Read_WAV(wav_path):
 """
 这是读取wav文件的函数,音频数据是单通道的。返回json
 :param wav_path: WAV文件的地址
 """
 wav_file = wave.open(wav_path,'r')
 numchannel = wav_file.getnchannels()   # 声道数
 samplewidth = wav_file.getsampwidth()  # 量化位数
 framerate = wav_file.getframerate()  # 采样频率
 numframes = wav_file.getnframes()   # 采样点数
 print("channel", numchannel)
 print("sample_width", samplewidth)
 print("framerate", framerate)
 print("numframes", numframes)
 Wav_Data = wav_file.readframes(numframes)
 Wav_Data = np.fromstring(Wav_Data,dtype=np.int16)
 Wav_Data = Wav_Data*1.0/(max(abs(Wav_Data)))  #对数据进行归一化
 # 生成音频数据,ndarray不能进行json化,必须转化为list,生成JSON
 dict = {"channel":numchannel,
   "samplewidth":samplewidth,
   "framerate":framerate,
   "numframes":numframes,
   "WaveData":list(Wav_Data)}
 return json.dumps(dict)

def DrawSpectrum(wav_data,framerate):
 """
 这是画音频的频谱函数
 :param wav_data: 音频数据
 :param framerate: 采样频率
 """
 Time = np.linspace(0,len(wav_data)/framerate*1.0,num=len(wav_data))
 plt.figure(1)
 plt.plot(Time,wav_data)
 plt.grid(True)
 plt.show()
 plt.figure(2)
 Pxx, freqs, bins, im = plt.specgram(wav_data,NFFT=1024,Fs = 16000,noverlap=900)
 plt.show()
 print(Pxx)
 print(freqs)
 print(bins)
 print(im)

def run_main():
 """
  这是主函数
 """
 # MP3文件和WAV文件的地址
 path1 = './MP3_File'
 path2 = "./WAV_File"
 paths = os.listdir(path1)
 mp3_paths = []
 # 获取mp3文件的相对地址
 for mp3_path in paths:
  mp3_paths.append(path1+"/"+mp3_path)
 print(mp3_paths)

 # 得到MP3文件对应的WAV文件的相对地址
 wav_paths = []
 for mp3_path in mp3_paths:
  wav_path = path2+"/"+mp3_path[1:].split('.')[0].split('/')[-1]+'.wav'
  wav_paths.append(wav_path)
 print(wav_paths)

 # 将MP3文件转化成WAV文件
 for(mp3_path,wav_path) in zip(mp3_paths,wav_paths):
  MP32WAV(mp3_path,wav_path)
 for wav_path in wav_paths:
  Read_WAV(wav_path)

 # 开始对音频文件进行数据化
 for wav_path in wav_paths:
  wav_json = Read_WAV(wav_path)
  print(wav_json)
  wav = json.loads(wav_json)
  wav_data = np.array(wav['WaveData'])
  framerate = int(wav['framerate'])
  DrawSpectrum(wav_data,framerate)

if __name__ == '__main__':
 run_main()

以上这篇使用python实现语音文件的特征提取方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python单元测试框架unittest使用方法讲解
Apr 13 Python
讲解Python中运算符使用时的优先级
May 14 Python
Windows系统下使用flup搭建Nginx和Python环境的方法
Dec 25 Python
python matplotlib画图实例代码分享
Dec 27 Python
Python3之文件读写操作的实例讲解
Jan 23 Python
Python实现的网页截图功能【PyQt4与selenium组件】
Jul 12 Python
django框架自定义模板标签(template tag)操作示例
Jun 24 Python
Python使用指定端口进行http请求的例子
Jul 25 Python
python实现本地批量ping多个IP的方法示例
Aug 07 Python
Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)
Mar 10 Python
Python中zip函数如何使用
Jun 04 Python
详解分布式系统中如何用python实现Paxos
May 18 Python
对python中Librosa的mfcc步骤详解
Jan 09 #Python
Python中的枚举类型示例介绍
Jan 09 #Python
利用python提取wav文件的mfcc方法
Jan 09 #Python
Python Matplotlib库安装与基本作图示例
Jan 09 #Python
对Python使用mfcc的两种方式详解
Jan 09 #Python
Python中的 enum 模块源码详析
Jan 09 #Python
python linecache 处理固定格式文本数据的方法
Jan 08 #Python
You might like
用PHP和ACCESS写聊天室(一)
2006/10/09 PHP
PHP 命名空间实例说明
2011/01/27 PHP
深入理解require与require_once与include以及include_once的区别
2013/06/05 PHP
不使用php api函数实现数组的交换排序示例
2014/04/13 PHP
php递归调用删除数组空值元素的方法
2015/04/28 PHP
利用PHP如何统计Nginx日志的User Agent数据
2019/03/06 PHP
地址栏上的一段语句,改变页面的风格。(教程)
2008/04/02 Javascript
jQuery Select(单选) 模拟插件 V1.3.62 改进版
2010/07/17 Javascript
同一页面多个商品倒计时JS 基于面向对象的javascript
2012/02/16 Javascript
JS如何判断移动端访问设备并解析对应CSS
2013/11/27 Javascript
jQuery获得内容和属性示例代码
2014/01/16 Javascript
AngularJS入门知识之MVW类框架的编程思想探讨
2014/12/08 Javascript
jQuery设置和移除文本框默认值的方法
2015/03/09 Javascript
jQuery表单验证功能实例
2015/08/28 Javascript
BootStrap Table 分页后重新搜索问题的解决办法
2016/08/08 Javascript
jQuery自适应轮播图插件Swiper用法示例
2016/08/24 Javascript
Select2.js下拉框使用小结
2016/10/24 Javascript
详解vue组件化开发-vuex状态管理库
2017/04/10 Javascript
jquery仿京东商品放大浏览页面
2017/06/06 jQuery
Vue前端开发规范整理(推荐)
2018/04/23 Javascript
Vue.js特性Scoped Slots的浅析
2019/02/20 Javascript
[06:21]完美世界亚洲区首席发行官竺琦TI3采访
2013/08/26 DOTA
Python编写检测数据库SA用户的方法
2014/07/11 Python
Python如何实现MySQL实例初始化详解
2017/11/06 Python
Python模拟随机游走图形效果示例
2018/02/06 Python
python3利用ctypes传入一个字符串类型的列表方法
2019/02/12 Python
python实现输入三角形边长自动作图求面积案例
2020/04/12 Python
python 用opencv实现图像修复和图像金字塔
2020/11/27 Python
使用HTML和CSS3绘制基本卡通图案的示例分享
2015/11/06 HTML / CSS
HTML5 Canvas实现玫瑰曲线和心形图案的代码实例
2014/04/10 HTML / CSS
我们是伦敦女孩:WalG
2018/01/08 全球购物
一份Java笔试题
2012/02/21 面试题
2015年党支部公开承诺书
2015/01/22 职场文书
小学教师师德师风自我评价
2015/03/04 职场文书
回门宴新娘答谢词
2015/09/29 职场文书
幼儿教师继续教育培训心得体会
2016/01/19 职场文书