基于Python構(gòu)建一個(gè)智能語(yǔ)音機(jī)器人
樹莓派準(zhǔn)備
包的安裝
Python 3 默認(rèn)安裝在 Raspberry Pi 操作系統(tǒng)上,并用于許多重要功能。干擾系統(tǒng) Python 安裝可能會(huì)導(dǎo)致操作系統(tǒng)出現(xiàn)問(wèn)題,因此,如果安裝第三方 Python 庫(kù),請(qǐng)使用正確的包管理工具,這一點(diǎn)很重要。
有兩種方法可以將庫(kù)安裝到默認(rèn)python
發(fā)行版中。您可以使用 apt
并安裝預(yù)配置的系統(tǒng)軟件包,也可以使用 pip
安裝未作為 Raspberry Pi OS 的一部分分發(fā)的軟件包。
例如,要安裝 Python 3 庫(kù)以支持 Raspberry Pi 構(gòu)建 HAT,您需要:
$ sudo apt install python3-build-hat
但是我們大概率會(huì)遇到包管理工具沖突的問(wèn)題
產(chǎn)生此錯(cuò)誤的原因是您嘗試將第三方包安裝到系統(tǒng) Python 中。對(duì)于 Python 用戶來(lái)說(shuō),一個(gè)長(zhǎng)期存在的實(shí)際問(wèn)題是操作系統(tǒng)包管理器(如 apt
)與 Python 特定的包管理工具(如 pip
)之間的沖突。這些沖突包括 Python 級(jí) API 不兼容和文件所有權(quán)沖突。
因此,從 Bookworm 開始,通過(guò) pip
安裝的軟件包必須使用 < /span>venv
。虛擬環(huán)境是一個(gè)容器,您可以在其中安全地安裝第三方模塊,這樣它們就不會(huì)干擾或破壞您的 Python 系統(tǒng)。
虛擬環(huán)境
要使用虛擬環(huán)境,您需要?jiǎng)?chuàng)建一個(gè)容器來(lái)存儲(chǔ)環(huán)境。您可以通過(guò)多種方法來(lái)完成此操作,具體取決于您想要使用 Python 的方式。您可以繼續(xù)的一種方法是為您創(chuàng)建的每個(gè) Python 項(xiàng)目創(chuàng)建一個(gè)新的虛擬環(huán)境。在這里,您將創(chuàng)建一個(gè)目錄來(lái)保存您自己的代碼以及虛擬環(huán)境目錄:
$ mkdir my_project $ cd my_project $ python -m venv (你的項(xiàng)目名)
如果您現(xiàn)在查看 my_project
目錄,您將看到一個(gè)名為 你的項(xiàng)目名
的目錄。
下一步,我們來(lái)通過(guò)指令: python -m venv --system-site-packages (你的項(xiàng)目名)
來(lái)創(chuàng)建虛擬環(huán)境。`
$ source (你的項(xiàng)目名)/bin/activate
(你的項(xiàng)目名) $
現(xiàn)在我們就可以使用 pip
進(jìn)行安裝了。
Pycharm準(zhǔn)備
所需要的包
以下是需要安裝的一些python依賴包
pip install speech_recognition
安裝speech_recognition依賴包, 用于錄音、生成wav文件pip install baidu-aip
安裝百度AI的sdk, 調(diào)用語(yǔ)音技術(shù)接口將音頻識(shí)別為文本數(shù)據(jù)返回pip install pygame
安裝pygame依賴包, 將文本信息以音頻的格式播放出來(lái)
編程邏輯
- 第一步: “拾音”
- 第二步: STT轉(zhuǎn)換
- 第三步: MOSS機(jī)器人回復(fù)文本
- 第四步: TTS轉(zhuǎn)換 + 語(yǔ)音合成
- 第五步: 外放語(yǔ)音
第一步: 拾音
首先我們測(cè)試錄音設(shè)備是否存在。我們?cè)跇漭山K端里面輸入指令:
arecord -l
會(huì)得到如下回復(fù):
這就是說(shuō)明我們的設(shè)備是存在的。我們也能在這里看到有幾個(gè)設(shè)備,可以選擇用哪個(gè)。
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è)置通道個(gè)數(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ù)時(shí)間,單位為秒)
-s,–sleep-min(設(shè)置最小休眠時(shí)間)
-M,–mmap(mmap流)
-N,–nonblock(設(shè)置為非塊模式)
-B,–buffer-time(緩沖持續(xù)時(shí)長(zhǎng),單位為微秒)
-v,–verbose(顯示PCM結(jié)構(gòu)和設(shè)置)
-I,–separate-channels(設(shè)置為每個(gè)通道一個(gè)單獨(dú)文件)
第二步:語(yǔ)音識(shí)別
通過(guò)百度語(yǔ)音識(shí)別服務(wù)(可以去官網(wǎng)上找一下,然后注冊(cè)應(yīng)用,獲得自己的 APP_ID
, APP_KEY
, SECRET_KEY
)
根據(jù)百度語(yǔ)音識(shí)別官方給的文檔,我們來(lái)對(duì)接一下這個(gè)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普通話(支持簡(jiǎn)單的英文識(shí)別)、1537普通話(純中文識(shí)別)、1737英語(yǔ)、1637粵語(yǔ)、1837四川話、1936普通話遠(yuǎn)場(chǎng) result = client.asr(voices, 'wav', 16000, {'dev_pid': 1537}) result_text = result["result"][0] print("我聽(tīng)到你說(shuō): " + result_text) return result_text except KeyError: print(result.get('err_no'))
第三步:機(jī)器人的思考回答
現(xiàn)在我們來(lái)等待機(jī)器人的回復(fù)。這里我們需要調(diào)用接口,我們現(xiàn)在使用的是 ERNIE-BOT-4.0
, 我們后續(xù)會(huì)嘗試一下調(diào)用 ChatGPT的API接口,就相當(dāng)于是把機(jī)器人的大腦換一下。
很簡(jiǎn)單,依據(jù) 文檔,我們來(lái)寫一下以下兩個(gè)函數(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)換 + 外放語(yǔ)音
接下來(lái),我們要把機(jī)器人回復(fù)給我們的文字轉(zhuǎn)換成語(yǔ)音
import os import sys def say(response): result = client.synthesis(f'{response}', 'zh', 1, { 'vol': 5, }) # 識(shí)別正確返回語(yǔ)音二進(jìn)制 錯(cuò)誤則返回dict 參照下面錯(cuò)誤碼 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')
第五步:整合
詳情請(qǐng)閱覽 gitee 倉(cāng)庫(kù)源碼
到此這篇關(guān)于基于Python構(gòu)建一個(gè)智能語(yǔ)音機(jī)器人的文章就介紹到這了,更多相關(guān)Python語(yǔ)音機(jī)器人內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)批量識(shí)別圖片文字并存為Excel
批量文字識(shí)別是Python辦公自動(dòng)化的基本操作,應(yīng)用在我們工作生活中的方方面面。本文主要以開源免費(fèi)的easyocr來(lái)實(shí)現(xiàn)批量識(shí)別圖片文字并存為Excel,感興趣的可以學(xué)習(xí)一下2022-06-06python實(shí)現(xiàn)sqlalchemy的使用概述
SQLAlchemy是Python中最有名的ORM工具,特點(diǎn)是操縱Python對(duì)象而不是SQL查詢,也就是在代碼層面考慮的是對(duì)象,而不是SQL,體現(xiàn)的是一種程序化思維,這樣使得Python程序更加簡(jiǎn)潔易懂,具體內(nèi)容詳情跟隨小編一起看看吧2021-08-08詳細(xì)聊聊為什么Python中0.2+0.1不等于0.3
最近在學(xué)習(xí)過(guò)程中發(fā)現(xiàn)在計(jì)算機(jī)JS時(shí)發(fā)現(xiàn)了一個(gè)非常有意思事,0.1+0.2的結(jié)果不是0.3,而是0.30000000000000004,下面這篇文章主要給大家介紹了關(guān)于為什么Python中0.2+0.1不等于0.3的相關(guān)資料,需要的朋友可以參考下2022-12-12