Python 百度語音識別與合成REST API及ffmpeg使用

HuangZhang_123發表於2017-05-31

作業系統:Windows
Python:3.5
歡迎加入學習交流QQ群:657341423


百度語音識別官方文件
百度語音合成官方文件

注意事項:介面支援 POST 和 GET兩種方式,個人支援用post模式,因為get的話,如果get資料太長,會出現缺失的。
語音識別要求支援的語音格式
原始 PCM 的錄音引數必須符合 8k/16k 取樣率、16bit 位深、單聲道,支援的壓縮格式有:pcm(不壓縮)、wav、opus、amr、x-flac。
簡單說,語音引數必需要 8k/16k 取樣率、16bit 位深、單聲道,不然會出現內容和文字不相符的情況。


網上這類教程基本上都是Python urllib2實現的,這裡我使用requests實現。

import requests
import json
import base64
import wave
from pydub import AudioSegment ###需要安裝pydub、ffmpeg
import io

class BaiduRest:
	def __init__(self, cu_id, api_key, api_secert):
		# token認證的url
		self.token_url = "https://openapi.baidu.com/oauth/2.0/token"
		# 語音合成的resturl
		self.getvoice_url = "http://tsn.baidu.com/text2audio"
		# 語音識別的resturl
		self.upvoice_url = 'http://vop.baidu.com/server_api'
		self.cu_id = cu_id
		self.getToken(api_key, api_secert)
		return

	def getToken(self, api_key, api_secert):
		# 1.獲取token
		data={'grant_type':'client_credentials','client_id':api_key,'client_secret':api_secert}
		r=requests.post(self.token_url,data=data)
		Token=json.loads(r.text)
		self.token_str = Token['access_token']
		

	def getVoice(self, text, filename):
		# 2. 向Rest介面提交資料
		data={'tex':text,'lan':'zh','cuid':self.cu_id,'ctp':1,'tok':self.token_str}
		r=requests.post(self.getvoice_url,data=data,stream=True)
		voice_fp = open(filename,'wb')
		voice_fp.write(r.raw.read())
		# for chunk in r.iter_content(chunk_size=1024):
			# voice_fp.write(chunk)
		voice_fp.close()
		

	def getText(self, filename):
		# 2. 向Rest介面提交資料
		data = {"format":"wav","rate":16000, "channel":1,"token":self.token_str,"cuid":self.cu_id,"lan":"zh"}
		# 語音的一些引數
		wav_fp = open(filename,'rb')
		voice_data = wav_fp.read()
		data['len'] = len(voice_data)
		data['speech'] = base64.b64encode(voice_data).decode('utf-8')
		post_data = json.dumps(data)
		r=requests.post(self.upvoice_url,data=bytes(post_data,encoding="utf-8"))
		# 3.處理返回資料
		return r.text
	
	def ConvertToWav(self,filename,wavfilename):
		#先從本地獲取mp3的bytestring作為資料樣本
		fp=open("out.mp3",'rb')
		data=fp.read()
		fp.close()
		#主要部分
		aud=io.BytesIO(data)
		sound=AudioSegment.from_file(aud,format='mp3')
		raw_data = sound._data
		#寫入到檔案,驗證結果是否正確。
		l=len(raw_data)
		f=wave.open(wavfilename,'wb')
		f.setnchannels(1)
		f.setsampwidth(2)
		f.setframerate(16000)
		f.setnframes(l)
		f.writeframes(raw_data)
		f.close()
		return wavfilename

if __name__ == "__main__":
	#api_key和api_secert 自行編寫
	api_key = "" 
	api_secert = ""
	# 初始化
	bdr = BaiduRest("test_python", api_key, api_secert)
	# 將字串語音合成並儲存為out.mp3
	bdr.getVoice("問題,作為開發人員,你的職責是什麼,答按照工作進度和程式設計工作規範編寫系統中的關鍵模組,設計編寫詳細設計,配合測試員修改相應的程式,提供軟體的後期技術支援,進行編碼實現,程式碼走查,單元測試,產品交付,", "out.mp3")
	# 識別test.wav語音內容並顯示
	print(bdr.getText(bdr.ConvertToWav("out.mp3","test.wav")))

執行結果:

這裡寫圖片描述


設計思想:這裡先將語音合成,生成MP3格式,然後將這段語音轉換wav格式。然後再去語音識別。
在實際開發中,可以通過錄音,得到一段音訊檔案,然後再轉換wav格式。再去識別即可。
這裡涉及到pydub 的安裝。直接pip install pydub安裝即可。
ffmpeg安裝可以參考:ffmpeg安裝
ffmpeg下載一定是static
這裡寫圖片描述


總結:基本上都是呼叫百度的api介面就完成語音的識別和合成,但是值得注意的語音識別的要求和條件,就算得到wav格式,建議都轉換一下格式。不然識別上會與內容不同。

相關文章