
通过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
除非适用法律要求或以书面形式同意,否则根据许可证分配的软件是按照“原样”分发的,没有任何明示或暗示的任何形式的保证或条件。请参阅许可证,以获取执行许可条款和限制的特定语言。