溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何使用python實現(xiàn)語音文件的特征提取

發(fā)布時間:2021-04-09 11:27:00 來源:億速云 閱讀:447 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下如何使用python實現(xiàn)語音文件的特征提取,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

概述

語音識別是當(dāng)前人工智能的比較熱門的方向,技術(shù)也比較成熟,各大公司也相繼推出了各自的語音助手機器人,如百度的小度機器人、阿里的天貓精靈等。語音識別算法當(dāng)前主要是由RNN、LSTM、DNN-HMM等機器學(xué)習(xí)和深度學(xué)習(xí)技術(shù)做支撐。但訓(xùn)練這些模型的第一步就是將音頻文件數(shù)據(jù)化,提取當(dāng)中的語音特征。

MP3文件轉(zhuǎn)化為WAV文件

錄制音頻文件的軟件大多數(shù)都是以mp3格式輸出的,但mp3格式文件對語音的壓縮比例較重,因此首先利用ffmpeg將轉(zhuǎn)化為wav原始文件有利于語音特征的提取。其轉(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語音文件,對語音進行采樣

利用wave庫對語音文件進行采樣。

代碼如下:

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()   # 采樣點數(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)))  #對數(shù)據(jù)進行歸一化
 # 生成音頻數(shù)據(jù),ndarray不能進行json化,必須轉(zhuǎn)化為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):
 """
 這是畫音頻的頻譜函數(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開發(fā)平臺的語音合API生成的MP3文件進行上述過程的結(jié)果。

聲波折線圖

如何使用python實現(xiàn)語音文件的特征提取

頻譜圖

如何使用python實現(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"   #說明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()   # 采樣點數(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)))  #對數(shù)據(jù)進行歸一化
 # 生成音頻數(shù)據(jù),ndarray不能進行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):
 """
 這是畫音頻的頻譜函數(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文件的地址
 path2 = './MP3_File'
 path3 = "./WAV_File"
 paths = os.listdir(path2)
 mp3_paths = []
 # 獲取mp3文件的相對地址
 for mp3_path in paths:
  mp3_paths.append(path2+"/"+mp3_path)
 print(mp3_paths)

 # 得到MP3文件對應(yīng)的WAV文件的相對地址
 wav_paths = []
 for mp3_path in mp3_paths:
  wav_path = path3+"/"+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)

 # 開始對音頻文件進行數(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實現(xiàn)語音文件的特征提取”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI