Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

改造 ReSpeaker 2-MIC HAT

33,737 views

Published on

一天七小時工作坊,介紹
1.ReSpeaker 2-Mic HAT使用(1小時)
2.Linux ALSA介紹(1小時)
3.Google Assistant介紹(2.5小時)
4.ReSpeaker 2-Mic HAT改造(2.5小時)

購買 Raspberry Pi 3 Model B+ 入門組
https://www.raspberrypi.com.tw/21212/pi-3-b-plus-microsd-power-supply/

購買智慧喇叭語音學習套件
https://www.raspberrypi.com.tw/19621/pi-smart-speaker-kit/

範例程式:
https://github.com/raspberrypi-tw/hack-respeaker

hackmd:
https://hackmd.io/66rhYfscTFazn5wZzH3Uhg

Published in: Technology
  • Be the first to comment

  • Be the first to like this

改造 ReSpeaker 2-MIC HAT

  1. 1. 改造 ReSpeaker 2-MIC HAT 台灣樹莓派 <sosorry@raspberrypi.com.tw>sosorry@raspberrypi.com.tw>>
  2. 2. 姓名標示 — 非商業性 — 相同方式分享 CC (Creative Commons) 姓名標示 — 你必須給予 適當表彰、提供指向本授權 條款的連結,以及 指出(本作品的原始版本)是否已 被變更。你可以任何合理方式為前述表彰,但不得以 任何方式暗示授權人為你或你的使用方式背書。 非商業性 — 你不得將本素材進行商業目的之使 用。 相同方式分享 — 若你重混、轉換本素材,或依本 素材建立新素材,你必須依本素材的授權條款來 散布你的貢獻物。
  3. 3. 3 ● Raspberry Pi 官方經銷商 about 台灣樹莓派 http://farnell.com/raspberrypi-consumer/approved-retailers.php?region=apac&MER=MER-LM-OB-RPICC-76315
  4. 4. ● 專注於 Raspberry Pi 應用與推廣 ● 舉辦社群聚會 / 工作坊 / 讀書會 / 黑客松 ● Website: ● https://w>w>w>.raspberrypi.com.tw>/ ● Facebook: ● 搜尋 RaspberryPi.Taiwan ● https://w>w>w>.facebook.com/RaspberryPi.Taiw>an 社群 x 活動
  5. 5. 5 ● COSCUP,MakerConf,PyCon 講者 ● 投影片 ● http://www.slideshare.net/raspberrypi- tw/presentations ● 程式碼 ● https://github.com/raspberrypi-tw 分享 x 教學
  6. 6. 6 ● ReSpeaker 2-Mic HAT 使用 ● Linux ALSA 介紹 ● Google Assistant 介紹 ● ReSpeaker 2-Mic HAT 改造 本次主題
  7. 7. 7 ● 硬體:Raspberry Pi 3B/3B+ ● 作業系統:2018-06-27-raspbian-stretch.img ● 為了可以使用USB 轉TTL 傳輸線 ● 修改/boot/config.txt, 新增三行 – dtoverlay=pi3-miniuart-bt – core_freq=250 – enable_uart=1 ● 修改/boot/cmdline.txt, 將quiet splash 的quiet 移除 今日環境 刪除 quiet 新增三行
  8. 8. ● $ sudo apt-get update ● $ sudo apt-get -y install python-pip python-dev python3-dev python3-venv flac python-pyaudio python- numpy python-matplotlib python3-gi-cairo swig3.0 portaudio19-dev python3-pyaudio sox libatlas-base- dev libffi-dev libssl-dev vim mpg123 git espeak x11vnc ffmpeg mplayer ● $ sudo apt-get -y install libpython3-all-dev libttspico-data libttspico-utils libttspico0 ntpdate python3-all python3-all-dev python3-pysocks python3- virtualenv virtualenv ● $ sudo pip install -U nltk request beautifulsoup4 html5lib jieba SpeechRecognition request pyaudio setuptools wheel ● $ sudo pip3 install -U request jieba numpy cairocffi (hackmd) 安裝所需軟體
  9. 9. 語音控制現有商品
  10. 10. https://w>w>w>.mobilegeeks.de/artikel/amazon-echo-apple-homepod-google-home-microsoft-invoke-vergleich/ Google Home Apple HomePod Amazon Echo Microsoft Invoke Amazon Dot
  11. 11. 超級比一比 http://phandroid.com/2017/06/06/apple-homepod-vs-google-home-vs-amazon-echo-w>hich-is-best/?i=2
  12. 12. 誰最吸引人? https://marketingland.com/survey-amazon-echo-google-home-ow>ners-interested-apple-homepod-217549
  13. 13. 13 實驗 1: 錄音 / 播音 目的 : 使用 ALSA 相關工具
  14. 14. ● 特色 ● 使用 WM8960(low power stereo codec) ● 2 Microphones ● 3.5mm Audio Jack ● JST2.0 Speaker Out ● 2 Grove Interfaces ● 1 User Button ReSpeaker 2-Mics Pi HAT http://w>iki.seeed.cc/ReSpeaker_2_Mics_Pi_HAT/
  15. 15. ReSpeaker 2-Mics Pi HAT http://w>iki.seeed.cc/ReSpeaker_2_Mics_Pi_HAT/
  16. 16. ● $ cd ~ ● $ git clone https://github.com/respeaker/seeed- voicecard.git ● $ cd seeed-voicecard ● $ sudo ./install.sh 2mic ● $ sudo reboot (hackmd) 安裝設定 http://w>iki.seeed.cc/ReSpeaker_2_Mics_Pi_HAT/
  17. 17. 測試是否安裝成功? aplay -l arecord -l
  18. 18. 攜帶型 FM 喇叭 ( 背面 ) https://w>w>w>.w>eemall.com/stylebox-z-12-portable-mini-music-speaker-w>-fm-tf-slot 開關 5V 充電 /line in
  19. 19. 攜帶型 FM 喇叭 ( 正面 ) https://w>w>w>.w>eemall.com/stylebox-z-12-portable-mini-music-speaker-w>-fm-tf-slot 長按切換模式 長按音量 - 長按音量 +
  20. 20. ReSpeaker 2-Mics + 喇叭 接 3.5mm audio jack 接 mini USB
  21. 21. ● 列出目前可 record 的音訊裝置 ● $ arecord -l ● 錄音 ● $ arecord -d 3 -f dat test-mic.wav ● 列出目前可 playback 的音訊裝置 ● $ aplay -l ● 播放音訊 ● $ aplay test-mic.wav 測試錄音 (arecord) 與播放 (aplay)
  22. 22. 22 Linux 輸入與輸出的處理流程 https://en.w>ikipedia.org/w>iki/Evdev
  23. 23. ● Sound Card & Device 音效卡的資訊流 http://w>w>w>.alsa-project.org/main/index.php/Minivosc
  24. 24. 現代的 Linux Consumer Audio Stack https://elinux.org/images/e/e7/Audio_on_Linux.pdf
  25. 25. ● 是一個軟體架構 (software framework) 和部 份的 Linux Kernel, 提供音效卡驅動程式 API ● 包括指令列工具 ● alsactl, amixer, arecord/aplay and alsamixer ALSA (Advanced Linux Sound Architecture)
  26. 26. ● /usr/share/alsa/alsa.conf => hook 兩個檔案 + 預設使用 Card 0 和 Device 0 作為音訊設備 ● /etc/asound.conf( 系統層級的設定檔 ) ● ~/.asoundrc( 使用者層級的設定檔 ) ● 相關名詞 (device) ● control: 音效卡的控制 , 例如通道選擇 / 混音 / 麥克風控制等 ● pcmc: 用於錄音的 pcm 設備 ● pcmp: 用於播放的 pcm 設備 ● seq: 音序器 ● timer: 計時器 相關設定檔
  27. 27. 使用 alsamixer 控制音量 按 tab 切換功能
  28. 28. 按 F6 可切換音效卡 按 ESC 退出
  29. 29. 控制 ReSpeaker 2-Mics 的 GPIO
  30. 30. 接到實體腳位 11 接到實體腳位 32
  31. 31. 31 import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BOARD) BTN_PIN = 11 GPIO.setup(BTN_PIN, GPIO.IN) def mycallback(channel): print("Button pressed") try: GPIO.add_event_detect(BTN_PIN, GPIO.FALLING, callback=mycallback, bouncetime=200) while True: time.sleep(10) finally: GPIO.cleanup() 測試按鍵 ( 實體腳位 11)
  32. 32. 32 DEMO push_button_interrupt.py $ cd ~/hack-respeaker/01-gpio $ python push_button_interrupt.py
  33. 33. Grove 接頭 ● 由 seeedstudio 設計的 grove system ● 數位輸出 / 輸入由四根 pin 控制 http://w>w>w>.seeedstudio.com/blog/2016/03/09/tutorial-intro-to-grove-connectors-for-arduinoraspberry-pi-projects/
  34. 34. 34 ● LED_PIN = 32 GPIO.setup(LED_PIN, GPIO.OUT, initial=GPIO.LOW) ● try: while True: print("LED is on") ● GPIO.output(LED_PIN, GPIO.HIGH) time.sleep(2) print("LED is off") ● GPIO.output(LED_PIN, GPIO.LOW) time.sleep(2) except KeyboardInterrupt: print("Exception: KeyboardInterrupt") finally: GPIO.cleanup() 測試 GPIO12( 實體腳位 32)
  35. 35. 35 DEMO grove_gpio12.py $ cd ~/hack-respeaker/01-gpio $ python grove_gpio12.py
  36. 36. 36 實驗 2: Google Assistant 目的 : 設定 Google 服務
  37. 37. https://w>w>w>.slideshare.net/greenido/actions-on-google-gdd-europe 使用情境
  38. 38. 互動式對話 https://marketingland.com/survey-amazon-echo-google-home-ow>ners-interested-apple-homepod-217549
  39. 39. 自然語言處理與動作反應 https://marketingland.com/survey-amazon-echo-google-home-ow>ners-interested-apple-homepod-217549
  40. 40. ● 特色 ● Hotword detection ● Voice control ● Natural language understanding ● SDK 元件 ● Google Assistant Library – 原生 Python ● Google Assistant Service – 使用 gRPC API 傳遞 , 可和 Go, Java, C#, Node.js or Ruby 介接 安裝 Google Assistant SDK https://developers.google.com/assistant/sdk/overview>
  41. 41. ● Virtualenv 可以隔離函數庫需求不同的專案 , 讓它們不會互相影響 , 達到 ● 在沒有權限的情況下安裝新套件 ● 不同專案可以使用不同版本的相同套件 ● 套件版本升級時不會影響其他專案 虛擬環境 (Virtualenv) https://docs.python.org/3/library/venv.html
  42. 42. ● 建立名稱為 env 的虛擬環境 ● $ cd ~ ● $ python3 -m venv env ● 進入名稱為 env 的虛擬環境 ● $ cd ~ ● $ source env/bin/activate ● (env) $ ● 退出虛擬環境 ● (env) $ deactivate 建立 , 進入 / 退出虛擬環境 https://docs.python.org/3/library/venv.html 在 env 虛擬環境下執行指令
  43. 43. ● $ source ~/env/bin/activate ● (env) $ python -m pip install --upgrade pip setuptools wheel ● (env) $ python -m pip install --upgrade google-assistant-library ● (env) $ python -m pip install --upgrade google-assistant-sdk[samples] ● (env) $ python -m pip install --upgrade google-auth-oauthlib[tool] (hackmd) 安裝 Google Assistant SDK http://w>iki.seeed.cc/ReSpeaker_2_Mics_Pi_HAT/
  44. 44. ● 設定 Google Assistant 的順序 ● 專案 (project)> 模型 (model)> 設備 (device) ● 在 console.actions.google.com 建立專案 ● 在 console.cloud.google.com 設定功能與權限 設定 Google Assistant 基本概念 https://developers.google.com/assistant/sdk/overview>
  45. 45. ● 安裝 Google Assistant Library ● 建立專案 ● 啟用 Google Assistant API ● 產生驗證檔案 ● 用範例程式測試 操作步驟 - Configure a Developer Project and Account Settings https://developers.google.com/assistant/sdk/overview>
  46. 46. ● https://console.actions.google.com 從 console.action.google.com 建立專案
  47. 47. 取一個響亮的名稱吧
  48. 48. 完成新建專案
  49. 49. ● https://console.cloud.google.com/ 啟用 Google Assistant API
  50. 50. API & Service > Dashboard
  51. 51. Dashboard > Enable API
  52. 52. 搜尋 Google Assistant API
  53. 53. 啟用 Google Assistant API
  54. 54. ● https://console.cloud.google.com/ 產生驗證檔案 1. 選擇專案2. 瀏覽 3.API & Services
  55. 55. 選擇 OAuth 驗證方式
  56. 56. 選擇其他類型
  57. 57. 下載建立好的驗證檔案 下載
  58. 58. 58 ● 下載到本機端的檔案名稱為 client_secret_xxx.apps.googleuserco ntent.com.json ● 傳回到 Pi 的目錄為 /home/pi/Downloads ● 檔名為 credentials.json 將本機端的的檔案傳回 Pi
  59. 59. 59 ● 下載網址 http://winscp.net/eng/download.php 在 Window>s 上安裝 WinSCP http://w>inscp.net/ Window>s Pi
  60. 60. 60 ● $ scp /path/to/file user@ip.of.pi:/path ● 範例 ( 以下為同一行 ) ● $ scp /home/sosorry/Downloads/client_secret_x xx.apps.googleusercontent.com.js pi@192.168.66.99:/home/pi/Downloads/cre dentials.json 在 Mac 上使用 scp Pi 的 IP
  61. 61. ● 安裝授權工具 (authorization tool) ● 產生驗證資訊 (credentials.json) ● 開啟瀏覽器到驗證頁面得到驗證碼 ● 在終端機輸入驗證碼 建立驗證資訊 (Generate Credentials) https://developers.google.com/assistant/sdk/guides/library/python/embed/run-sample
  62. 62. OAuth 2.0 使用 Authorization Code https://cloud.google.com/community/tutorials/understanding-oauth2-and-deploy-a-basic-auth-srv-to-cloud-functions
  63. 63. ● $ source ~/env/bin/activate ● (env) $ google-oauthlib-tool --scope https://www.googleapis.com/auth/assistant-sdk- prototype --save --headless --client-secrets /path/to/credentials.json ● 範例 ● (env) $ google-oauthlib-tool --scope https://www.googleapis.com/auth/assistant-sdk- prototype --save --headless --client-secrets /home/pi/Downloads/credentials.json (hackmd) 產生驗證資訊 https://developers.google.com/assistant/sdk/guides/library/python/embed/install-sample
  64. 64. 產生驗證資訊 https://developers.google.com/assistant/sdk/guides/library/python/embed/install-sample
  65. 65. 將網址貼到瀏覽器 https://developers.google.com/assistant/sdk/guides/library/python/embed/install-sample
  66. 66. 准許存取 https://developers.google.com/assistant/sdk/guides/library/python/embed/install-sample
  67. 67. 產生驗證碼 https://developers.google.com/assistant/sdk/guides/library/python/embed/install-sample
  68. 68. 將驗證碼貼回去 https://developers.google.com/assistant/sdk/guides/library/python/embed/install-sample
  69. 69. 建立 OAuth 驗證檔 https://developers.google.com/assistant/sdk/guides/library/python/embed/install-sample
  70. 70. ● $ source ~/env/bin/activate ● (env) $ google-assistant-demo --device_model_id <DEVICE-ID> ● 範例 : ● (env) $ google-assistant-demo --device_model_id pi3 用範例程式測試 Google Assistant http://w>iki.seeed.cc/ReSpeaker_2_Mics_Pi_HAT/
  71. 71. 說 ” OK Google” https://developers.google.com/assistant/sdk/guides/library/python/embed/install-sample 該裝置尚未註冊 OK Google pi3
  72. 72. ● Who am I? ● What time is it? ● What can you do? ● Tell me a joke ● Do you love me? 問個問題吧 https://github.com/google/aiyprojects-raspbian/blob/aiyprojects/HACKING.md
  73. 73. Google Assistant 會回應你 雖然可以用 , 但怪怪的?
  74. 74. Google Home Architecture
  75. 75. 還在發展中 可換成任意裝置 http://bit.ly/2MQEgnP
  76. 76. Device Type https://developers.google.com/actions/smarthome/guides/
  77. 77. Device Trait https://developers.google.com/assistant/sdk/reference/traits/
  78. 78. ● https://console.cloud.google.com Project ID 在哪?
  79. 79. Project ID 在哪? Project ID
  80. 80. ● $ source ~/env/bin/activate ● (env) $ googlesamples-assistant- devicetool --project-id <PROJECT-ID> list --model ● 範例 ● (env) $ googlesamples-assistant- devicetool --project-id myaiy-b8c9c list --model (hackmd) 列出目前的設備模型 (Model) https://developers.google.com/assistant/sdk/guides/service/python/embed/register-device
  81. 81. 一開始沒有設備模型 https://developers.google.com/assistant/sdk/guides/library/python/embed/install-sample No device models found
  82. 82. ● $ source env/bin/activate ● (env) $ googlesamples-assistant- devicetool --project-id <PROJECT-ID> list --device ● 範例 ● (env) $ googlesamples-assistant- devicetool --project-id myaiy-b8c9c list --device (hackmd) 列出目前的設備實例 (Device) https://developers.google.com/assistant/sdk/guides/service/python/embed/register-device
  83. 83. 也沒有設備實例 https://developers.google.com/assistant/sdk/guides/library/python/embed/install-sample No device found
  84. 84. ● https://console.actions.google.com/ 那就註冊新的 Model 吧 選擇專案
  85. 85. Action 專案首頁 往下拉到最底
  86. 86. 選擇 Device Registration Device Registration
  87. 87. 開始註冊設備模型
  88. 88. 填寫產品名稱和製造公司 ( 任意填 ) Model Id 自動產生
  89. 89. 下載 Model 的 OAuth 驗證資訊 下載
  90. 90. 90 ● 下載到本機端的檔案名稱為 client_secret_xxx.apps.googleuserco ntent.com.json ● 傳回到 Pi 的目錄為 /home/pi/ ● 檔名不變 將本機端的的檔案傳回 Pi
  91. 91. 根據需求選擇模型的特徵 (Trait)
  92. 92. 完成後會顯示註冊過的裝置模型
  93. 93. 列出目前的設備模型 (Model) https://developers.google.com/assistant/sdk/guides/library/python/embed/install-sample 使用 project-id
  94. 94. Project ID 在 console.cloud.google.com Project ID
  95. 95. 但仍然沒有設備實例 https://developers.google.com/assistant/sdk/guides/library/python/embed/install-sample No device found
  96. 96. ● (env) $ googlesamples-assistant-devicetool --project-id <PROJECT-ID> --verbose register-device --device <DEVICE-ID> --model <MODEL-ID> --nickname <NICKNAME> --client-type SERVICE (hackmd) 註冊新的設備實例 (Device) https://developers.google.com/assistant/sdk/guides/service/python/embed/register-device 自行輸入 , 唯一識別碼 自行輸入 , 中間不能有 - 或是 _
  97. 97. (hackmd) 註冊一個新的設備實例吧 https://developers.google.com/assistant/sdk/guides/library/python/embed/install-sample 自行輸入 ( 需唯一 ) nickname 中間不能有 - 或是 _
  98. 98. ● $ source ~/env/bin/activate ● (env) $ google-assistant-demo --project-id <PROJECT-ID> --device_model_id <DEVICE-ID> ● 範例 : ● (env) $ google-assistant-demo --project-id myaiy-b8c9c --device_model_id myaiy-b8c9c- pi3-product-ro576v-device (hackmd) 成功後再測試 Google Assistant http://w>iki.seeed.cc/ReSpeaker_2_Mics_Pi_HAT/ 或是 <MODEL-ID>
  99. 99. 說 ” OK Google” https://developers.google.com/assistant/sdk/guides/library/python/embed/install-sample OK Google project-id device-id 或是 Model-id
  100. 100. 使用 Google Assistant SDK
  101. 101. ● $ git clone https://github.com/googlesamples/assi stant-sdk-python (hackmd) Python Google Assistant SDK http://w>iki.seeed.cc/ReSpeaker_2_Mics_Pi_HAT/
  102. 102. ● $ source ~/env/bin/activate ● (env) $ python ~/assistant-sdk-python/google- assistant- sdk/googlesamples/assistant/library/hotword.py (hackmd) 執行 hotw>ord.py
  103. 103. 說 ” OK Google” https://developers.google.com/assistant/sdk/guides/library/python/embed/install-sample OK Google
  104. 104. ● 測試預設喇叭和麥克風功能 ● > audio_helpers.py ● 使用文字輸入和 Google Assistant 交談 ● > textinput.py ● 按下 Enter 後 , 使用語音和 Google Assistant 交談 ● > pushtotalk.py 測試其他範例程式 https://github.com/googlesamples/assistant-sdk-python
  105. 105. ● (env) $ python ~/assistant-sdk-python/google-assistant- sdk/googlesamples/assistant/grpc/audio_helpers.py (hackmd) 執行 audio_helpers.py 開始錄音 , 請講話
  106. 106. ● (env) $ python ~/assistant-sdk-python/google-assistant- sdk/googlesamples/assistant/grpc/textinput.py --device- model-id <MODEL-ID> --device-id <DEVICE-ID> (hackmd) 執行 textinput.py 請輸入文字
  107. 107. ● 問時間 (what time is it) textinput.py
  108. 108. ● 問天氣 (how is the weather tomorrow) textinput.py
  109. 109. ● (env) $ python ~/assistant-sdk-python/google-assistant- sdk/googlesamples/assistant/grpc/pushtotalk.py --device- model-id <MODEL-ID> --device-id <DEVICE-ID> (hackmd) 執行 pushtotalk.py 按下 Enter 以後開始說話
  110. 110. ● 問時間 (what time is it) pushtotalk.py 即時的 Speech to Text
  111. 111. 111 實驗 3: 語音轉文字 (STT) 目的 : 語音辨識和語音喚醒
  112. 112. 使用麥克風收音後 , 該怎麼變成文字 ? https://ithelp.ithome.com.tw>/articles/10195763
  113. 113. ● 語言系統由發音 (phonetics), 音韻 (phonology), 形態 (morphology), 詞彙 (lexicon), 句法 (syntax), 語義 (semantics), 語用學 (pragmatics) 等所組成 https://w>w>w>.slideshare.net/zelandiya/kiw>ipycon-2014-nlp-w>ith-python-tutorial
  114. 114. 114 目前 Google Assistant 支援的語系 https://developers.google.com/assistant/sdk/reference/library/languages
  115. 115. ● STT(Speech to Text) 含訊號處理 (Signal), 聲學處理 (Acoustic) 和語言處理 (Language) 語音訊號處理 + 自然語音處理 https://ithelp.ithome.com.tw>/articles/10195970
  116. 116. ● 支援多種語音辨識引擎 ● CMU Sphinx (works offline) ● Google Speech Recognition ● Google Cloud Speech API ● Wit.ai ● Microsoft Bing Voice Recognition ● Houndify API ● IBM Speech to Text ● Snowboy Hotword Detection (works offline) 使用 SpeechRecognition 套件 https://pypi.python.org/pypi/SpeechRecognition/
  117. 117. 試試看 Google 的 STT 吧 # -*- coding: utf8 -*- ● import speech_recognition as sr r = sr.Recognizer() with sr.Microphone() as source: r.adjust_for_ambient_noise(source, duration=1) print('Say something>>> ') audio=r.listen(source) print('Google Speech Recognition thinks you said:') sent = r.recognize_google(audio, language="zh-TW") print("{}".format(sent))
  118. 118. 118 DEMO stt_demo.py (env) $ deactivate $ cd ~/hack-respeaker/03-stt $ python stt_demo.py 2>/dev/null 執行時不能在 剛剛的虛擬環境中 , 要先退出
  119. 119. 可以用語音輸入做為程式進入點嗎?
  120. 120. ● 一個高度客製化的喚醒詞檢測引擎 , 並且 ● 可客製化喚醒詞 ● 一直監聽 , 但保護隱私 ● 輕巧 , 容易移植 Snow>boy https://github.com/Kitt-AI/snow>boy
  121. 121. 解碼器 (decoder) 結構 ├── README.md ├── _snowboydetect.so ├── demo.py ├── demo2.py ├── light.py ├── requirements.txt ├── resources │ ├── ├── ding.wav │ ├── ├── dong.wav │ ├── ├── common.res │ ├── └── snowboy.umdl ├── snowboydecoder.py ├── snowboydetect.py └── version snow>boy 喚醒詞模型 由 SWIG 產生的 Python 封裝檔 使用 SWIG 編譯的動態鏈接庫 控制樹莓派 GPIO
  122. 122. demo.py import snowboydecoder model = sys.argv[1] signal.signal(signal.SIGINT, signal_handler) detector = snowboydecoder.HotwordDetector(model, sensitivity=0.5) print('Listening... Press Ctrl+C to exit') detector.start(detected_callback=snowboydecoder.play_audio_file, interrupt_check=interrupt_callback, sleep_time=0.03) ● detector.terminate()
  123. 123. 123 DEMO demo.py $ cd ~/hack-respeaker/03-stt/snowboy $ python demo.py resources/snowboy.umdl 2>/dev/null
  124. 124. 整合 SpeechRecognition import snowboydecoder detector = snowboydecoder.HotwordDetector(model, sensitivity=0.5) def audioRecorderCallback(fname): r = sr.Recognizer() with sr.AudioFile(fname) as source: audio = r.record(source) # read the entire audio file print(r.recognize_google(audio, language="zh-TW")) detector.start(detected_callback=detectedCallback, audio_recorder_callback=audioRecorderCallback, interrupt_check=interrupt_callback, sleep_time=0.01) detector.terminate() 可調整靈敏度,通常從 0.38 到 0.5
  125. 125. 125 DEMO demo4.py $ cd ~/hack-respeaker/03-stt/snowboy $ python demo4.py resources/snowboy.umdl 2>/dev/null
  126. 126. 訓練自己的喚醒詞 (hotword)
  127. 127. 127 ● $ x11vnc 在 Pi 執行 x11vnc Server
  128. 128. 128 ● 下載 realvnc viewer https://www.realvnc.com/en/connect/download/viewer Window>s 或 Mac 安裝 x11vnc Client port 和 x11vnc 相同
  129. 129. 129 Chromium 瀏覽器
  130. 130. ● https://snowboy.kitt.ai/ 進入 snow>boy 訓練吧
  131. 131. 登入自己的帳號
  132. 132. 建立新的喚醒詞
  133. 133. 取個好記的名字吧 Chinese 假設取名為 myHotw>ord ( 不要用中文命名 !)
  134. 134. 一共要做三次 開始錄音
  135. 135. 測試一下模型看是否成功 測試
  136. 136. 成功的話就可以下載模型了 下載吧出現了
  137. 137. 137 DEMO demo.py $ cd ~/hack-respeaker/03-stt/snowboy $ python demo.py resources/myHotword.pmdl 2>/dev/null 使用自訂喚醒詞 將下載好的模型 ( 例如 myHotw>ord.pmdl) 放到 ~/hack-respeaker/03-stt/snowboy/resources
  138. 138. 138 DEMO demo4.py $ cd ~/hack-respeaker/03-stt/snowboy $ python demo4.py resources/myHotword.pmdl 2>/dev/null 使用自訂喚醒詞喚醒後再做 STT
  139. 139. 139 實驗 4: 使用 Dialogflow> 平台 目的 : 自然語言了解 (NLU))
  140. 140. ● 自然語言理解 (Natural Language Understanding) ● Dialogflow.com(Google) ● Luis.ai(Microsoft) ● Wit.ai(Facebook) ● Olami.ai(VIA 威盛 ) 自然語言理解 (NLU)) 平台
  141. 141. ● 可能的問句 ● 請告訴我明天天氣如何? ● 明天外面是不是很熱? ● 台北下星期會不會下雨 ● 天氣怎麼樣 ● 下星期會下雨嗎 ● Intent( 意圖 ) => 問天氣 ● Entity( 實體 ) => 日期 , 地點 明天台北的天氣如何?
  142. 142. ● Agent ● 一個具有特定功能範圍的 NLU 模型 ● Intent ● 一個句子的意圖 , 通常可以用一句話回答 ● Entity ● 自然語言中有關鍵意義的參數 , 如時間 / 城市 ● User Says ● 使用者用自然語言說出的一句話 自然語言理解 (NLU)) 重要元素
  143. 143. ● 原名稱為 Api.ai, 或是 Speaktoit ● 提供自然語言對話和人機互動技術 ● 支援 Android, iOS 和 Windows Phone ● Google 在 2017 年收購 , 改名為 dialogflow ● 已整合到 Google Cloud 等服務 Dialogflow> https://cloud.google.com/dialogflow>-enterprise/
  144. 144. ● 建立 個⼀個 Agent( 代理 AI) ● 建立所需的 Entity( 句 中的物件⼦中的物件 ) ● 建立所有的 Intent( 句 的意圖⼦中的物件 ) ● 測試 (Testing) 和訓練 (Training) 使用 Dialogflow> 步驟
  145. 145. ● https://console.dialogflow.com/ 登入使用
  146. 146. 建立新的 Agent
  147. 147. 建立新的 Agent 要分析的語言 , 建立後不可改
  148. 148. 主控台 點選後會展開左邊選單
  149. 149. 先修改設定吧 點選後進入設定頁面
  150. 150. 設定頁面 改選成 V1 API 記得存檔
  151. 151. 建立新的 Entities 建立新的 Entities
  152. 152. Entity 屬性 ( 名稱 ) 記得存檔 Entity 代號 同義詞Entity 內容
  153. 153. 再建立一個 Entity( 動作 ) Entity 代號 記得存檔 同義詞Entity 內容
  154. 154. 在沒有建立 Intent 輸入文字測試 開燈
  155. 155. 回傳預設結果 預設回應 Default Fallback Intent
  156. 156. 建立新的 Intent 預設回應 Default Fallback Intent
  157. 157. 建立新的 Intent Intent 名稱 可能的用語 (U)ser Says)
  158. 158. 輸入可能的用語 (U)ser Says) 可能的用語 自動識別出 Entity
  159. 159. 再輸入一個可能的用語 (U)ser Says) 再輸入可能的用語 自動識別出 Entity 存檔後測試
  160. 160. 測試輸入 有認得 Intent, 可是沒有內容 開燈開燈
  161. 161. 新增 Intent 的回覆 新增回覆
  162. 162. 先用底線將句子連成一個單字 完成後存檔 通常是有意義的句子 , 利如 turn_on_light_ok
  163. 163. 測試輸入 有認得 , 並且 傳回正確回覆 開燈開燈
  164. 164. 測試新的輸入 如果不認得 去開燈
  165. 165. 使用 Training 功能 剛剛的測試用語
  166. 166. ( 如果沒有自動選取的話 ) 還要做些微調 將字選取起來以後選擇對應的 Entity 燈對應到 light
  167. 167. 將字選取起來以後選擇對應的 Entity 燈對應到 turn_on ( 如果沒有自動選取的話 ) 還要做些微調
  168. 168. 記得要先存檔 存檔
  169. 169. 認得新的用語了 有認得 , 並且 傳回正確回覆 開燈去開燈
  170. 170. ● 根據不同的用語 (User Says) ● 去開燈 ● 燈打開 ● 打開燈 ● 對應到相同的意圖 (Intent) ● turnOnLight ● 並且有相同的回應 (Response) ● turn_on_light_ok 目前 Dialogflow> 會了什麼?
  171. 171. 該如何整合到程式裡? 複製 cU)RL 語法
  172. 172. ● 網址 https://api.dialogflow.com/v1/query?v=20170712 ● 查詢字串(url encode) %E5%8E%BB%E9%96%8B%E7%87%88 ● 語言 zh-tw ● 唯一識別碼( 長度36) 673cf037-a0cb-a350-73d6-a38e29ec8da8 ● 時區 Asia/Taipei ● 認證碼 Bearer 18f686c5f4b240638a3fbe3c2d1bbfed 認證碼,每個人不同
  173. 173. 解析回傳結果 查詢字串 Entities Intent 回覆
  174. 174. import requests ● query = sys.argv[1] lang = 'zh-tw' session_id = str( uuid.uuid1() ) timezone = 'Asia/Taipei' authorization = '<FIXME>' headers = { "accept": "application/json", "authorization": authorization } url = 'https://api.dialogflow.com/v1/query?v=20170712' params = {'query':str(query), 'lang':lang, 'sessionId': session_id, 'timezone': timezone} response = requests.request("GET", url, headers=headers, params=params) Python 程式串接 換成自己的認證碼 , 含 Bearer 認證碼由表頭送出 使用者問題用參數傳遞方式帶入
  175. 175. ● JSON(JavaScript Object Notation) 是一種資料結構 ● 物件 (object) 以 { } 表示 ● 鍵 / 值 (collection) 以 : 表示 ● 陣列 (array) 以 [ ] 表示 ● 最外層用 {} 包起來 資料使用 JSON 結構傳送 https://w>w>w>.ssaurel.com/blog/parse-and-w>rite-json-data-in-java-w>ith-gson/
  176. 176. import json ● data = json.loads(response.text) ● ● print(data) ● ● status = data['status']['code'] ● print("Status: {}".format(status)) ● ● if status == 200: ● resolveQuery = data['result']['resolvedQuery'] ● fulfillment = data['result']['fulfillment']['speech'] ● ● print("Query: {}".format(resolveQuery)) ● print("Response: {}".format(fulfillment)) 解開 JSON 字串 , 成為 dict 格式 如果成功的話回傳 200 將 JSON 字串解開
  177. 177. 177 DEMO request_dialogflow>.py $ cd ~/hack-respeaker/04-nlu $ python request_dialogflow.py 開燈 自己定義的查詢字串
  178. 178. 整合到程式裡面成功 Intent 回覆 查詢字串
  179. 179. 將 Dialogflow> 整合到服務裡 https://w>w>w>.analyticsvidhya.com/blog/2018/03/how>-to-build-an-intelligent-chatbot-for-slack-using-dialogflow>-api/
  180. 180. ● 1. 使用客製化關鍵字喚醒 Pi ● snowboy 客製化 ● 2. 利用 ' 開燈 ' 或是 ' 燈打開 ' 等句子讓 LED 亮或是暗 ● 用 STT 讀取語音輸入 (snowboy/demo4.py) ● 把文字用 request 送到 dialogflow(request_dialogflow.py) ● 根據回傳 intent response, 控制 GPIO(led_on.py) 腳位改為 32 改造 ReSpeaker 2-Mic HAT
  181. 181. 181 DEMO nlu_turn_on_light.py $ cd ~/hack-respeaker/03-stt/snowboy $ python nlu_turn_on_light.py resources/myHotword.pmdl 2>/dev/null 使用自訂喚醒詞喚醒後再做 NLU)
  182. 182. 記得要把 authorization 換成自己的 Intent 回覆 查詢字串
  183. 183. 183 Raspberry Pi Rocks the World Thanks

×