在Unity项目中接入思必驰语音SDK,实现类似“语音助手”的功能
Unity 项目接入思必驰语音 SDK 实现“语音助手”功能教程
思必驰(AISpeech,简称 SciSpeech)是国内领先的语音技术提供商,其语音 SDK 支持语音唤醒(Wake-up)、语音合成(TTS)和语音识别(ASR),非常适合在 Unity 项目中构建类似“语音助手”的功能(如 Siri 或小爱同学)。SDK 主要针对 Android/iOS 平台,Unity 接入需通过平台特定插件(aar/jar for Android,framework for iOS)。本教程基于思必驰的 Unity 示例工程(需从官方开源仓库或文档获取),聚焦 Android 平台(iOS 类似,但需额外处理权限)。整个实现包括:唤醒助手、合成响应、识别指令并执行任务(如修改物体颜色)。
注意:
- SDK 需要动态注册 Token(离线可用,但首次需联网)。
- 仅支持特定平台(Android/iOS),PC/Web 需要额外云 API。
- 免费版有调用限制,商用需申请企业版。
- 示例工程:从思必驰开发者社区(https://cloud.aispeech.com/)下载 Demo,或搜索“思必驰 Unity SDK 示例”获取源码。
一、准备工作
- 注册开发者账号:
- 访问思必驰开发者平台(https://cloud.aispeech.com/)。
- 创建账号并登录。
- 创建产品并获取 Token:
- 进入控制台 > “基础技术接入”。
- 选择语音相关服务(语音识别、语音合成、语音唤醒)。
- 进入“授权管理” > 申请 APIKEY。
- 输入 Unity 项目的 Android 包名(Player Settings > Android > Identification > Package Name,例如 com.example.myapp)和 keystore 文件的 SHA256 值。
- 申请后获取 APIKEY(记录 AppID、AppSecret 和其他信息)。
- 生成 keystore 文件并获取 SHA256:
- 在 Unity 中:Edit > Project Settings > Player > Publishing Settings > Create a new keystore。
- 命令行获取 SHA256:
keytool -v -list -keystore your_keystore.keystore
(输入密码后查看 SHA256)。
- 下载 SDK:
- 从思必驰官网下载 Android SDK(aar 文件)和 Unity 示例包(unitypackage)。
- 如果没有示例,从社区文章获取开源工程(例如 Volcengine 开发者社区的 Demo)。
二、Unity 项目配置
- 导入 SDK 和示例包:
- 创建新 Unity 项目(推荐 3D Core 模板)。
- 导入 unitypackage(包含预设脚本和配置)。
- 对于 Android:将思必驰的 aar 文件拷贝到 Assets/Plugins/Android/ 目录。
- 设置 Token:
- 打开示例工程中的“EQGIS > Settings”面板(或类似配置窗口)。
- 填写 AppID、AppSecret 和其他 Token 信息。
- 保存设置(会生成本地缓存,允许离线使用)。
- 平台设置:
- Edit > Project Settings > Player > Android > Other Settings > Target API Level:至少 24+(SDK 要求)。
- 启用 Microphone 权限(Player Settings > Android > Configuration > Internet Access > Require)。
- Build Settings > Platform > Android,构建测试 APK。
三、实现语音唤醒
语音唤醒是“语音助手”的入口,使用预设唤醒词(拼音)触发。
- 修改唤醒词:
- 在脚本中查找唤醒逻辑(示例:SbcWakeupEngine.cs 或类似)。
- 替换默认唤醒词:
csharp:disable-run private string wakeWord = "xiao chi xiao chi"; // 修改为你的拼音唤醒词
- 确保唤醒词符合 SDK 要求(拼音,无特殊字符)。
- 唤醒事件处理:
- 当唤醒时,触发 TTS 响应(如“在呢”)。
- 示例代码(从 Demo 提取):
public class VoiceAssistant : MonoBehaviour { public SbcWakeupEngine wakeupEngine; public SbcTtsEngine ttsEngine; public SbcAsrEngine asrEngine; void Start() { wakeupEngine.StartEngine(); // 启动唤醒监听 wakeupEngine.OnWakeup += OnWakeupDetected; } private void OnWakeupDetected() { ttsEngine.textContent = "我在呢"; // 随机响应 ttsEngine.StartEngine(); // 合成并播放 // TTS 完成后启动 ASR ttsEngine.OnTtsComplete += () => asrEngine.StartEngine(); } }
四、实现语音合成(TTS)
TTS 用于助手反馈,将文本转为语音播放。
- 配置 TTS:
- 在 Settings 中设置 TTS 参数(音色、语速等)。
- 调用 TTS:
- 设置 textContent 并启动引擎。
- 示例:
public class SbcTtsEngine : MonoBehaviour { public string textContent; public event Action OnTtsComplete; public void StartEngine() { // 调用 SDK API 合成(Demo 中封装) SciSpeech.TTS.Synthesize(textContent, OnSynthesisComplete); } private void OnSynthesisComplete(AudioClip clip) { AudioSource.PlayClipAtPoint(clip, Vector3.zero); OnTtsComplete?.Invoke(); } }
- 随机响应:
- 定义响应数组:
csharp public string[] wakeupResponses = { "在呢", "有什么事?" }; textContent = wakeupResponses[UnityEngine.Random.Range(0, wakeupResponses.Length)];
五、实现语音识别(ASR)
ASR 用于识别用户语音指令,实现“语音助手”的交互。
- 配置本地 XBNF 语法:
- SDK 使用 XBNF 文件定义识别语法(aar 中的 local_asr.xbnf)。
- 修改 XBNF:打开 aar(作为 ZIP),编辑 local_asr.xbnf(替换预设指令,如“变红”)。
- 示例 XBNF 内容:
#BNF+IWSR 1.0; !grammar commands; !start <command>; <command>: 变红 | 变蓝 | 跳跃 | 停止;
- 保存后重新打包 aar,或联系 SDK 提供者编译。
- 识别事件处理:
- 启动 ASR 引擎,监听结果。
- 示例:
public class SbcAsrEngine : MonoBehaviour { public event Action<string> OnRecognize; public void StartEngine() { // 调用 SDK 启动识别 SciSpeech.ASR.StartListening(OnRecognitionResult); } private void OnRecognitionResult(string result) { OnRecognize?.Invoke(result); // 触发事件 } }
- 指令匹配:
- 在 VoiceCommandManager 中处理识别结果:
public class VoiceCommandManager : MonoBehaviour { public GameObject cube; // 示例物体 public void Rec(string command) { switch (command) { case "变红": cube.GetComponent<Renderer>().material.color = Color.red; break; case "变蓝": cube.GetComponent<Renderer>().material.color = Color.blue; break; case "跳跃": cube.GetComponent<Rigidbody>().AddForce(Vector3.up * 5f, ForceMode.Impulse); break; default: // 无匹配,TTS 反馈 AudioManager.Instance.ttsEngine.textContent = "没听懂,请再说一遍"; AudioManager.Instance.ttsEngine.StartEngine(); break; } } }
- 在 ASR OnRecognize 事件中调用 Rec(command)。
六、构建“语音助手”完整逻辑
- 整体流程:
- 启动唤醒监听(Awake/Start)。
- 唤醒检测 -> TTS 随机响应(“在呢”)。
- TTS 完成后 -> 启动 ASR 监听(超时重试 2-3 次,TTS 反馈“请再说一遍”)。
- ASR 识别结果 -> 指令匹配执行任务(修改物体、播放动画等)。
- 执行后可选 TTS 反馈(“已完成”)。
- 示例场景:创建一个 Cube,语音说“变红”改变颜色;“跳跃”让它跳起。
- 日志调试:SDK 日志保存在 Android 设备路径:/Android/data/包名/files/runtime.log。
七、注意事项与优化
- 权限:AndroidManifest.xml 添加 Microphone 权限(Unity 自动处理)。
- 离线 vs 在线:本地 ASR 需 XBNF 支持有限词汇;在线 ASR 需网络,延迟更高。
- 性能:移动端测试录音延迟;优化:使用协程管理流程,避免阻塞。
- 扩展:集成 NLP(如百度/腾讯 API)处理复杂指令;添加 VAD(语音活动检测)减少误唤醒。
- 测试:在真机上运行 APK;模拟唤醒需实际语音输入。
- 商用:免费版有限额,检查思必驰定价。
通过以上步骤,可在 Unity 中快速接入思必驰 SDK 实现语音助手。如果需要完整 Demo 源码或 iOS 版本,请从思必驰官网下载示例工程!
“`