思必驰提供了安卓SDK,基于此实现Unity调用安卓SDK的原生接口。
在Unity项目中接入思必驰语音SDK,实现了简单的语音助手Demo。
此文档为工程配套文档。
一、获取思必驰SDK的Token
这里采用动态注册的方式(注册仅为一种鉴权方式,无论哪种鉴权方式,都不会影响语音识别、语音合成、语音唤醒的功能)。
若是要使用其它注册方式,请参考官方文档。https://cloud.aispeech.com/docs/product_authorization
1. 创建产品
-
选择“基础单项技术”
-
右上角添加,“基础技术接入”
-
选择单项技术,勾选所需的“语音识别|语音合成|语音唤醒”相关单项
2. 申请Token
思必驰SDK提供了动态注册的授权方式,这里需要申请所需的Token
- 进入授权管理
- 点击申请APIKEY,输入(你要开发的安卓程序的包名)packagename和(你要开发的安卓程序打包签名时用到的keystore文件)keystore的SHA256值。
- 点击确定,得到APIKEY(记录下红框中的内容,后续备用)
3. 补充:包名获取
原生开发方式获取
获取build.gradle文件中的ApplicationId作为PackageName;如果没有设置ApplicationId,请以AndroidManifest.xml配置文件的package 属性为准。
Unity开发获取
安卓平台下
在ProjectSettings中设置PackageName
4. 补充:生成keystore文件
生成keystore文件
参考文档:https://eqgis.blog.csdn.net/article/details/148040233
对于Unity开发者,建议直接在Unity中创建
5. 补充:获取SHA256值
注意:JDK需配置环境变量
-
检查是否将JDK配置环境变量,输入“keytool”,以下情况为正常。
-
输入命令:keytool -v -list -keystore keystore文件路径
debug.keystore:命令为:keytool -list -v -keystore debug.keystore
自定义的 keystore:命令为:keytool -list -v -keystore apk的keystore
- 查看SHA256,复制内容。在之前的申请APIKEY的地方时使用
二、Unity配置
注意:这里需使用我提供的工程Demo(或是导入我提供的unitypackage)
1. 配置Token
- 打开EQGIS->Settings,填写思必驰的相关Token信息
- 保存修改
2. 创建“Assistant”
- 在场景中创建对象
示例工程中的SampleScene中默认创建,无需额外创建。这里记录仅是作参考
- 检视对象
默认已在对象挂载脚本并绑定
三、语音唤醒
1. 修改唤醒词
唤醒词要求为拼音。
在以下代码位置替换唤醒词即可
四、语音合成
TTS功能(文本转语音)
1. 预设文本转语音
关键步骤:
- 替换textContent
- 启动ttsEngine
代码示例:
entity.ttsEngine.textContent = entity.RandomResponse(entity.wakeupResponses);
entity.status = VoiceAssistantStatus.SPEEKING;
entity.ttsEngine.StartEngine();
补充说明:你可以找到SbcTtsEngine.cs中StartEngine的引用位置。自定义语音反馈,亦或是通过Unity的AudioClip播放预设音频也可以实现语音反馈。
五、语音识别
ASR功能(语音转文本)
1. 修改本地语音识别的预设文本
当前采用本地识别,则需要预先根据XBNF语法,设置文件。
当前安卓原生部分引入的SDK配置的XBNF文件在Assets目录下。
打包后的安卓aar文件,在Unity的Eqgis/Plugins/Android目录下
打开aar(当做一个zip文件打开就行)
- 查看local_asr.xbnf(替换文本内容),需保持替换前后文件同名。
补充:若是你无法通过上述方式替换成功,请将xbnf文件提供给源码作者,重新编译aar。
此外需要注意的是:
2. 识别到语音内容
默认逻辑:唤醒词唤醒->助手答复后->(启动语音识别监听)语音识别
你可以参考以下代码位置的实现修改逻辑
- 在第一次TTS(文本转语音)后,(认定为助手答复)启动语音识别监听。
- 当识别到语音内容时,触发Recognize事件
Unity开发者,在此处处理识别到的语音文本
3. 允许超时的次数设置
ASR识别超时重试,若是超时。可以执行“请再说一遍”(预设文本可在源码中修改)
六、指令任务
在识别到语音内容后,我们得到一个String。通过字符串匹配,我们可实现简单的指令任务。
1. VoiceCommandManager
- 场景中创建一个游戏对象,挂载VoiceCommandManager脚本
- 在ASR识别回调的Recognize(String)事件中,回调出的String就是监听到用户说的话。
- 调用挂载VoiceCommandManager组件的Rec(string)方法
这里实现了根据指令修改Cube颜色的字符串匹配示例,可做参考。
七、运行说明
1. 运行平台
项目采用安卓原生的aar,仅可运行在安卓设备上。
2. 运行日志
接口预留了日志打印方法。Unity项目中配置条件编译。“DEBUG_LOG”
参考EqLog.cs
#if DEBUG_LOG
private static string logFilePath = Application.persistentDataPath + "/runtime.log";
#endif
文件日志保存在安卓根目录/Android/data/你的包名/files/runtime.log文件中。示例如下:
3. 缓存文件
- 思必驰通过Token动态注册(鉴权)时,第一次会联网鉴权,生成缓存文件。后续动态注册会根据缓存文件鉴权。(因此无需再联网)
- 鉴权成功后,语音识别引擎启动时,会根据xbnf文件编译bin文件,保存在缓存文件夹中。(因此第一次启动语音识别引擎时,耗时会受到xbnf文件大小影响)