使用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网页请求urllib2模块简单封装代码
Feb 07 Python
python处理圆角图片、圆形图片的例子
Apr 25 Python
Python中实现远程调用(RPC、RMI)简单例子
Apr 28 Python
Python跳出循环语句continue与break的区别
Aug 25 Python
python对DICOM图像的读取方法详解
Jul 17 Python
Python升级导致yum、pip报错的解决方法
Sep 06 Python
Python使用文件锁实现进程间同步功能【基于fcntl模块】
Oct 16 Python
Python 创建新文件时避免覆盖已有的同名文件的解决方法
Nov 16 Python
python3中使用__slots__限定实例属性操作分析
Feb 14 Python
django正续或者倒序查库实例
May 19 Python
Python图像处理二值化方法实例汇总
Jul 24 Python
OpenCV全景图像拼接的实现示例
Jun 05 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
一个程序下载的管理程序(四)
2006/10/09 PHP
PHP实现XML与数据格式进行转换类实例
2015/07/29 PHP
php模板引擎技术简单实现
2016/03/15 PHP
浅谈PHP中的错误处理和异常处理
2017/02/04 PHP
JQuery EasyUI 数字格式化处理示例
2014/05/05 Javascript
用javascript关闭本窗口技巧小结
2014/09/05 Javascript
JavaScript实现检查页面上的广告是否被AdBlock屏蔽了的方法
2014/11/03 Javascript
jquery实现红色竖向多级向右展开的导航菜单效果
2015/08/31 Javascript
[js高手之路]设计模式系列课程-发布者,订阅者重构购物车的实例
2017/08/29 Javascript
微信小程序scroll-view组件实现滚动动画
2018/01/31 Javascript
Vue.js实现大屏数字滚动翻转效果
2019/11/29 Javascript
微信小程序图片加载失败时替换为默认图片的方法
2019/12/09 Javascript
[48:32]VGJ.T vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[01:16]DOTA2小知识课堂 Ep.03 芒果树无伤肉山
2019/12/05 DOTA
python抓取豆瓣图片并自动保存示例学习
2014/01/10 Python
Python Web框架Flask中使用百度云存储BCS实例
2015/02/08 Python
python 制作自定义包并安装到系统目录的方法
2018/10/27 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
2019/05/27 Python
python实现拼图小游戏
2020/02/22 Python
PyTorch在Windows环境搭建的方法步骤
2020/05/12 Python
Python unittest基本使用方法代码实例
2020/06/29 Python
Keds加拿大官网:购买帆布运动鞋和皮鞋
2019/09/26 全球购物
电影T恤、80年代T恤和80年代服装:TV Store Online
2020/01/05 全球购物
Levi’s西班牙官方网站:李维斯,著名的牛仔裤品牌
2020/08/20 全球购物
可以使用抽象函数重写基类中的虚函数吗
2013/06/02 面试题
财务会计毕业生自荐信
2013/11/02 职场文书
中国梦演讲稿开场白
2014/08/28 职场文书
司机工作自我鉴定
2014/09/19 职场文书
幼儿园教师考核评语
2014/12/31 职场文书
会计做账心得体会
2016/01/22 职场文书
只需要12页,掌握撰写一流商业计划书的技巧
2019/05/07 职场文书
opencv检测动态物体的实现
2021/07/21 Python
Nginx实现会话保持的两种方式
2022/03/18 Servers
笔记本自带的win11如何跳过联网激活?
2022/04/20 数码科技
Golang入门之计时器
2022/05/04 Golang
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
2022/05/25 SQL Server