基于Python構(gòu)建一個智能語音機(jī)器人
樹莓派準(zhǔn)備
包的安裝
Python 3 默認(rèn)安裝在 Raspberry Pi 操作系統(tǒng)上,并用于許多重要功能。干擾系統(tǒng) Python 安裝可能會導(dǎo)致操作系統(tǒng)出現(xiàn)問題,因此,如果安裝第三方 Python 庫,請使用正確的包管理工具,這一點(diǎn)很重要。
有兩種方法可以將庫安裝到默認(rèn)python
發(fā)行版中。您可以使用 apt
并安裝預(yù)配置的系統(tǒng)軟件包,也可以使用 pip
安裝未作為 Raspberry Pi OS 的一部分分發(fā)的軟件包。
例如,要安裝 Python 3 庫以支持 Raspberry Pi 構(gòu)建 HAT,您需要:
$ sudo apt install python3-build-hat
但是我們大概率會遇到包管理工具沖突的問題
產(chǎn)生此錯誤的原因是您嘗試將第三方包安裝到系統(tǒng) Python 中。對于 Python 用戶來說,一個長期存在的實際問題是操作系統(tǒng)包管理器(如 apt
)與 Python 特定的包管理工具(如 pip
)之間的沖突。這些沖突包括 Python 級 API 不兼容和文件所有權(quán)沖突。
因此,從 Bookworm 開始,通過 pip
安裝的軟件包必須使用 < /span>venv
。虛擬環(huán)境是一個容器,您可以在其中安全地安裝第三方模塊,這樣它們就不會干擾或破壞您的 Python 系統(tǒng)。
虛擬環(huán)境
要使用虛擬環(huán)境,您需要創(chuàng)建一個容器來存儲環(huán)境。您可以通過多種方法來完成此操作,具體取決于您想要使用 Python 的方式。您可以繼續(xù)的一種方法是為您創(chuàng)建的每個 Python 項目創(chuàng)建一個新的虛擬環(huán)境。在這里,您將創(chuàng)建一個目錄來保存您自己的代碼以及虛擬環(huán)境目錄:
$ mkdir my_project $ cd my_project $ python -m venv (你的項目名)
如果您現(xiàn)在查看 my_project
目錄,您將看到一個名為 你的項目名
的目錄。
下一步,我們來通過指令: python -m venv --system-site-packages (你的項目名)
來創(chuàng)建虛擬環(huán)境。`
$ source (你的項目名)/bin/activate
(你的項目名) $
現(xiàn)在我們就可以使用 pip
進(jìn)行安裝了。
Pycharm準(zhǔn)備
所需要的包
以下是需要安裝的一些python依賴包
pip install speech_recognition
安裝speech_recognition依賴包, 用于錄音、生成wav文件pip install baidu-aip
安裝百度AI的sdk, 調(diào)用語音技術(shù)接口將音頻識別為文本數(shù)據(jù)返回pip install pygame
安裝pygame依賴包, 將文本信息以音頻的格式播放出來
編程邏輯
- 第一步: “拾音”
- 第二步: STT轉(zhuǎn)換
- 第三步: MOSS機(jī)器人回復(fù)文本
- 第四步: TTS轉(zhuǎn)換 + 語音合成
- 第五步: 外放語音
第一步: 拾音
首先我們測試錄音設(shè)備是否存在。我們在樹莓派終端里面輸入指令:
arecord -l
會得到如下回復(fù):
這就是說明我們的設(shè)備是存在的。我們也能在這里看到有幾個設(shè)備,可以選擇用哪個。
arecord -D "plughw:3" -f S16_LE -r16000 -d4 /home/admin/PyCode/WS_Project_MOSS/voices/myvoices.wav
參數(shù)解析
- -D 指定錄音設(shè)備,-D hw:1,0的意思就是選用card1(SmartIC Audio Device)設(shè)備錄音
- -c 設(shè)置通道個數(shù),-c2的意思就是錄制2通道的音頻文件
- -r 設(shè)置采樣率,-r16000的意思就是設(shè)置采樣率為16000
- -f 指定錄音格式,-fS16_LE的意思就是錄制S16_LE格式的音頻文件
-h,—help(幫助)
-V,–version(打印版本信息)
-l,–list-devices(列出全部聲卡和數(shù)字音頻設(shè)備)
-L,–list-pcms(列出全部PCM定義)
-D,–device(指定PCM設(shè)備名稱)
-q,–quiet(安靜模式)
-t,–file-type(文件類型voc,wav,raw或au)
-c,–channels(設(shè)置通道數(shù))
-f,–format(設(shè)置格式)
-r,–rate(設(shè)置頻率)
-d,–duration(設(shè)置持續(xù)時間,單位為秒)
-s,–sleep-min(設(shè)置最小休眠時間)
-M,–mmap(mmap流)
-N,–nonblock(設(shè)置為非塊模式)
-B,–buffer-time(緩沖持續(xù)時長,單位為微秒)
-v,–verbose(顯示PCM結(jié)構(gòu)和設(shè)置)
-I,–separate-channels(設(shè)置為每個通道一個單獨(dú)文件)
第二步:語音識別
通過百度語音識別服務(wù)(可以去官網(wǎng)上找一下,然后注冊應(yīng)用,獲得自己的 APP_ID
, APP_KEY
, SECRET_KEY
)
根據(jù)百度語音識別官方給的文檔,我們來對接一下這個API接口
from aip import AipSpeech import request import json # 配置一下API接口所需要的參數(shù) APP_ID = '___________' API_KEY = '________________' SECRET_KEY = '___________________' client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) path = 'voices/myvoices.wav' def listen(): # 讀取錄音文件 with open(path, 'rb') as fp: voices = fp.read() try: # 參數(shù)dev_pid:1536普通話(支持簡單的英文識別)、1537普通話(純中文識別)、1737英語、1637粵語、1837四川話、1936普通話遠(yuǎn)場 result = client.asr(voices, 'wav', 16000, {'dev_pid': 1537}) result_text = result["result"][0] print("我聽到你說: " + result_text) return result_text except KeyError: print(result.get('err_no'))
第三步:機(jī)器人的思考回答
現(xiàn)在我們來等待機(jī)器人的回復(fù)。這里我們需要調(diào)用接口,我們現(xiàn)在使用的是 ERNIE-BOT-4.0
, 我們后續(xù)會嘗試一下調(diào)用 ChatGPT的API接口,就相當(dāng)于是把機(jī)器人的大腦換一下。
很簡單,依據(jù) 文檔,我們來寫一下以下兩個函數(shù)。
def get_access_token(): """ 使用 API Key,Secret Key 獲取access_token,替換下列應(yīng)用API Key、應(yīng)用Secret Key """ url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=你的信息&client_secret=你的信息" payload = json.dumps("") headers = { 'Content-Type': 'application/json', 'Accept': 'application/json' } response = requests.request("POST", url, headers=headers, data=payload) return response.json().get("access_token") def bot(question): # url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token=" + get_access_token() url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token=24.3990f1717b7636be7b8a4de154a49b5a.2592000.1705210204.282335-45017968" payload = json.dumps({ "messages": [ { "role": "user", "content": f"{question}" }] }) headers = { 'Content-Type': 'application/json' } response = requests.request("POST", url, headers=headers, data=payload) temp = json.loads(response.text) print(temp.get('result')) return temp.get('result')
第四步:TTS轉(zhuǎn)換 + 外放語音
接下來,我們要把機(jī)器人回復(fù)給我們的文字轉(zhuǎn)換成語音
import os import sys def say(response): result = client.synthesis(f'{response}', 'zh', 1, { 'vol': 5, }) # 識別正確返回語音二進(jìn)制 錯誤則返回dict 參照下面錯誤碼 if not isinstance(result, dict): with open('robot/audio.mp3', 'wb') as f: f.write(result) os.system('sudo aplay /home/admin/PyCode/WS_Project_MOSS/robot/audio.mp3')
第五步:整合
詳情請閱覽 gitee 倉庫源碼
到此這篇關(guān)于基于Python構(gòu)建一個智能語音機(jī)器人的文章就介紹到這了,更多相關(guān)Python語音機(jī)器人內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實現(xiàn)批量識別圖片文字并存為Excel
批量文字識別是Python辦公自動化的基本操作,應(yīng)用在我們工作生活中的方方面面。本文主要以開源免費(fèi)的easyocr來實現(xiàn)批量識別圖片文字并存為Excel,感興趣的可以學(xué)習(xí)一下2022-06-06詳細(xì)聊聊為什么Python中0.2+0.1不等于0.3
最近在學(xué)習(xí)過程中發(fā)現(xiàn)在計算機(jī)JS時發(fā)現(xiàn)了一個非常有意思事,0.1+0.2的結(jié)果不是0.3,而是0.30000000000000004,下面這篇文章主要給大家介紹了關(guān)于為什么Python中0.2+0.1不等于0.3的相關(guān)資料,需要的朋友可以參考下2022-12-12