從零開始,搭建 AI 音箱 Alexa 語音服務

NO IMAGE

?wx_fmt=gif&wxfrom=5&wx_lazy=1

本文來自作者 Mike 在 GitChat 上分享 「從零開始,搭建 AI 音箱 Alexa 語音服務」,「閱讀原文」檢視交流實錄。

「文末高能」

編輯 | 哈比

一、概述

?wx_fmt=png&wxfrom=5&wx_lazy=1&retryload=1

生活場景的引入: 物聯網的快速發展,各種智慧裝置層出不窮,作為極客,家裡早已安上了用 APP 控制的智慧燈、智慧插座,剛剛安裝上的時候,還有新鮮感,久了之後,是不是會有這樣的現象:

早上醒來要開燈,需要經過:

  1. 迷迷糊糊從床頭櫃上摸到手機

  2. 手機用指紋解鎖

  3. 連線無線網路

  4. 找到對應裝置的 APP

  5. 點選開燈按鈕

這樣的場景真的為生活帶來了便利嗎 ? 糟糕的體驗,繁瑣的過程,從而使這個產品慢慢淡出我們的生活場景 . 於是,那個物理開關的使用頻次又恢復了,這或許也是智慧裝置不能普及的根本原因之一。

以上生活的場景有很多,根本原因是缺少了和產品對話的功能,即語音互動,所以顯得不那麼智慧。

理想的情景:

早晨醒來時,只需要說一聲: 睡醒了,然後燈自動亮起,窗簾自動開啟,音樂自動響起 ….,這樣的場景你還滿意嗎 ?

一個便利的生活場景描述正式帶你進入本文的環節: 語音互動

?wx_fmt=png

根據人機互動這個維度,主要劃分了三個時代:

第一個時代:PC 時代。讓電腦明白人類的意圖,通過滑鼠、鍵盤的方式輸入讓瀏覽器搜尋獲取想要的知識。

第二個時代:移動時代。Touch 稱為該時代互動方式,就是 2007 年喬布斯釋出的 iPhone。觸控式螢幕的出現極大的提高了使用者互動的體驗,容易上手。

鍵盤和觸控同共構成了網際網路互動方式的過去和現在。從另外一個角度說,也可以把鍵盤對應於 PC 時代互動方式,把觸控對應於移動時代互動方式。

正是因為使用者從 PC 轉移到了移動端,網際網路行業才發生了那麼多的變化。

第三個時代:AI 時代。語音稱為該時代的互動方式,每一部手機都將能聽會說,每一臺家電都將能聽會說,每一輛汽車都將能聽會說,無人駕駛,每一個玩具都將能聽會說。

語音時代,使用者只需要用說話的方式給服務終端釋出命令,就能得到相應的服務 . 這一產業從上世紀六十年代就已出現,但並不為普通消費者所熟知,消費者對其認知度也比較低。

近年來,隨著蘋果、亞馬遜、谷歌、微軟等公司先後推出 Siri、Echo 等智慧語音服務,這一服務以及相關產業也開始被普通消費者和投資界所關注。

這裡必須要提到亞馬遜的 Echo 智慧音箱。Echo 已經成為語音時代的一個重大創新,成為智慧家庭的一個現象級應用。

由於 Echo 尚沒有中文版,所以大家沒有體會到它的熱度,然而在美國,已經成為 “ 一款現象級的革命性產品 “。

從 2014 年 11 月正式釋出到現在,亞馬遜的 Echo 智慧音箱超過兩歲了。在這兩年時間裡,它從一開始隨時可能夭折的 “ 新生兒 “,發展成如今市場上最為火熱的智慧家居產品之一。

二、國內外智慧音響

?wx_fmt=png

隨著著亞馬遜 Echo 的火爆引發一連串的效應,這也是智慧音箱行業的一個重要轉折點。各大巨頭紛紛入局,如亞馬遜 Alexa、微軟 Cortana、Google Assistant、蘋果 Siri、三星 Bixby、等智慧語音助手。

如今,這場戰火也點燃了中國市場。井噴式發展的中國智音箱市場已經成為了科技巨頭、傳統行業廠商、創業公司博弈的競技場,玲琅滿目的智慧音箱產品都奔赴在路上 !

各大廠商的音響盤點,單品測評,價效比優勢,各種平臺已報道出很多,這裡以音響的軟硬體配置作為切入點,分析各大廠商的方案選型,價效比優劣勢:

?wx_fmt=png

1. 麥克風

麥克風是智慧音響很重要的環節,包括遠場拾音、噪聲抑制、混響去除、人聲干擾抑制、聲源測向、聲源跟蹤、陣列增益等功能,進而提高語音訊號處理質量,以提高真實環境下的語音識別率。

通過對比圖可以看出亞馬遜 Echo、天貓精靈、小米 AI 音響、叮咚 2 代技術路線類似,使用了 6、7、8 個麥克風環形陣列,使得波束的空間區分性更強,保證聲源定位和拾音效果。

谷歌 Home 和問問音響則不同,採用雙麥克風方案,對麥克風的數量和陣列排列結構依賴較少,更加依賴語音增強演算法,從而獲得良好的拾音效果。

根據第三方測評機構,和 Echo 對比,谷歌 Home 在 3 米內的綜合能力(拾音、訊雜比、抗噪、抗回聲)要更好。

谷歌的麥克風陣列採用的演算法很有特點,他們對深度學習的應用較深,算是一種波束成型和深度學習相結合的一種形式 。

2. 處理器

亞馬遜 Echo 採用 TI(德州儀器)DM3725CUS100 的晶片,主要為工業級應用,主頻不高,但處理能力很強 . 功耗、效能控制的很好。

谷歌 Home 採用的是 Marvell(美滿) 88DE3006 的晶片,該晶片也為工業級晶片,在通訊中應用比較多。

該晶片為 2 核,也顯示了谷歌 Home 在硬體端沒有太多計算能力,更多計算在雲端,這樣就簡化了很多東西,也不需要 Codec,麥克風陣列可與主控直接相連。

天貓精靈採用的是 MTK MT8516 的語音專用晶片,這款晶片是 MTK 為智慧助手打造的,主頻達 1.3GHz,晶片內建 WiFi 802.11 b/g/n 和支援藍芽 4.0,支援高達 8 通道的 TDM 麥克風陣列介面和 2 通道的 PDM 數字麥克風介面,非常適用於遠場 (Far-field) 麥克風語音控制和智慧音響裝置,在同代中穩定性、價效比很高。

問問音響則採用的是 MTK MTK2601 晶片,面向於智慧穿戴方面,1.2GHz 雙核心 ARM Cortex-A7 處理器,MT2601 需要結合 MT6630 無線射頻晶片,實現雙頻 WIFI、藍芽 4.1 以及 ANT 和 FM 等功能。

叮咚 2 代採用的全志科技 R16 晶片,主要面向於智慧家居方面,採用極具價效比的四核 ARM Cortex-A7 架構處理器,支援基於 Linux 的開源系統 Tina,(Tina 是全志科技全力打造的專門用於全志智慧硬體平臺的系統軟體品牌);

支援 AirPlay、DLNA、Qplay、Airkiss、Smart Link 等多種網路應用協議;提供獨特的演算法、IP 包,使開發者可以專注於其自有應用和產品市場運營,降低產品開發成本,並縮短開發週期。

小米 AI 音響採用的是 Amlogic 的 A112 晶片,主要面向於智慧家居方面,四核 ARM Cortex-A53 架構,8 通道 I2S 和 S /PDIF 輸入和輸出,具有強大的運算效能和豐富的介面,憑藉四核 64 位 CPU 架構強大的計算能力,可以支援無需外部 DSP 晶片的主流遠場語音識別解決方案。 

卓越的音訊處理能力可支援多種本地或線上高保真音樂,因此使用者可隨時隨地欣賞音樂。

3. 揚聲器發聲單元

智慧音響以 “智慧” 出名,當下的智慧音響更多的考慮是音質的選擇,音質一方面受 Codec 晶片影響,另一方面也受到發音單元的影響。

亞馬遜 Echo 採用的是一個高音單元、一個低音單元和一個倒相管的設計結構,保證高音的同時,也增強了低音的效果。之所以說 Echo 是智慧音箱產品的典型代表,不僅僅是因為它是第一款智慧音箱,更因為它在智慧、音質、體積、體驗上都做到了平衡。

谷歌 Home 和天貓精靈和小米 AI 和叮咚二代,在音質上稍微弱一些,僅採用了一個全頻帶的發音單元,通過共振鼓膜來增強一部分低音效果。

從設計結構上來看,谷歌 Home 的兩片共振鼓膜也形成一種立體聲效果,比其它又相對好一些。

問問音箱差異化的點在於大功率發音單元的配置,採用了 1 寸高音單元和 3 寸低音單元以及更大音腔的設計方式,功率高達 50W,從而在硬體方面提供更好的音質,這也大大提升了物料成本。

對比硬體,各家平臺各有優劣勢,面對不同的使用者需求,需要結合軟體的優化才能達到良好的體驗和語音互動。

三、應用場景

1. 藍芽音響

藍芽技術是愛立信在 1994 年提出的,那個時候是作為 RS232 資料線的取代策略 . 藍芽是一種無線傳輸技術,可以得到當多裝置的短距離資料更換,如大家的智慧手機,此類技術最大的長處在於無線傳輸,外加就是短距離,因而發射功率不需要那大,也省電。

藍芽音箱就是將此類技術應使用有源音箱上,經過此類無線傳輸技術,將智慧手機、平板電腦或 PC 上的數字音訊傳輸到音箱上,就會得到無拘無束的無線音樂播放。

場景應用:  行動式音箱、離線音樂播放、 無線傳輸

2. 智慧音響

智慧音響賦予 “ 智慧 “ 的功能,它的侷限不止播放音樂這麼簡單,而是深入到生活實際的場景中去,語音直接說話下命令,代替按鍵、觸控式螢幕,是人更自然的體驗 . 語音控制家電,實現訂餐、下單、獲取資訊等各種各樣的服務。

同時各大網際網路巨頭和科技公司都在投入大量成本,完善和改進技術,並積極投入到場景應用中。真正鎖定使用者真正剛性需求,深耕使用場景,或將成為未來產業致勝的關鍵要素。

場景應用:音樂播放、語音互動、生活助理

騰訊舉辦的使用者開發日,體驗過朋友應該已經感覺到那個神祕的方盒子力量 . 每天在使用微信、QQ 溝通交流,閒暇時在王者峽谷開黑,跳傘吃雞的你,是否已經準備好迎接巨頭將來出現在家居、交通、醫療等領域的這些形態和方式?

騰訊使用者開放日,我們體驗了騰訊的最新科技,發現了這些祕密

四、搭建 Alexa 語音服務

1.  Amazon 註冊裝置

1.1 賬號註冊

按照以下說明 註冊步驟,註冊一個產品,填寫相關資訊並建立安全配置檔案,用於與 Alexa 進行通訊的訪問和重新整理令牌。

Note:Web 設定下的允許 origin 和返回 URL 應分別為:http://localhost:3000 和 http://localhost:3000/authresponse.

?wx_fmt=png

1.2 資訊

註冊裝置後,找到安全配置(Security Profile)檔案下的常規(General)選項卡,並記下 clientID,clientSecret 和 deviceTypeID。後面將需要這些資訊來配置 AuthServer,獲取 token。

2. 安裝依賴

2.1 基本工具

安裝基本的配置工具:

sudo apt-get install git gcc cmake build-essential

通過 gcc -v 和 cmke -version 檢視版本,符合 gcc 4.8.5 和 cmke 3.1 以上即可。

2.2 安裝 libcurl 、nghttp2 、openssl

這部分搭建很重要,由於連線到 AVS 需要使用 Http2 協議,SDK 中使用 libcur 建立該連線。

原始碼安裝 openssl:

wget https://www.openssl.org/source/old/1.0.2/openssl-1.0.2g.tar.gz
tar -xzvf openssl-1.0.2g.tar.gz
cd openssl-1.0.2g
./configure  // 預設安裝路徑 /usr/local,也可以通過–prefix 指定安裝路徑
make
sudo make install
openssl version  // 確認安裝版本: OpenSSL 1.0.2g  1 Mar 2016

原始碼安裝 libcurl:

wget https://curl.haxx.se/download/curl-7.50.2.tar.gz
tar -xzvf curl-7.50.2.tar.gz
cd curl-7.50.2
./configure 預設安裝路徑 /usr/local,也可以通過–prefix 指定安裝路徑
make
sudo make install
curl –version   // 確認安裝版本: curl 7.50.2

原始碼安裝 nghttp2:

安裝依賴:
sudo apt install python-dev libcunit1 libevent-dev libevent-openssl libjansson-dev libspdylay-dev libjemalloc-dev cython libnghttp2-14  libnghttp2-dev

wget https://github.com/nghttp2/nghttp2/releases/download/v1.0.0/nghttp2-1.0.0.tar.gz
tar -xzvf nghttp2-1.0.0.tar.gz
cd nghttp2-1.0.0
./configure
make
sudo make install
nghttp –version // 確認安裝版本: nghttp2/1.0.0

2.3 安裝 SQLite

wget https://www.sqlite.org/2017/sqlite-autoconf-3210000.tar.gz
tar -xzvf sqlite-autoconf-3210000.tar.gz
cd sqlite-autoconf-3210000/
make
sudo make install
sqlite3 -version  // 去人安裝版本: 大於 SQLite 3.19.3

2.4 安裝 PortAudio

PortAudio 是一個免費、跨平臺、開源的音訊 I/O 庫,示例程式必須元件。

wget http://www.portaudio.com/archives/pa_stable_v190600_20161030.tgz
tar xf pa_stable_v190600_20161030.tgz
cd portaudio
./configure –prefix=$LOCAL_BUILD    // 需要配置安裝路徑
make
sudo make install

2.5 安裝 Gstreamer

示例應用程式需要構建媒體播放器,來實現播放 MP3 檔案 . 選擇 GStreamer 框架來實現 . 需要安裝一些依賴項:

sudo apt-get install bison flex libglib2.0-dev libasound2-dev pulseaudio libpulse-dev libfaad-dev libsoup2.4-dev libgcrypt20-dev

gstreamer-1.10.4:

wget https://gstreamer.freedesktop.org/src/gstreamer/gstreamer-1.10.4.tar.xz
tar xf gstreamer-1.10.4.tar.xz
cd *gstreamer*/
./configure
make -j3
sudo make install

gst-plugins-base-1.10.4:

wget https://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-1.10.4.tar.xz
tar xf gst-plugins-base-1.10.4.tar.xz
cd *gst-plugins-base*/
./configure
make -j3
sudo make install

gst-libav-1.10.4:

wget https://gstreamer.freedesktop.org/src/gst-libav/gst-libav-1.10.4.tar.xz
tar xf gst-libav-1.10.4.tar.xz
cd *gst-libav*/
./configure
make -j3
sudo make install

gst-plugins-good-1.10.4:

wget https://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-1.10.4.tar.xz
tar xf gst-plugins-good-1.10.4.tar.xz
cd *gst-plugins-good*/
./configure
make -j3
sudo make install

gst-plugins-bad-1.10.4:

wget https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-1.10.4.tar.xz
tar xf gst-plugins-bad-1.10.4.tar.xz
cd *gst-plugins-bad*/
./configure
make -j3
sudo make install

Note:GStreamer 下的元件是依賴關係,需要按順序安裝。

2.6 安裝 Sensory

使用 Sensory 作為喚醒詞引擎來檢測喚醒詞 Alexa,配置之前需要安裝依賴項:

sudo apt-get -y install libasound2-dev
sudo apt-get -y install libatlas-base-dev
sudo ldconfig

由於官方公佈的引擎是只能在樹莓派上執行,執行在 Linux 平臺下載連結如下,有效期限一個月 . 過了有效期,喚醒將無法使用。

sensory-gitchat:連結: https://pan.baidu.com/s/1c2lQqOS 密碼: uvuk

3. 構建 SDK

3.1 克隆 SDK

克隆 SDK 之前,需要熟悉 git 的操作,參考 git 快速入手指南。

git clone [email protected]:alexa/avs-device-sdk.git
git checkout v1.1.0  // 切換 v1.1.0 版本

Note:官方迭代版本比較快,截止 20171210,已經更新到 v1.3 版本,該教程以 v1.1.0 版本為準。

3.2 構建 SDK
程式碼框架使用 cmake,建立外部編譯目錄。這個目錄不能是源目錄的子目錄 .

構建 Sensory:

這是一個 cmake 命令構建 Sensory 的例子

cmake <absolute-path-to-source> -DSENSORY_KEY_WORD_DETECTOR=ON -DSENSORY_KEY_WORD_DETECTOR_LIB_PATH=…/alexa-rpi/lib/libsnsr.a -DSENSORY_KEY_WORD_DETECTOR_INCLUDE_DIR=…/alexa-rpi/include

說明:

  • DSENSORY_KEY_WORD_DETECTOR_LIB_PATH: 喚醒詞的路徑: sensory-gitchat/lib/libsnsr.a

  • DSENSORY_KEY_WORD_DETECTOR_INCLUDE_DIR: 標頭檔案路徑: sensory-gitchat/include

構建 MediaPlayer:

  • MediaPlayer 基於 GStreamer 框架,並不是預設生成,要構建 MediaPlayer 必須 CMake 指定-DGSTREAMER_MEDIA_PLAYER=ON選項

  • 如果 GStreamer 通過原始碼安裝,構建的時候必須 CMake 通DCMAKE_PREFIX_PATH選項指定字首路徑

cmake <absolute-path-to-source> -DGSTREAMER_MEDIA_PLAYER=ON -DCMAKE_PREFIX_PATH=<path-to-GStreamer-build>

構建 PortAudio:

這是使用 PortAudio 為 C 構建 AVS Device SDK 的示例 CMake 命令:

cmake <absolute-path-to-source> -DPORTAUDIO=ON
-DPORTAUDIO_LIB_PATH=<path-to-portaudio-lib>
-DPORTAUDIO_INCLUDE_DIR=<path-to-portaudio-include-dir>

說明:

  • DPORTAUDIO_LIB_PATH :   portaudio 的 libportaudio.a 路徑

  • DPORTAUDIO_INCLUDE_DIR : portaudio 的標頭檔案路徑

3.2 更新配置檔案

原始碼構建成功後,用文字編輯器開啟 Integration 目錄下的 AlexaClientSDKConfig.json 檔案,填寫裝置註冊時候,記錄下的資訊:

{
   “authDelegate”:{
       “clientSecret”:”${SDK_CONFIG_CLIENT_SECRET}”,
       “deviceSerialNumber”:”${SDK_CONFIG_DEVICE_SERIAL_NUMBER}”,
       “refreshToken”:”${SDK_CONFIG_REFRESH_TOKEN}”,
       “clientId”:”${SDK_CONFIG_CLIENT_ID}”,
       “deviceTypeId”:”${SDK_CONFIG_DEVICE_TYPE_ID}”
    },

  “alertsCapabilityAgent”:{
    “databaseFilePath”:”${SDK_SQLITE_DATABASE_FILE_PATH}”,
    “alarmSoundFilePath”:”${SDK_ALARM_DEFAULT_SOUND_FILE_PATH}”,
    “alarmShortSoundFilePath”:”${SDK_ALARM_SHORT_SOUND_FILE_PATH}”,
    “timerSoundFilePath”:”${SDK_TIMER_DEFAULT_SOUND_FILE_PATH}”,
    “timerShortSoundFilePath”:”${SDK_TIMER_SHORT_SOUND_FILE_PATH}”
  }
}

填寫該檔案確保路徑中沒有任何額外的字元(或空格). 該配置還包含聲音檔案的路徑,該檔案將用於播放警報(Alarms)和計時器(Timer)的聲音。

您可以從以下連結,獲取 “定時器和警報” 獲取所需的聲音檔案:Alexa Voice Service UX Design Guidelines

這時,需要資料庫來儲存預定的警報 . 在您的配置檔案中,將檔案路徑位置包含到要用於儲存和讀取警報的資料庫中。如果資料庫不存在,將在該位置建立一個資料庫檔案。

例如 /home/avs/alerts.db.

3.3 安裝

填寫完 JSON 檔案,並重新檢查之後,進入終端的構建目錄並執行 “make”。

make -j3
make install

3.4 執行 AuthServer

編譯完成後,需要為裝置獲重新整理令牌,需要執行 AuthServer,一個將處理令牌交換的本地伺服器將實現它:

python AuthServer/AuthServer.py

如果您在這裡遇到錯誤,訪問 http://127.0.0.1:3000/,將在瀏覽器中彈出錯誤,請單擊以獲取更多詳細資訊,以確保您能夠返回並更正它們。

3.5 執行示例程式

確保前面每一項步驟順利完成後,到這裡可以執行示例程式,進入構建目錄到 SampleApp/src 資料夾並執行以下命令:

TZ=UTC ./SampleApp <REQUIRED-absolute-path-to-config-json> <OPTIONAL-absolute-path-to-wake-word-engine-folder-enclosing-model-files>

  • REQUIRED-absolute-path-to-config-json :  AlexaClientSDKConfig.json 路徑

  • OPTIONAL-absolute-path-to-wake-word-engine-folder-enclosing-model-files : sensory 喚醒詞模型路徑: sensory-gitchat/alexa.snsr

然後將彈出命令列介面。因為你設定了一個喚醒字引擎,因此你需要做的只是說 “Alexa”,即可進行對話。確保電腦的麥克風、喇叭處於開啟狀態。

五、語音服務開發指南

近年來國內外各大巨頭同時發力爭奪未來人工智慧時代的語音入口,甚至亞馬遜和阿里率先不惜代價開啟了補貼大戰 . 這些全球劇透的激烈競爭,將對未來十年產生極其重要的影響。

同時,這也是技術人員職業快速發展的機會。這裡以語音為核心,介紹聲學模型、訊號處理、語音識別開發平臺、結構等相關知識框圖,每一個方面都需要時間去實踐,可以結合自己現有知識進行拓展。

?wx_fmt=png

框圖只做參考,部分細節需要結合實際情況去分析。

六、參考

七、反饋

搭建 Alexa 語音服務涉及的知識點比較多,搭建過程中遇到問題請按照以下格式描述清楚,傳送至郵箱: [email protected] 

格式要求:

[GitChat 使用者名稱 ] : xxx
[作業系統版本 ] : 如 Ubuntu 16.04.2 LTS
[問題描述] :  搭建過程中出錯的詳細記錄,文字、圖片

近期熱文

修改訂單金額!?0.01 元購買 iPhoneX?

讓你一場 Chat 學會 Git

介面測試工具 Postman 使用實踐

如何基於 Redis 構建應用程式元件

深度學習在攝影技術中的應用與發展

這樣做,你的面試成功率將達到 90%

如何用 TensorFlow 讓一切看起來更美?


?wx_fmt=jpeg

「閱讀原文」看交流實錄,你想知道的都在這裡