基於python實現百度語音識別和圖靈對話
阿新 • • 發佈:2020-11-04
圖例如下
https://github.com/Dongvdong/python_Smartvoice
- 上電後,只要周圍聲音超過 2000,開始錄音5S
- 錄音上傳百度識別,並返回結果文字輸出
- 繼續等待,周圍聲音是否超過2000,沒有就等待。
- 點用電腦API語音互動
程式碼如下
# -*- coding: utf-8 -*- # 樹莓派 from pyaudio import PyAudio,paInt16 import numpy as np from datetime import datetime import wave import time import requests#匯入requests庫 import urllib,urllib.request,pycurl import base64 import json import os import sys from imp import reload # 呼叫電腦API生成語音互動 import speech import win32api import os import sys import time import win32con reload(sys) #sys.setdefaultencoding( "utf-8" ) #一些全域性變數 save_count = 0 save_buffer = [] t = 0 sum = 0 time_flag = 0 flag_num = 0 filename = '' duihua = '1' def getHtml(url): html= requests.get(url) # html.encoding = 'utf-8'#防止中文亂碼 return html.text def get_token(): apiKey = "AxXDYEN27Ks9XHocsGmCEdPm" secretKey = "61cd52759f4d704d91c155a22ff7183d" auth_url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=" + apiKey + "&client_secret=" + secretKey; res = requests.get(auth_url) #res.encoding = 'utf-8'#防止中文亂碼 #print (res.text) return json.loads(res.text)['access_token'] def dump_res(buf):#輸出百度語音識別的結果 global duihua #print ("字串型別") #print (buf) a = eval(buf) #print (type(a)) if a['err_msg']=='success.': #print (a['result'][0])#終於搞定了,在這裡可以輸出,返回的語句 duihua = a['result'][0] print ("我:"+duihua) def use_cloud(token):#進行合成 fp = wave.open(filename,'rb') nf = fp.getnframes() f_len = nf * 2 audio_data = fp.readframes(nf) cuid = "9120612" #產品id srv_url = 'http://vop.baidu.com/server_api' + '?cuid=' + cuid + '&token=' + token http_header = [ 'Content-Type: audio/pcm; rate=8000','Content-Length: %d' % f_len ] c = pycurl.Curl() c.setopt(pycurl.URL,str(srv_url)) #curl doesn't support unicode #c.setopt(c.RETURNTRANSFER,1) c.setopt(c.HTTPHEADER,http_header) #must be list,not dict c.setopt(c.POST,1) c.setopt(c.CONNECTTIMEOUT,30) c.setopt(c.TIMEOUT,30) c.setopt(c.WRITEFUNCTION,dump_res) c.setopt(c.POSTFIELDS,audio_data) c.setopt(c.POSTFIELDSIZE,f_len) c.perform() #pycurl.perform() has no return val # 將data中的資料儲存到名為filename的WAV檔案中 def save_wave_file(filename,data): wf = wave.open(filename,'wb') wf.setnchannels(1) wf.setsampwidth(2) wf.setframerate(SAMPLING_RATE) wf.writeframes(b"".join(data)) wf.close() NUM_SAMPLES = 2000 # pyAudio內部快取的塊的大小 SAMPLING_RATE = 8000 # 取樣頻率 LEVEL = 1500 # 聲音儲存的閾值 COUNT_NUM = 20 # NUM_SAMPLES個取樣之內出現COUNT_NUM個大於LEVEL的取樣則記錄聲音 SAVE_LENGTH = 8 # 聲音記錄的最小長度:SAVE_LENGTH * NUM_SAMPLES 個取樣 exception_on_overflow=False # 開啟聲音輸入pyaudio物件 pa = PyAudio() stream = pa.open(format=paInt16,channels=1,rate=SAMPLING_RATE,input=True,frames_per_buffer=NUM_SAMPLES) token = get_token()#獲取token key = '35ff2856b55e4a7f9eeb86e3437e23fe' api = 'http://www.tuling123.com/openapi/api?key=' + key + '&info=' while(True): # 讀入NUM_SAMPLES個取樣 string_audio_data = stream.read(NUM_SAMPLES,False); # 將讀入的資料轉換為陣列 audio_data = np.fromstring(string_audio_data,dtype=np.short) # 計算大於LEVEL的取樣的個數 large_sample_count = np.sum( audio_data > LEVEL ) temp = np.max(audio_data) if temp > 2000 and t == 0: t = 1#開啟錄音 print ("---------主人我在聽你說!(5S)----------") begin = time.time() # print (temp) if t: #print (np.max(audio_data)) if np.max(audio_data)<1000: sum += 1 # print (sum) end = time.time() if end-begin>5: time_flag = 1 # print ("五秒到了,準備結束") # 如果個數大於COUNT_NUM,則至少儲存SAVE_LENGTH個塊 if large_sample_count > COUNT_NUM: save_count = SAVE_LENGTH else: save_count -= 1 if save_count < 0: save_count = 0 if save_count > 0: # 將要儲存的資料存放到save_buffer中 save_buffer.append(string_audio_data ) else: # 將save_buffer中的資料寫入WAV檔案,WAV檔案的檔名是儲存的時刻 #if time_flag: if len(save_buffer) > 0 or time_flag: #filename = datetime.now().strftime("%Y-%m-%d_%H_%M_%S") + ".wav"#原本是用時間做名字 filename = str(flag_num)+".wav" flag_num += 1 save_wave_file(filename,save_buffer) save_buffer = [] t = 0 sum =0 time_flag = 0 # print (filename,"儲存成功正在進行語音識別") use_cloud(token) # print (duihua) info = duihua duihua = "" request = api + str(info) response = getHtml(request) # print ( "-----1-----") dic_json = json.loads(response) a = dic_json['text'] unicodestring = a # 將Unicode轉化為普通Python字串:"encode" utf8string = unicodestring.encode("utf-8") print ("科塔娜:"+str(a)) # 電腦說話 speech.say(str(a)) url = "http://tsn.baidu.com/text2audio?tex="+dic_json['text']+"&lan=zh&per=0&pit=1&spd=7&cuid=7519663&ctp=1&tok=25.41bf315625c68b3e947c49b90788532d.315360000.1798261651.282335-9120612" os.system('mpg123 "%s"'%(url))
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。