基于python實(shí)現(xiàn)百度語(yǔ)音識(shí)別和圖靈對(duì)話
圖例如下
https://github.com/Dongvdong/python_Smartvoice
上電后,只要周圍聲音超過(guò) 2000,開始錄音5S 錄音上傳百度識(shí)別,并返回結(jié)果文字輸出 繼續(xù)等待,周圍聲音是否超過(guò)2000,沒有就等待。 點(diǎn)用電腦API語(yǔ)音交互代碼如下
# -*- coding: utf-8 -*-# 樹莓派from pyaudio import PyAudio, paInt16import numpy as npfrom datetime import datetimeimport waveimport timeimport requests#導(dǎo)入requests庫(kù)import urllib, urllib.request, pycurlimport base64import jsonimport osimport sysfrom imp import reload # 調(diào)用電腦API生成語(yǔ)音交互import speechimport win32apiimport osimport sysimport timeimport win32con reload(sys) #sys.setdefaultencoding( 'utf-8' )#一些全局變量save_count = 0save_buffer = []t = 0sum = 0time_flag = 0flag_num = 0filename = ’’duihua = ’1’def getHtml(url): html= requests.get(url) # html.encoding = ’utf-8’#防止中文亂碼 return html.textdef 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):#輸出百度語(yǔ)音識(shí)別的結(jié)果 global duihua #print ('字符串類型') #print (buf) a = eval(buf) #print (type(a)) if a[’err_msg’]==’success.’: #print (a[’result’][0])#終于搞定了,在這里可以輸出,返回的語(yǔ)句 duihua = a[’result’][0] print ('我:'+duihua)def use_cloud(token):#進(jìn)行合成 fp = wave.open(filename, ’rb’) nf = fp.getnframes() f_len = nf * 2 audio_data = fp.readframes(nf) cuid = '9120612' #產(chǎn)品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中的數(shù)據(jù)保存到名為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內(nèi)部緩存的塊的大小SAMPLING_RATE = 8000 # 取樣頻率LEVEL = 1500 # 聲音保存的閾值COUNT_NUM = 20 # NUM_SAMPLES個(gè)取樣之內(nèi)出現(xiàn)COUNT_NUM個(gè)大于LEVEL的取樣則記錄聲音SAVE_LENGTH = 8 # 聲音記錄的最小長(zhǎng)度:SAVE_LENGTH * NUM_SAMPLES 個(gè)取樣exception_on_overflow=False# 開啟聲音輸入pyaudio對(duì)象pa = PyAudio()stream = pa.open(format=paInt16, channels=1, rate=SAMPLING_RATE, input=True,frames_per_buffer=NUM_SAMPLES)token = get_token()#獲取tokenkey = ’35ff2856b55e4a7f9eeb86e3437e23fe’api = ’http://www.tuling123.com/openapi/api?key=’ + key + ’&info=’while(True): # 讀入NUM_SAMPLES個(gè)取樣 string_audio_data = stream.read(NUM_SAMPLES,False); # 將讀入的數(shù)據(jù)轉(zhuǎn)換為數(shù)組 audio_data = np.fromstring(string_audio_data, dtype=np.short) # 計(jì)算大于LEVEL的取樣的個(gè)數(shù) large_sample_count = np.sum( audio_data > LEVEL ) temp = np.max(audio_data) if temp > 2000 and t == 0: t = 1#開啟錄音 print ('---------主人我在聽你說(shuō)!(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 ('五秒到了,準(zhǔn)備結(jié)束') # 如果個(gè)數(shù)大于COUNT_NUM,則至少保存SAVE_LENGTH個(gè)塊 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: # 將要保存的數(shù)據(jù)存放到save_buffer中 save_buffer.append(string_audio_data ) else: # 將save_buffer中的數(shù)據(jù)寫入WAV文件,WAV文件的文件名是保存的時(shí)刻 #if time_flag: if len(save_buffer) > 0 or time_flag:#filename = datetime.now().strftime('%Y-%m-%d_%H_%M_%S') + '.wav'#原本是用時(shí)間做名字filename = str(flag_num)+'.wav'flag_num += 1save_wave_file(filename, save_buffer)save_buffer = []t = 0sum =0time_flag = 0 # print (filename, '保存成功正在進(jìn)行語(yǔ)音識(shí)別')use_cloud(token) # print (duihua)info = duihuaduihua = ''request = api + str(info)response = getHtml(request) # print ( '-----1-----')dic_json = json.loads(response) a = dic_json[’text’] unicodestring = a# 將Unicode轉(zhuǎn)化為普通Python字符串:'encode'utf8string = unicodestring.encode('utf-8') print ('科塔娜:'+str(a)) # 電腦說(shuō)話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))
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. JSP的Cookie在登錄中的使用2. asp(vbscript)中自定義函數(shù)的默認(rèn)參數(shù)實(shí)現(xiàn)代碼3. HTML5 Canvas繪制圖形從入門到精通4. 使用Spry輕松將XML數(shù)據(jù)顯示到HTML頁(yè)的方法5. 利用CSS3新特性創(chuàng)建透明邊框三角6. ASP基礎(chǔ)知識(shí)VBScript基本元素講解7. 詳解CSS偽元素的妙用單標(biāo)簽之美8. XHTML 1.0:標(biāo)記新的開端9. php網(wǎng)絡(luò)安全中命令執(zhí)行漏洞的產(chǎn)生及本質(zhì)探究10. XML入門的常見問(wèn)題(四)
