
通過Spokestack添加語音控制的Fragment ,以在任何Android應用程序中。您可以找到一個簡單的演示應用程序,該應用顯示example目錄中的操作托盤。
當您將Spokestack托盤片段添加到佈局中時,您將獲得一個麥克風按鈕,形狀像屏幕側面的標籤(在哪一側取決於您;稍後再進行)。敲擊或拖動選項卡會顯示托盤的其餘部分,該托盤像聊天應用程序中的消息流一樣排列。打開托盤會激活麥克風,用戶說的任何內容都將通過自動語音識別(ASR)服務發送並顯示為文本。然後將該文本發送到自然語言理解(NLU)模型進行分類。分類的結果發送到您已建立的應用程序組件,以收聽托盤中的事件,該托盤可以通過Spokestack的文本到語音(TTS)合成服務產生托盤顯示和讀取給用戶的響應。如果應用程序的響應將其引導到;否則,托盤將關閉並禁用ASR。
就像那樣,您已經在應用程序中添加了語音!

哦,在初始交互之後,托盤可以用喚醒字而不是水龍頭打開。該喚醒字是默認情況下的“ Spokestack”,但可以自定義。
如果其中一些沒有意義,請不要害怕!請繼續閱讀,我們將介紹下面的所有詳細信息。
注意:Spokestack Tray曾經在Jcenter上託管,但是自從宣布停產以來,我們已將發行版移至Maven Central。請確保您的根級build.gradle文件在其repositories庫中包含mavenCentral()以便訪問版本> = 0.4.1。
確保您使用0.4.2或更高版本來正確解決Jcenter無法訪問之後對Core Spokestack庫的依賴。
默認情況下,Spokestack托盤處理ASR,NLU和TTS與用戶的語音交互 - 將其語音轉換為文本,處理該文本以產生操作,並綜合了應用程序的響應以讀回用戶。有關這些功能的更多信息,請參見Spokestack文檔。
要使用NLU和TTS,您需要一個免費的Spokestack帳戶。從您的帳戶頁面上,您可以創建和下載NLU模型;對於TTS請求,運行時需要客戶ID和秘密密鑰。
不過,首先,將依賴項添加到您的應用程序的build.gradle (檢查上面的Jcenter徽章以獲取最新版本):
implementation ' io.spokestack:tray:0.4.1 '如上所述,Spokestack Tray被實現為Fragment ,該片段在您現有的Activity之上呈現並處理語音交互,因此您需要將其添加到活動的佈局中:
<!-- nested in the main layout, after other views/sublayouts -->
< include
android : id = " @+id/tray_fragment "
layout = " @layout/spokestack_tray_fragment "
/>注意:根據您的應用程序佈局,您可能還必須在片段的母體佈局中添加android:clipChildren="false"以避免麥克風片在托盤打開時消失。
然後使您的活動本身擴展TrayActivity ( AppCompatActivity的子類),實現所需的方法,並且庫將照顧其餘的方法。
如果您想自己進行設置,這裡是一個不使用TrayActivity的示例:
import io.spokestack.tray.*
class MyActivity : AppCompatActivity (), SpokestackTrayListener {
lateinit var tray : SpokestackTray
// ...
override fun onCreate ( savedInstanceState : Bundle ? ) {
val config = TrayConfig . Builder ()
// credentials from your Spokestack account
.credentials( " spokestack-client-id " , " spokestack-secret-key " )
.wakewordModelURL( " https://path-to-wakeword-models " )
.nluURL( " https://path-to-nlu-files " )
// note the implementation of `SpokestackTrayListener` in the class declaration
.withListener( this )
// optional builder customization; see the documentation for more details...
.build()
supportFragmentManager.fragmentFactory = SpokestackTrayFactory (config)
// note that the factory is instantiated and set on the manager BEFORE calling
// `super.onCreate()`
super .onCreate(savedInstanceState)
}
override fun onStart () {
// set the value of the lateinit `tray` var
tray = SpokestackTray .getInstance(config)
super .onStart()
}當您下載Spokestack Wakeword或NLU型號時,您將有幾個URL到不同的文件。 wakewordModelURL和nluURL上面只需要通往相關目錄的路徑,而不是完整的文件URL。因此,對於演示“ spokestack” Wakeword,將wakewordModelURL設置為“ https://d3dmqd7cy685il.cloudfront.net/model/model/wake/wake/spokestack/”。
該托盤設計用於在活動中無縫使用(例如,允許用戶在應用程序切換活動時繼續發出語音命令),因此其狀態存儲在片段本身之外,並倖免於碎片破壞。如果您的應用需要發布托盤持有的資源及其基礎Spokestack實例,請致電托盤的stop()方法。如果您需要在當前托盤片段實例被破壞之前重新啟用語音控制,則必須調用start() 。
如果您想在過程死亡後保持托盤狀態完整,則可以使用托盤的getState()和loadState()方法將其存儲在其父活動的onSaveInstanceState和onRestoreInstanceState方法中;有關更多詳細信息,請參見他們的文檔。
很有可能,如果您允許用戶與您的應用程序交談,則希望該應用程序回訪。 Tray與Spokestack的TTS服務集成在一起,因此合成音頻與轉錄它一樣容易。
當您擴展TrayActivity時,您必須實現的方法之一是getTrayListener() ,它會創建並返回SpokestackTrayListener 。該界面可以幫助您的應用對托盤接收和產生的事件做出反應。因為每個用例都是唯一的,所以其所有方法都是可選的。我們在這裡感興趣的是onClassification 。在用戶的語音被ASR轉錄並由NLU分類後,該方法被調用。它為您的應用程序提供NLU結果,並要求您返回答复:
override fun onClassification ( result : NLUResult ): VoicePrompt {
return if (result.intent == " your-special-intent " ) {
VoicePrompt ( " I hear you loud and clear " )
} else {
VoicePrompt (
" Sorry; I didn't catch that " ,
expectFollowup = true )
}
} VoicePrompt構造函數中的可選第二個參數讓托盤知道您是否期望響應 - 如果是,則在播放提示後會恢復主動偵聽,以便用戶不必為每次交互使用wakeword或按鈕。
上面的樣本將使您啟動並以最小的大驚小怪,但這遠非Spokestack Tray提供的所有內容。當您構建TrayConfig實例時,您可以選擇配置並提供基礎的Spokestack Builder本身。這將使您可以執行更改ASR提供商之類的事情,為來自單個系統的事件設置自定義偵聽器,並在需要時添加自定義的語音處理組件。您可以在此處閱讀有關Spokestack Builder的信息。
還有許多適用於托盤本身的選項,可通過TrayConfig.Builder實例上的助手方法訪問。但是,在這裡描述每個人都會使此讀書……不過,因此請查看文檔以獲取更多詳細信息。 TrayConfig.Builder上的文檔是[here](https://spokestack.github.io/spokestack-tray-android/spokestack-tray/io.spokestack.tray/-tray/-tray--tray-config/-builder-y-y-builderque。
可以自定義托盤UI的大多數方面。通常,這是通過在庫中設置的覆蓋值來完成的。
一個例外是托盤的方向:它的麥克風按鈕默認為屏幕左側的右面板出現,托盤因此從左側滑入。它還支持右邊的方向,但需要進行兩次更改才能這樣做:
TrayConfig構建器上調用.orientation(TrayConfig.Orientation.RIGHT) 。< include
layout = " @layout/spokestack_tray_fragment "
android : layout_width = " wrap_content "
android : layout_height = " wrap_content "
app : layout_constraintBottom_toBottomOf = " parent "
app : layout_constraintEnd_toEndOf = " parent " />我們只需要在這裡的最後約束。其餘屬性與源佈局相同。但是,由於我們使用的include ,因此覆蓋一個屬性意味著將所有屬性覆蓋;請參閱此處段落末尾的註釋。
基於值的UI自定義如下列出。此處的文件名指出了庫的res/values文件夾中的原始定義,但可以在項目其他地方定義替換。示例應用程序通過在res/values/custom_colors.xml中覆蓋系統消息的文本顏色來說明這一點。
colors.xmlspsk_colorTrayBg :用於托盤的消息流的背景顏色。spsk_colorIcon :用於與spsk_colorBrand對比的圖標的前景顏色。默認為白色。spsk_colorDragHandle :用於托盤大小的拖放手柄的顏色。spsk_colorBrand :UI元素的主要顏色,例如麥克風按鈕和沒有背景的圖標。spsk_colorListenText :“聽力”氣泡中用於文本的顏色。spsk_colorSystemText :系統消息氣泡中的文本顏色。spsk_colorUserText :用戶消息氣泡中的文本使用的顏色。spsk_colorSystemBg :用於系統消息氣泡的背景顏色。spsk_colorUserBg :用於用戶消息氣泡的背景顏色。spsk_colorGradientOne :用於聆聽梯度動畫的開始顏色。默認為spsk_colorBrand 。spsk_colorGradientEnd :用於聆聽梯度動畫的最終顏色。spsk_colorTransparent :透明顏色用作托盤上“背”箭頭的背景色。dimens.xmlspsk_micTabWidth :麥克風選項卡按鈕的寬度。默認為60dp 。spsk_micTabHeight :麥克風選項卡按鈕的高度。默認為80dp ,應以spsk_micTabWidth保持4:3的比例。spsk_listenBubbleWidth :ASR期間出現的聽力氣泡的寬度。默認為120dp ,應與spsk_listenBubbleHeight保持2:1的比例。spsk_listenBubbleHeight :ASR期間出現的聽力氣泡的高度。默認為60dp 。spsk_messageStreamHeight :托盤中消息流的啟動高度。默認為100dp 。spsk_messageStreamMinHeight :可以通過拖放調整托盤大小的最小高度。默認為80dp 。ints.xmlspsk_trayAnimateMs :以毫秒為單位的時間,托盤需要打開或關閉。默認為500 。strings.xmlspsk_listening :主動聆聽期間顯示在托盤中的文本(ASR)。默認為"LISTENING" 。styles.xmlspsk_messageFont :用於在托盤中顯示ASR成績單和系統消息的字體系列。默認為sans-serif (roboto)。 版權2020 Spokestack,Inc。
根據Apache許可證(版本2.0(“許可”)獲得許可;除了符合許可外,您不得使用此文件。您可以在
http://www.apache.org/licenses/LICENSE-2.0
除非適用法律要求或以書面形式同意,否則根據許可證分配的軟件是按照“原樣”分發的,沒有任何明示或暗示的任何形式的保證或條件。請參閱許可證,以獲取執行許可條款和限制的特定語言。