使用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正则表达式匹配ip地址实例
Oct 09 Python
Python最长公共子串算法实例
Mar 07 Python
基于进程内通讯的python聊天室实现方法
Jun 28 Python
python实现键盘控制鼠标移动
Nov 27 Python
Python常见的pandas用法demo示例
Mar 16 Python
python PyQt5/Pyside2 按钮右击菜单实例代码
Aug 17 Python
浅谈Tensorflow加载Vgg预训练模型的几个注意事项
May 26 Python
详解pandas.DataFrame.plot() 画图函数
Jun 14 Python
Python使用itcaht库实现微信自动收发消息功能
Jul 13 Python
python实现canny边缘检测
Sep 14 Python
Opencv常见图像格式Data Type及代码实例
Nov 02 Python
python中requests模拟登录的三种方式(携带cookie/session进行请求网站)
Nov 17 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
网页游戏开发入门教程三(简单程序应用)
2009/11/02 PHP
网站用php实现paypal整合方法
2010/11/28 PHP
yii框架源码分析之创建controller代码
2011/06/28 PHP
如何使用php判断所处服务器操作系统的类型
2013/06/20 PHP
修复ShopNC使用QQ 互联时提示100010 错误
2015/11/08 PHP
AJAX PHP无刷新form表单提交的简单实现(推荐)
2016/09/09 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
如何调试异步加载页面里包含的js文件
2014/10/30 Javascript
node.js中的fs.lchmodSync方法使用说明
2014/12/16 Javascript
JS解析XML文件和XML字符串详解
2015/04/17 Javascript
AngularJs  Creating Services详解及示例代码
2016/09/02 Javascript
Angular获取手机验证码实现移动端登录注册功能
2017/05/17 Javascript
JavaScrip关于创建常量的知识点
2017/12/07 Javascript
详解Webpack loader 之 file-loader
2018/11/07 Javascript
小程序实现抽奖动画
2020/04/16 Javascript
JS使用JSON.parse(),JSON.stringify()实现对对象的深拷贝功能分析
2019/03/06 Javascript
Vue中 axios delete请求参数操作
2020/08/25 Javascript
微信小程序基于高德地图API实现天气组件(动态效果)
2020/10/22 Javascript
使用PYTHON创建XML文档
2012/03/01 Python
Python正则抓取新闻标题和链接的方法示例
2017/04/24 Python
解决pyinstaller打包pyqt5的问题
2019/01/08 Python
python3.7 sys模块的具体使用
2019/07/22 Python
python小程序基于Jupyter实现天气查询的方法
2020/03/27 Python
python删除指定列或多列单个或多个内容实例
2020/06/28 Python
sublime3之内网安装python插件Anaconda的流程
2020/11/10 Python
HTML5 video标签(播放器)学习笔记(一):使用入门
2015/04/24 HTML / CSS
bareMinerals官网:矿物质化妆品和护肤品
2018/02/04 全球购物
Static Nested Class 和 Inner Class的不同
2013/11/28 面试题
医学院护理专业应届生求职信
2013/11/12 职场文书
新闻专业本科生的自我评价分享
2013/11/20 职场文书
高中毕业自我鉴定
2013/12/13 职场文书
2014五一国际劳动节活动总结范文
2014/04/14 职场文书
三好学生评语大全
2014/12/29 职场文书
Python入门之使用pandas分析excel数据
2021/05/12 Python
解析探秘fescar分布式事务实现原理
2022/02/28 Java/Android
Redis 异步机制
2022/05/15 Redis