使用python實(shí)現(xiàn)語(yǔ)音文件的特征提取方法
概述
語(yǔ)音識(shí)別是當(dāng)前人工智能的比較熱門(mén)的方向,技術(shù)也比較成熟,各大公司也相繼推出了各自的語(yǔ)音助手機(jī)器人,如百度的小度機(jī)器人、阿里的天貓精靈等。語(yǔ)音識(shí)別算法當(dāng)前主要是由RNN、LSTM、DNN-HMM等機(jī)器學(xué)習(xí)和深度學(xué)習(xí)技術(shù)做支撐。但訓(xùn)練這些模型的第一步就是將音頻文件數(shù)據(jù)化,提取當(dāng)中的語(yǔ)音特征。
MP3文件轉(zhuǎn)化為WAV文件
錄制音頻文件的軟件大多數(shù)都是以mp3格式輸出的,但mp3格式文件對(duì)語(yǔ)音的壓縮比例較重,因此首先利用ffmpeg將轉(zhuǎn)化為wav原始文件有利于語(yǔ)音特征的提取。其轉(zhuǎn)化代碼如下:
from pydub import AudioSegment import pydub def MP32WAV(mp3_path,wav_path): """ 這是MP3文件轉(zhuǎn)化成WAV文件的函數(shù) :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語(yǔ)音文件,對(duì)語(yǔ)音進(jìn)行采樣
利用wave庫(kù)對(duì)語(yǔ)音文件進(jìn)行采樣。
代碼如下:
import wave
import json
def Read_WAV(wav_path):
"""
這是讀取wav文件的函數(shù),音頻數(shù)據(jù)是單通道的。返回json
:param wav_path: WAV文件的地址
"""
wav_file = wave.open(wav_path,'r')
numchannel = wav_file.getnchannels() # 聲道數(shù)
samplewidth = wav_file.getsampwidth() # 量化位數(shù)
framerate = wav_file.getframerate() # 采樣頻率
numframes = wav_file.getnframes() # 采樣點(diǎn)數(shù)
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))) #對(duì)數(shù)據(jù)進(jìn)行歸一化
# 生成音頻數(shù)據(jù),ndarray不能進(jìn)行json化,必須轉(zhuǎn)化為list,生成JSON
dict = {"channel":numchannel,
"samplewidth":samplewidth,
"framerate":framerate,
"numframes":numframes,
"WaveData":list(Wav_Data)}
return json.dumps(dict)
繪制聲波折線(xiàn)圖與頻譜圖
代碼如下:
from matplotlib import pyplot as plt def DrawSpectrum(wav_data,framerate): """ 這是畫(huà)音頻的頻譜函數(shù) :param wav_data: 音頻數(shù)據(jù) :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開(kāi)發(fā)平臺(tái)的語(yǔ)音合API生成的MP3文件進(jìn)行上述過(guò)程的結(jié)果。
聲波折線(xiàn)圖

頻譜圖

全部代碼
#!/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文件轉(zhuǎn)化成WAV文件的函數(shù)
:param mp3_path: MP3文件的地址
:param wav_path: WAV文件的地址
"""
pydub.AudioSegment.converter = "D:\\ffmpeg\\bin\\ffmpeg.exe" #說(shuō)明ffmpeg的地址
MP3_File = AudioSegment.from_mp3(file=mp3_path)
MP3_File.export(wav_path,format="wav")
def Read_WAV(wav_path):
"""
這是讀取wav文件的函數(shù),音頻數(shù)據(jù)是單通道的。返回json
:param wav_path: WAV文件的地址
"""
wav_file = wave.open(wav_path,'r')
numchannel = wav_file.getnchannels() # 聲道數(shù)
samplewidth = wav_file.getsampwidth() # 量化位數(shù)
framerate = wav_file.getframerate() # 采樣頻率
numframes = wav_file.getnframes() # 采樣點(diǎn)數(shù)
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))) #對(duì)數(shù)據(jù)進(jìn)行歸一化
# 生成音頻數(shù)據(jù),ndarray不能進(jìn)行json化,必須轉(zhuǎn)化為list,生成JSON
dict = {"channel":numchannel,
"samplewidth":samplewidth,
"framerate":framerate,
"numframes":numframes,
"WaveData":list(Wav_Data)}
return json.dumps(dict)
def DrawSpectrum(wav_data,framerate):
"""
這是畫(huà)音頻的頻譜函數(shù)
:param wav_data: 音頻數(shù)據(jù)
: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():
"""
這是主函數(shù)
"""
# MP3文件和WAV文件的地址
path1 = './MP3_File'
path2 = "./WAV_File"
paths = os.listdir(path1)
mp3_paths = []
# 獲取mp3文件的相對(duì)地址
for mp3_path in paths:
mp3_paths.append(path1+"/"+mp3_path)
print(mp3_paths)
# 得到MP3文件對(duì)應(yīng)的WAV文件的相對(duì)地址
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文件轉(zhuǎn)化成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)
# 開(kāi)始對(duì)音頻文件進(jìn)行數(shù)據(jù)化
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實(shí)現(xiàn)語(yǔ)音文件的特征提取方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- python3實(shí)現(xiàn)語(yǔ)音轉(zhuǎn)文字(語(yǔ)音識(shí)別)和文字轉(zhuǎn)語(yǔ)音(語(yǔ)音合成)
- python語(yǔ)音識(shí)別指南終極版(有這一篇足矣)
- 使用Python和百度語(yǔ)音識(shí)別生成視頻字幕的實(shí)現(xiàn)
- 基于python實(shí)現(xiàn)語(yǔ)音錄入識(shí)別代碼實(shí)例
- Python譜減法語(yǔ)音降噪實(shí)例
- python實(shí)現(xiàn)智能語(yǔ)音天氣預(yù)報(bào)
- Python(PyS60)實(shí)現(xiàn)簡(jiǎn)單語(yǔ)音整點(diǎn)報(bào)時(shí)
- python文字轉(zhuǎn)語(yǔ)音實(shí)現(xiàn)過(guò)程解析
- 分析語(yǔ)音數(shù)據(jù)增強(qiáng)及python實(shí)現(xiàn)
相關(guān)文章
Django前端BootCSS實(shí)現(xiàn)分頁(yè)的方法
本文主要介紹了Django前端BootCSS實(shí)現(xiàn)分頁(yè)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
詳解Django 時(shí)間與時(shí)區(qū)設(shè)置問(wèn)題
這篇文章主要介紹了Django 時(shí)間與時(shí)區(qū)設(shè)置問(wèn)題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07
Python基于pillow庫(kù)實(shí)現(xiàn)生成圖片水印
這篇文章主要介紹了Python基于pillow庫(kù)實(shí)現(xiàn)生成圖片水印,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
Python使用cx_Oracle調(diào)用Oracle存儲(chǔ)過(guò)程的方法示例
這篇文章主要介紹了Python使用cx_Oracle調(diào)用Oracle存儲(chǔ)過(guò)程的方法,結(jié)合具體實(shí)例分析了Python中通過(guò)cx_Oracle調(diào)用PL/SQL的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-10-10
Python實(shí)現(xiàn)調(diào)用另一個(gè)路徑下py文件中的函數(shù)方法總結(jié)
這篇文章主要介紹了Python實(shí)現(xiàn)調(diào)用另一個(gè)路徑下py文件中的函數(shù)方法,結(jié)合實(shí)例形式總結(jié)分析了Python針對(duì)不同文件夾中py文件調(diào)用操作的處理技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2018-06-06
基于Python實(shí)現(xiàn)大文件分割和命名腳本過(guò)程解析
這篇文章主要介紹了基于Python實(shí)現(xiàn)大文件分割和命名腳本過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
python pytest進(jìn)階之conftest.py詳解
這篇文章主要介紹了python pytest進(jìn)階之conftest.py詳解,如果我們?cè)诰帉?xiě)測(cè)試用的時(shí)候,每一個(gè)測(cè)試文件里面的用例都需要先登錄后才能完成后面的操作,那么們?cè)撊绾螌?shí)現(xiàn)呢?這就需要我們掌握conftest.py文件的使用了,需要的朋友可以參考下2019-06-06

