🟥 Untiy工程配置
1️⃣ BDWakeupManager
挂载到GameManager物体上。
using System.Runtime.InteropServices; using UnityEngine; public class GameManager : MonoBehaviour { /// <summary> /// 初始化百度语音唤醒 /// </summary> [DllImport("__Internal")] private static extern void bdWakeUpInit(); /// <summary> /// 开始百度语音唤醒 /// </summary> [DllImport("__Internal")] private static extern void bdStartWakeup(); /// <summary> /// 结束百度语音唤醒 /// </summary> [DllImport("__Internal")] private static extern void bdStopWakeup(); private void Start() { bdWakeUpInit(); bdStartWakeup(); } public void ReceiverBDWakeupResult(string value) { Debug.Log("识别到唤醒词:"+value); } public void StopBDWakup() { bdStopWakeup(); } }
2️⃣ OC文件
放到Unity的Plugins/iOS文件夹下。
可在Xcode中创建,也可直接VSCode等创建。
🚩 BDWakeUp.h
#import <Foundation/Foundation.h> #import "BDSEventManager.h" #import "BDSWakeupDefines.h" @interface BDWakeUp : NSObject @property (strong, nonatomic) BDSEventManager *wakeupEventManager; @end
🚩 BDWakeUp.m
#import "BDSWakeupDefines.h" #import "BDSWakeupParameters.h" #import "BDWakeUp.h" #import "BDSEventManager.h" //更改你的百度语音信息 const NSString* APP_ID = @"xxx"; const NSString* API_KEY = @"xxx"; const NSString* SECRET_KEY = @"xxx"; //必须加这个回调,这样在这定义的方法才会跟 BDSWakeupDefines 中的方法有关系 @interface BDWakeUp()< BDSClientWakeupDelegate> @end @implementation BDWakeUp static BDWakeUp* Instance; void bdWakeUpInit() { if(Instance==NULL) Instance=[BDWakeUp new]; // 创建语音识别对象 Instance.wakeupEventManager = [BDSEventManager createEventManagerWithName:BDS_WAKEUP_NAME]; [Instance configWakeupClient]; [Instance configWakeupSettings]; } void bdStartWakeup() { [Instance.wakeupEventManager setParameter:nil forKey:BDS_WAKEUP_AUDIO_FILE_PATH]; [Instance.wakeupEventManager setParameter:nil forKey:BDS_WAKEUP_AUDIO_INPUT_STREAM]; // 发送指令:加载语音唤醒引擎 [Instance.wakeupEventManager sendCommand:BDS_WP_CMD_LOAD_ENGINE]; // 发送指令:启动唤醒 [Instance.wakeupEventManager sendCommand:BDS_WP_CMD_START]; } void bdStopWakeup() { [Instance.wakeupEventManager sendCommand:BDS_WP_CMD_STOP]; [Instance.wakeupEventManager sendCommand:BDS_WP_CMD_UNLOAD_ENGINE]; } -(void) configWakeupClient { // 设置语音唤醒代理 [Instance.wakeupEventManager setDelegate:Instance]; // 参数配置:离线授权APPID [Instance.wakeupEventManager setParameter:APP_ID forKey:BDS_WAKEUP_APP_CODE]; } -(void) configWakeupSettings { // 参数配置:唤醒语言模型文件路径 NSString* dat = [[NSBundle mainBundle] pathForResource:@"bds_easr_basic_model" ofType:@"dat"]; //设置唤醒词文件路径 NSString* words = [[NSBundle mainBundle] pathForResource:@"WakeUp" ofType:@"bin"]; [Instance.wakeupEventManager setParameter:dat forKey:BDS_WAKEUP_DAT_FILE_PATH]; [Instance.wakeupEventManager setParameter:words forKey:BDS_WAKEUP_WORDS_FILE_PATH]; } //唤醒功能回调接口 - (void)WakeupClientWorkStatus:(int)workStatus obj:(id)aObj { switch (workStatus) { case EWakeupEngineWorkStatusStarted: { //[self printLogTextView:@"WAKEUP CALLBACK: Started.\n"]; break; } case EWakeupEngineWorkStatusStopped: { //[self printLogTextView:@"WAKEUP CALLBACK: Stopped.\n"]; break; } case EWakeupEngineWorkStatusLoaded: { //[self printLogTextView:@"WAKEUP CALLBACK: Loaded.\n"]; break; } case EWakeupEngineWorkStatusUnLoaded: { //[self printLogTextView:@"WAKEUP CALLBACK: UnLoaded.\n"]; break; } case EWakeupEngineWorkStatusTriggered: { //[self printLogTextView:[NSString stringWithFormat:@"WAKEUP CALLBACK: Triggered - %@.\n", (NSString *)aObj]]; UnitySendMessage("GameManager", "ReceiverBDWakeupResult", [(NSString *)aObj UTF8String]); //NSLog((NSString *)aObj); break; } case EWakeupEngineWorkStatusError: { //[self printLogTextView:[NSString stringWithFormat:@"WAKEUP CALLBACK: encount error - %@.\n", (NSError *)aObj]]; break; } } } @end
🚩 配置license
将.m中的license改为你官网的license,记得官网有安卓和IOS之分,安卓和IOS不通用。
🟧 Xcode工程配置
将Unity工程打包,Xcode打开生成的工程。
1️⃣ 配置百度语音SDK
先下载百度语音的IOS版SDK:传送门
🚩 配置SDK文件
1、导入所需的SDK文件
本项目完成语音唤醒,因此我们按百度语音官网文件说明,只将需要的文件配置到我们的工程。
配置的方法按官网文档提示操作。
我们创建的SDK文件夹都放在Libraries下,这是固定位置。
2、配置唤醒文件
1)配置唤醒文件
如上图所示,删掉自带的bds_easr_wakeup_words.dat,
将你导出的唤醒词Wakeup.bin复制进去
2)配置唤醒文件路径
该步我已经帮你做好了,配置的路径就在你的.m文件中,不需要动了。
🚩 备份SDK文件
将你做好的SDK文件夹备份到别的地方。
因为我们每次unity打包(Append方式),都会覆盖原先的xcode工程,导致SDK文件夹丢失(但配置的库、Other Linker Flags等不会丢失)
这就需要我们每次打出Xcode包,都需要手动将SDK文件夹再复制进你的Xcode工程中。
2️⃣ 配置Framework和其他选项
按官网提示,配置所需的Framework
小星河经过测试发现,除了官网提示的Framework,还应配置如下两个 选项,大家一并配置避免踩坑了。
🚩 Other Linker Flags:-lz
Undefined symbols: “_deflate”
Starting with Xcode 7, instead of adding libz.dylib, you should do this:
Go to the project Build Settings tab
Search for Other Linker Flags
Add -lz as a linker flag (see screenshot)
In the Product menu, select Clean before building again
🚩 libsqlite3.tbd
Undefined symbol: _sqlite3_close
🟨 如何复用
1️⃣ 我导出的文件
比如说我导出了这两个文件:
BDVoice:Xcode中的唤醒SDK文件
BDWakeUp.unitypackage:包含了交互的OC文件和C#文件。
2️⃣ 复用方法
- Unity中导入上述的包,调用即可。
- Unity打包后,配置一次 配置Framework和其他选项(后续unity打包都用Append,这样配置的东西不会更改)
- Libraries下放入上方的 BDVoice 文件,每次Unity打包都重新复制进去即可。