使用 Ansible 在樹(shù)莓派上部署 Mycroft AI 語(yǔ)音助手
使用本文中的這些 Ansible 劇本可以幫你獲得更優(yōu)的 Mycroft AI 體驗(yàn)。
Mycroft AI 是一款虛擬助手應(yīng)用程序,可以響應(yīng)語(yǔ)音請(qǐng)求并完成相應(yīng)的任務(wù),比如在互聯(lián)網(wǎng)上搜索你需要的某些信息,或者下載你喜歡的博客等等。這是一款優(yōu)秀的開(kāi)源軟件,不同于那些收集個(gè)人數(shù)據(jù)業(yè)務(wù)的公司的同款軟件,Mycroft AI 注重于保護(hù)隱私以及提供平臺(tái)靈活性。
Mycroft AI 使用 python 開(kāi)發(fā),可以安裝于不同的硬件平臺(tái)上。家喻戶(hù)曉的樹(shù)莓派便是一個(gè)非常熱門(mén)的運(yùn)行語(yǔ)音助手的硬件方案(不過(guò)不是唯一的方案)。方便的是,Mycroft 為樹(shù)莓派提供了 Picroft 鏡像,雖然目前 Picroft 還有一些限制,比如不支持 64 位系統(tǒng),不過(guò)不能阻止它成為一種優(yōu)秀的解決方案。
樹(shù)莓派 4,我選擇的目標(biāo)平臺(tái)
樹(shù)莓派在 Mycroft 社區(qū)中非常受歡迎,因?yàn)槠湫詢(xún)r(jià)比高,在教育行業(yè)中有著巨大的優(yōu)勢(shì),并且由于 Mycroft 提供的便捷功能以及樹(shù)莓派本身易于訪問(wèn)的輸入/輸出(GPIO)引腳等,為樹(shù)莓派提供了有趣的擴(kuò)展可能(比如,提供 喚醒詞 LED GPIO 能力)。
樹(shù)莓派 4B 具有足夠的 CPU 算力以及內(nèi)存來(lái)平穩(wěn)運(yùn)行 Mycroft。我使用的是 8G 內(nèi)存的樹(shù)莓派4B,運(yùn)行 Raspberry Pi OS Bullseye 64-bit 系統(tǒng),你可以從 RaspberryPi.org 網(wǎng)站下載該系統(tǒng)鏡像文件。
自動(dòng)化這件事
構(gòu)建你自己的 Mycroft AI 系統(tǒng),必須要注意一些細(xì)節(jié)問(wèn)題。根據(jù)我(一年以來(lái))的初步經(jīng)驗(yàn),以下羅列了一些重要的技術(shù)細(xì)節(jié)點(diǎn):
- 音頻輸出(揚(yáng)聲器配置)
- 音頻輸入(麥克風(fēng)配置)
- 麥克風(fēng)質(zhì)量(以購(gòu)買(mǎi)的實(shí)際硬件為準(zhǔn))
- 喚醒詞響應(yīng)(比如打招呼 “嘿,Mycroft”)
- 響應(yīng)延遲(比如提問(wèn) “天氣怎么樣”)
這些并不是 Mycroft AI 的問(wèn)題(LCTT 譯注:難道軟件平臺(tái)就沒(méi)有處理延時(shí)問(wèn)題?),它們只能是你在選擇硬件和配置操作時(shí)必須牢記關(guān)心的事情。樹(shù)莓派本身能夠運(yùn)行 Mycroft AI,但有一些配置需要額外的注意下:
- CPU 調(diào)度器
- SD 卡性能
- PulseAudio 配置
- 網(wǎng)絡(luò)延遲
我做了大量的研究和實(shí)踐來(lái)解決上面列出這些令人頭疼的注意點(diǎn),最終我實(shí)現(xiàn)了我的“終極”目標(biāo) —— 最流暢的體驗(yàn)!
Ansible 雪中送炭
我已經(jīng)摸索出了最流暢的體驗(yàn)配置,但是如何確保在任何樹(shù)莓派 4 板子上都能不遺漏每一個(gè)設(shè)置細(xì)節(jié),然后達(dá)到重新部署這種流暢性體驗(yàn)的目標(biāo)呢?
Ansible 能幫助你實(shí)現(xiàn)。Ansible 在設(shè)計(jì)上是冪等設(shè)計(jì),這意味著它僅在需要時(shí)響應(yīng)更改的請(qǐng)求。如果一切配置正確,Ansible 不會(huì)改變?nèi)魏问虑?。這便是冪等設(shè)計(jì)的優(yōu)美之處。
為了達(dá)到這一目的,我使用了兩種 Ansible 場(chǎng)景角色工具:
- 一個(gè)用于配置和調(diào)整樹(shù)莓派
- 一個(gè)用于安裝和配置 Mycroft AI
Ansible prepi 角色
Ansible prepi role 應(yīng)用了一些配置,以便讓樹(shù)莓派 4B 發(fā)揮更佳的性能以及為安裝 Mycroft 做前提準(zhǔn)備。
- 更新 Raspberry Pi OS 至最新版本
- 添加 Debian backports 倉(cāng)庫(kù)
- 使用 next 分支更新固件,該分支支持 5.15 版本內(nèi)核以及邊緣固件
- 使用測(cè)試版本更新 EEPROM,該版本支持邊緣功能
- 設(shè)置
initial_turbo
用來(lái)加速啟動(dòng)過(guò)程 - 將樹(shù)莓派超頻至 2GHz
- 在 RAMDisck 上掛載
/tmp
- 優(yōu)化
/
分區(qū)掛載選項(xiàng),提升 SD 卡讀/寫(xiě)性能 - 管理 I2C、SPI、UART 接口
- 設(shè)置 CPU 控制器至避免在空間內(nèi)核函數(shù)之間發(fā)生上下文切換的模式,以便提升性能
- 安裝和配置 PulseAduio(非系統(tǒng)范圍)
- 新固件或者 EEPROM 安裝后重啟樹(shù)莓派
Ansible mycroft 角色
Ansible mycroft role 基于腳本 dev_setup.sh
從 Github 倉(cāng)庫(kù)獲取并安裝和配置 Mycroft AI,該腳本是 Mycroft 核心團(tuán)隊(duì)提供。
- 需要準(zhǔn)備 Python3 環(huán)境
- 系統(tǒng)集成環(huán)境
- 額外的安裝技能
- 安裝 Boto3、py_mplayer、pyopenssl 庫(kù)
- 支持 IPC 的 RAMDisck
- 支持文件配置
- PulseAudio 優(yōu)化
- 安全的 Mycroft 消息總線 websocket
我利用 Ansible 劇本 來(lái)協(xié)調(diào)上面兩個(gè)角色的使用。
個(gè)人配置需求
下面列舉了一些個(gè)人配置的需求:
- 能上網(wǎng)的樹(shù)莓派 4B 板子(或者更新的板子)
- Raspberry Pi OS 64-bit
- Ansible 2.9(或者更新版本)
- 可正常工作的 SSH
推薦使用 Etcher 來(lái)燒錄 Raspberry Pi OS 鏡像至 SD 卡,你也可以使用你選擇的鏡像燒錄工具。
我將樹(shù)莓派超頻來(lái)提升性能,不過(guò)這可能對(duì)你的硬件是一種潛在危險(xiǎn)。在使用我的 Ansible 劇本配置之前,請(qǐng)先仔細(xì)閱讀。你需要為你的每個(gè)配置選擇負(fù)責(zé)。你將決定使用哪個(gè)固件、哪個(gè) EEPROM。超頻的話需要記得提供相應(yīng)的冷卻系統(tǒng)。
執(zhí)行 Ansible 劇本
第一步,使用命令從 Github 獲取 Ansible 劇本:
$ git clone https://github.com/smartgic/ansible-playbooks-mycroft.git
源碼中,requirements.yml
文件中提供了該劇本的依賴(lài)角色列表,必須從 Ansible Galaxy 中檢索這些依賴(lài)。
$ cd ansible-playbooks-mycroft
$ ansible-galaxy install -r requirements.yml
Starting galaxy role install process
- downloading role 'mycroft', owned by smartgic
- downloading role from https://github.com/smartgic/ansible-role-mycroft/archive/main.tar.gz
- extracting smartgic.mycroft to /home/goldyfruit/.ansible/roles/smartgic.mycroft
- smartgic.mycroft (main) was installed successfully
- downloading role 'prepi', owned by smartgic
- downloading role from https://github.com/smartgic/ansible-role-prepi/archive/main.tar.gz
- extracting smartgic.prepi to /home/goldyfruit/.ansible/roles/smartgic.prepi
- smartgic.prepi (main) was installed successfully
第二步,編輯倉(cāng)庫(kù)中的 Ansible 清單,設(shè)置需要管理的主機(jī)。
[rpi]
rpi4b01 ansible_host=192.168.1.97 ansible_user=pi
[rpi]
代表組,無(wú)需更改。該組有一個(gè)主機(jī) rpi4b01
,其 IP 地址為 192.168.1.97
, 并創(chuàng)建 pi
作為 Linux(Raspberry Pi OS)上的默認(rèn)用戶(hù)。
現(xiàn)在比較棘手的部分到了:你希望每個(gè)選項(xiàng)怎么配置?這取決于你自己,下面是我的首選配置,供你參考:
# file: install-custom.yml
- hosts: rpi
gather_facts: yes
become: yes
pre_tasks:
- name: Install Python 3.x Ansible requirement
raw: apt-get install -y python3
changed_when: no
tags:
- always
vars:
# PREPI
prepi_pi_user: pi
prepi_hostname: mylovelypi
prepi_firmware_update: yes
prepi_overclock: yes
prepi_force_turbo: yes
prepi_cpu_freq: 2000
prepi_pulseaudio_daemon: yes
# MYCROFT
mycroft_branch: dev
mycroft_user: "{{ prepi_pi_user }}"
mycroft_skills_update_interval: 2.0
mycroft_recording_timeout_with_silence: 3.0
mycroft_enclosure_name: picroft
mycroft_extra_skills:
- https://github.com/smartgic/mycroft-finished-booting-skill.git
tasks:
- import_role:
name: smartgic.prepi
- import_role:
name: smartgic.mycroft
上面的配置內(nèi)容需要保存在文件里(比如,install-custom.yml
)。
現(xiàn)在關(guān)鍵步驟:運(yùn)行你新創(chuàng)建的劇本。
$ ansible-playbook -i inventory install-custom.yml -k
-k
選項(xiàng)只有在不需要 SSH 密鑰的時(shí)候才使用。在命令執(zhí)行期間,樹(shù)莓派可能會(huì)重啟若干次。Ansible 劇本會(huì)自動(dòng)處理這個(gè)問(wèn)題,不必?fù)?dān)心。
Ansible 配置完成后,你可以看到一條祝賀消息,提示你下一步需要做什么。
Congratulations message (Gaëtan Trellu, CC BY-SA 4.0)
Ansible 讓定制 Mycroft 變得更容易
這些 Ansible 劇本是我開(kāi)始使用 Mycroft AI 后學(xué)到的經(jīng)驗(yàn)教訓(xùn)。它們幫助我在任何一個(gè)地方都能構(gòu)建、重構(gòu)、定制、拷貝我的安裝,并保持一致,這讓我很省心!
讀完此文,你有何意見(jiàn)、問(wèn)題或疑慮?歡迎在 Twitter上 @goldyfruit上和我交流,或者訪問(wèn) Mycroft 頻道 搜尋答案。