使用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 相关文章推荐
详解Django框架中用户的登录和退出的实现
Jul 23 Python
Python通过90行代码搭建一个音乐搜索工具
Jul 29 Python
微信跳一跳python辅助脚本(总结)
Jan 11 Python
python numpy 部分排序 寻找最大的前几个数的方法
Jun 27 Python
Python3 读、写Excel文件的操作方法
Oct 20 Python
Python操作远程服务器 paramiko模块详细介绍
Aug 07 Python
如何通过python实现全排列
Feb 11 Python
jupyter lab的目录调整及设置默认浏览器为chrome的方法
Apr 10 Python
Django用户登录与注册系统的实现示例
Jun 03 Python
python程序需要编译吗
Jun 19 Python
Python 防止死锁的方法
Jul 29 Python
用Python实现定时备份Mongodb数据并上传到FTP服务器
Jan 27 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缓存类代码(附详细说明)
2011/06/09 PHP
php中mkdir函数用法实例分析
2014/11/15 PHP
php中使用gd库实现下载网页中所有图片
2015/05/12 PHP
php socket通信(tcp/udp)实例分析
2016/02/14 PHP
如何解决PHP使用mysql_query查询超大结果集超内存问题
2016/03/14 PHP
PHP基于GD库的图像处理方法小结
2016/09/27 PHP
thinkphp自定义权限管理之名称判断方法
2017/04/01 PHP
jquery 循环显示div的示例代码
2013/10/18 Javascript
JavaScript中使用Math.PI圆周率属性的方法
2015/06/14 Javascript
JavaScript中数据结构与算法(五):经典KMP算法
2015/06/19 Javascript
JS+CSS实现美化的下拉列表框效果
2015/08/11 Javascript
Sortable.js拖拽排序使用方法解析
2016/11/04 Javascript
详解Vue 多级组件透传新方法provide/inject
2018/05/09 Javascript
详解JS判断页面是在手机端还是在PC端打开的方法
2019/04/26 Javascript
vue+element-ui+axios实现图片上传
2019/08/20 Javascript
JS实现压缩上传图片base64长度功能
2019/12/03 Javascript
[00:32]2018DOTA2亚洲邀请赛OpTic出场
2018/04/03 DOTA
python局部赋值的规则
2013/03/07 Python
Python IDE PyCharm的基本快捷键和配置简介
2015/11/04 Python
使用Python来开发微信功能
2018/06/13 Python
python提取具有某种特定字符串的行数据方法
2018/12/11 Python
详解小白之KMP算法及python实现
2019/04/04 Python
python根据时间获取周数代码实例
2019/09/30 Python
利用Pytorch实现简单的线性回归算法
2020/01/15 Python
pytorch加载语音类自定义数据集的方法教程
2020/11/10 Python
python利用appium实现手机APP自动化的示例
2021/01/26 Python
python如何构建mock接口服务
2021/01/28 Python
css3圆角边框和边框阴影示例
2014/05/05 HTML / CSS
Aeropostale官网:美国著名校园品牌及青少年服饰品牌
2019/03/21 全球购物
2015年度个人思想工作总结
2015/04/08 职场文书
民事答辩状格式范文
2015/05/21 职场文书
Python连续赋值需要注意的一些问题
2021/06/03 Python
js不常见操作运算符总结
2021/11/20 Javascript
基于Apache Hudi在Google云构建数据湖平台的思路详解
2022/04/07 Servers
Android 界面一键变灰 深色主题工具类
2022/04/28 Java/Android
Python实现双向链表基本操作
2022/05/25 Python