一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

單片機(jī)學(xué)習(xí):第一篇 基于Python的樹莓派語音助手

 新用戶79878317 2022-12-24 發(fā)布于河南

title: 單片機(jī)學(xué)習(xí):第一篇 基于Python的樹莓派語音助手
tags: 樹莓派,python,語音助手,百度AIP

樹莓派功能十分強(qiáng)大,作為一個(gè)微型電腦,獨(dú)特的陣腳設(shè)計(jì)使得樹莓派開發(fā)的自定義程度非常高。本篇博客通過使用python語言,封裝一個(gè)簡單的語音助手程序。制作一個(gè)語音助手你需要如下物品:
``` 
1:一個(gè)樹莓派(3代、4代皆可)
2:免驅(qū)的usb聲卡(聲卡需接在樹莓派usb接口)
3:麥克風(fēng)(接在聲卡上)
4:有線音響(音響可連在聲卡上,也可連在樹莓派的3.5mm接口上)
(樹莓派播放設(shè)備默認(rèn)使用3.5mm接口,具體過程需要自定義播放設(shè)備)
```
如果要設(shè)置usb聲卡輸出,參考配置聲卡教程:https://www.jianshu.com/p/f414b85b9e71,如果使用默認(rèn)3.5mm接口輸出可以忽略。
設(shè)計(jì)語音助手有如下過程:錄音、語音識別、圖靈機(jī)器人對話、語音合成,以下對各個(gè)過程進(jìn)行介紹。

一、pyaudio錄音


使用python語言進(jìn)行錄音,主要是將說話者聲音輸出成一段音頻文件。對于python來說,這很容易。通過引用pyaudio庫,可以進(jìn)行錄音、播放、生成wav文件等。
首先,我們在樹莓派上需要下載pyaudio庫: ```pip3 install pyaudio```
在pyaudio的官網(wǎng)http://people.csail./hubert/pyaudio/介紹上有對pyaudio的詳細(xì)介紹,以官網(wǎng)示例:
創(chuàng)建一名為rec的python文件 ```sudo nano rec.py```

  1. import RPi.GPIO as GPIO
  2. import pyaudio
  3. import wave
  4. import os
  5. import sys
  6. def rec_fun():
  7.     # 隱藏錯(cuò)誤消息,因?yàn)闀?huì)有一堆ALSA和JACK錯(cuò)誤消息,但其實(shí)能正常錄音
  8.     # os.close(sys.stderr.fileno())
  9.     BUTT = 26    # 開始錄音的按鈕:一邊接GPIO26,一邊接地
  10.     GPIO.setmode(GPIO.BCM)
  11.     # 設(shè)GPIO26腳為輸入腳,電平拉高,也就是說26腳一旦讀到低電平,說明按了按鈕
  12.     GPIO.setup(BUTT, GPIO.IN, pull_up_down = GPIO.PUD_UP)
  13.     # wav文件是由若干個(gè)CHUNK組成的,CHUNK我們就理解成數(shù)據(jù)包或者數(shù)據(jù)片段。
  14.     CHUNK = 512 
  15.     FORMAT = pyaudio.paInt16  # pyaudio.paInt16表示我們使用量化位數(shù) 16位來進(jìn)行錄音
  16.     RATE = 16000  # 采樣率1.6k。
  17.     WAVE_OUTPUT_FILENAME = 'command.wav'
  18.     print('請按住按鈕開始錄音...')
  19.     GPIO.wait_for_edge(BUTT, GPIO.FALLING)
  20.     # To use PyAudio, first instantiate PyAudio using pyaudio.PyAudio(), which sets up the portaudio system.
  21.     p = pyaudio.PyAudio()
  22.     stream = p.open(format = FORMAT,
  23.                     channels = 1,    # cloud speecAPI只支持單聲道
  24.                     rate = RATE,
  25.                     input = True,
  26.                     frames_per_buffer = CHUNK)
  27.     print('錄音中...')
  28.     frames = []
  29.     # 按住按鈕錄音,放開時(shí)結(jié)束
  30.     while GPIO.input(BUTT) == 0:
  31.         data = stream.read(CHUNK)
  32.         frames.append(data)
  33.     print('錄音完成,輸出文件:' + WAVE_OUTPUT_FILENAME + '\n')
  34.     stream.stop_stream()
  35.     stream.close()
  36.     p.terminate()
  37.     wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
  38.     wf.setnchannels(1)
  39.     wf.setsampwidth(p.get_sample_size(FORMAT))    # Returns the size (in bytes) for the specified sample format.
  40.     wf.setframerate(RATE)
  41.     wf.writeframes(b''.join(frames))
  42.     wf.close()
  43.     return
  44. # 可以直接運(yùn)行rec.py進(jìn)行測試,同時(shí)保證該文件import時(shí)不會(huì)自動(dòng)運(yùn)行
  45. if __name__ == '__main__':
  46.     rec_fun()

通過樹莓派一 點(diǎn)亮LED燈:https://www./2020/06/21/raspberry/?from=timeline,我們對樹莓派的陣腳已經(jīng)有了大概了解。
按鈕錄音,是通過按鈕控制陣腳高低電平。在上述代碼里引用```import RPi.GPIO as GPIO```,選擇26號輸出腳和GND。
執(zhí)行后按住按鈕開始錄音,會(huì)在rec.py同目錄下生成command.wav文件。

 二、語音識別


我選擇了百度AIP平臺,使用其語音識別技術(shù)。(當(dāng)然也可使用Google、科大訊飛等平臺)
 1. 申請百度AIP賬號與應(yīng)用
在百度AI開發(fā)平臺:https://ai.baidu.com/?track=cp:aipinzhuan|pf:pc|pp:AIpingtai|pu:title|ci:|kw:10005792注冊賬號,再在控制臺創(chuàng)建一個(gè)新應(yīng)用
2. python調(diào)用百度AIP
官網(wǎng)文檔中有詳細(xì)使用語音識別技術(shù),包括python的示例。首先導(dǎo)入AipSpeech, 即百度AI語音識別的Python SDK客戶端(```pip3 install baidu-aip```)。附上代碼如下:

  1. from aip import AipSpeech
  2. import os
  3. APP_ID = '你的IDID'
  4. API_KEY = '你的KEYKEY'
  5. SECRET_KEY = '你的secret_key'
  6. # 新建一個(gè) AipSpeech
  7. client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
  8. # 讀取文件
  9. def get_file_content(filePath):   #filePath待讀取文件名
  10.     with open(filePath, 'rb') as fp:
  11.         return fp.read()
  12. # 語音識別
  13. def stt(filename):
  14.     # 識別本地文件
  15.     result = client.asr(get_file_content(filename),
  16.                         'wav',
  17.                         16000,
  18.                         {'dev_pid': 1537,}      # dev_pid 參數(shù)表示識別的語 言類型 1537表示普通話 
  19.                         )
  20.     print (result)
  21.     return result['result']
  22. # 解析返回值,打印語音識別的結(jié)果 
  23.     if result['err_msg']=='success.': 
  24.         word = result['result'][0].encode('utf-8')       # utf-8 編碼 
  25.         if word!='': 
  26.             if word[len(word)-3:len(word)]==',': 
  27.                 print (word[0:len(word)-3]) 
  28.                 with open('demo.txt','wb') as f: 
  29.                     f.write(word[0:len(word)-3]) 
  30.             else: 
  31.                 print (word.decode('utf-8').encode('gbk')) 
  32.                 with open('demo.txt','wb') as f: 
  33.                     f.write(word) 
  34.                 f.close() 
  35.         else: 
  36.             print ('音頻文件不存在或格式錯(cuò)誤') 
  37.     else: 
  38.         print ('錯(cuò)誤') 
  39. # main 函數(shù) 識別本地錄音文件 yahboom.wav 
  40. if __name__ == '__main__':
  41.     stt('command.wav')   # command.wav為待讀取文件,請?zhí)鎿Q

 三、與圖靈機(jī)器人對話


使用圖靈機(jī)器人基本原理就是使用urllib.request模塊,向接口地址發(fā)送HTTP POST請求,請求中加入了聊天內(nèi)容。(返回內(nèi)容是一個(gè)字典)
首先我們需要申請一個(gè)機(jī)器人:官網(wǎng)入口:http://www./
python代碼參考:

  1. import json
  2. import urllib.request
  3. def chat(question):
  4.     api_url = 'http://openapi./openapi/api/v2'
  5.     text_input = question
  6.     req = {
  7.         'perception':
  8.         {
  9.             'inputText':
  10.             {
  11.                 'text': text_input
  12.             },
  13.             'selfInfo':
  14.             {
  15.                 'location':
  16.                 {
  17.                     'city': 'xxx',
  18.                     'province': 'xxx',
  19.                     'street': 'xxx'
  20.                 }
  21.             }
  22.         },
  23.         'userInfo': 
  24.         {
  25.             'apiKey': 'xxxxxxxxxxxxx',    #你的key
  26.             'userId': '123'         #唯一的標(biāo)識,自選即可
  27.         }
  28.     }
  29.     # 將字典格式的req轉(zhuǎn)為utf8編碼的字符串
  30.     req = json.dumps(req).encode('utf8')
  31.     print('\n' + '正在調(diào)用圖靈機(jī)器人API...')
  32.     http_post = urllib.request.Request(api_url, data=req, headers={'content-type': 'application/json'})
  33.     response = urllib.request.urlopen(http_post)    
  34.     print('得到回答,輸出為字典格式:')
  35.     response_str = response.read().decode('utf8')
  36.     response_dic = json.loads(response_str)
  37.     intent_code = response_dic['intent']['code'] 
  38.     # 返回網(wǎng)頁類的輸出方式
  39.     if(intent_code == 10023):
  40.         results_url = response_dic['results'][0]['values']['url']
  41.         results_text = response_dic['results'][1]['values']['text']
  42.         with open('result.txt','w') as f:
  43.             f.write(results_text)  # 自帶文件關(guān)閉功能,不需要再寫f.close()
  44.         answer = {'code': intent_code, 'text': results_text, 'url':results_url}
  45.         print(answer)
  46.         return(answer)
  47.     # 一般的輸出方式
  48.     else:
  49.         results_text = response_dic['results'][0]['values']['text']
  50.         answer = {'code': intent_code, 'text': results_text}
  51.         with open('result.txt','w') as f:
  52.             f.write(results_text)  # 自帶文件關(guān)閉功能,不需要再寫f.close()
  53.         print(answer)
  54.         return(answer)
  55. if __name__ == '__main__':
  56.     with open('demo.txt', 'r',encoding='UTF-8') as f:
  57.         text  = f.read()  # 讀取文件
  58.     eg_question = text
  59.     chat(eg_question)

 四、語音合成


我同樣選擇了百度的語音合成(注意,AI平臺新建應(yīng)用后,語音合成技術(shù)需要自行領(lǐng)用。語音識別的key與合成的key不一樣,使用請注意)。示例文檔自行參考,提供參考代碼:
 

  1. #encoding:utf8
  2. from aip import AipSpeech
  3. import os
  4. ''' 你的 APPID AK SK '''
  5. APP_ID = 'xxxxx'
  6. API_KEY = 'xxxxxxxxxxxxxxxx'
  7. SECRET_KEY = 'chMdMAS0acD7sPS6FhP3a3iOijU7wMVl'
  8. def speak(text_content):
  9.     client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
  10.     texts = text_content
  11.     result = client.synthesis(texts , options={'vol':5})
  12.     print('\n' + '正在調(diào)用語音合成API...')
  13.     if not isinstance(result,dict):
  14.         with open('answer.mp3','wb') as f:
  15.             f.write(result)
  16.     else:print(result)
  17.     print('播放音頻中...')
  18.     print('以下均為mplayer的輸出內(nèi)容\n')
  19.     os.system('mplayer answer.mp3')
  20.     return
  21. if __name__ == '__main__':   
  22.     with open('result.txt', 'rb') as f: # 打開文件
  23.          text  = f.read()  # 讀取文件       
  24.     eg_text_content = text
  25.     speak(eg_text_content)         


 五、封裝


至此,我們的錄音、識別、對話、合成已經(jīng)完成了,開始對這四個(gè)py文件進(jìn)行封裝。
在封裝時(shí),增加一個(gè)獲取獲取歌曲直鏈url1.py文件。
一個(gè)簡單的if else 完成了圖靈機(jī)器人對話到在線放歌的切換。
當(dāng)然,讀者還可以進(jìn)一步完善,例如實(shí)現(xiàn)與圖靈機(jī)器人的多次對話直到退出。

需要參考我的全部代碼,可以去我的資源下載

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    欧美日韩国产成人高潮| 黄色三级日本在线观看| 国产欧美一区二区三区精品视| 在线免费国产一区二区| 亚洲精品一区二区三区免| 欧美午夜性刺激在线观看| 日韩人妻av中文字幕| 麻豆91成人国产在线观看| 五月激情综合在线视频| 亚洲欧美中文字幕精品| 欧美国产精品区一区二区三区| 久久午夜福利精品日韩| 日韩精品毛片视频免费看| 在线观看国产成人av天堂野外| 色婷婷国产熟妇人妻露脸| 好吊妞视频这里有精品| 国产中文字幕一区二区| 中文字幕不卡欧美在线| 国产一区麻豆水好多高潮| 久热人妻中文字幕一区二区| 日本东京热视频一区二区三区| 国产综合一区二区三区av| 欧美区一区二区在线观看| 日韩免费av一区二区三区| 亚洲美女国产精品久久| 中文字幕亚洲精品在线播放| 人妻中文一区二区三区| 国产精品一区二区视频大全| 中文字幕乱子论一区二区三区| 欧美日韩有码一二三区| 最好看的人妻中文字幕| 色哟哟哟在线观看视频| 日本99精品在线观看| 亚洲av一区二区三区精品| 日本一二三区不卡免费| 91老熟妇嗷嗷叫太91| 国产av乱了乱了一区二区三区| 狠狠干狠狠操在线播放| 国产户外勾引精品露出一区| 国产偷拍盗摄一区二区| 久久精品亚洲情色欧美|