腾讯云+小游戏 ASR 接入(iOS)
SudGIP 提供的互动小游戏,你画我猜、你说我猜、数字炸弹, 支持玩家用语音命中,提高可玩性,增强社交属性。接入步骤十分便捷,本文介绍接入 SudGIP SDK 的 ASR 功能的步骤。
一、背景
小游戏可以带有语音命中能力,App 只要从即构 RTC 获得特定格式 PCM 数据,以指定方式传入 SudGIP SDK, 即可。 在此以 hello-sud-plus-ios 为例,hello-sud-plus-ios 源码地址: https://github.com/SudTechnology/hello-sud-plus-ios hello-sud-plus-ios 以 SudGIPWrapper 封装集成 SudGIP SDK, 我们建议客户用 SudGIPWrapper 集成 SDK。
二、集成步骤
SDK Github 地址:https://github.com/SudTechnology/sud-mgp-ios 请使用最新版本, 可用 CocoaPods 方式集成
三、小游戏启动语音识别(ASR)
小游戏进入语音识别场景时,会自动启动 ASR 能力,此时,会向 App 发送 MG_COMMON_GAME_ASR 状态, isOpen 是 true, 见 SudFSMMGListener 协议的:
- (void)onGameMGCommonGameASR:(nonnull id <ISudFSMStateHandle>)handle model:(MGCommonGameASRModel *)model;
四、App 启动 RTC 音频流监听
App 收到 MG_COMMON_GAME_ASR 状态, isOpen == YES 后, 调用腾讯云接口[TRTCCloud setAudioFrameDelegate:(nullable id
1.调用 [TRTCCloud setAudioFrameDelegate:]
/// 开始原始音频采集
- (void)startPCMCapture {
TRTCCloud *engine = [self getEngine];
if (engine != nil) {
TRTCAudioFrameDelegateFormat *format = [[TRTCAudioFrameDelegateFormat alloc] init];
format.sampleRate = TRTCAudioSampleRate16000;
format.channels = 1;
format.samplesPerCall = 160;
[engine setCapturedRawAudioFrameDelegateFormat:format];
/* 设置原始音频数据回调 */
[engine setAudioFrameDelegate:self];
}
}
setCapturedRawAudioFrameDelegateFormat 方法设置 PCM 数据格式, 调用 pushAudio 传入的音频切片是从 RTC 获取的 PCM 数据 PCM 数据格式必须是:采样率:16000, 采样位数:16, 声道数: MONO PCM 数据长度可以根据效果调整,长度大: 精确度好但延时长 长度小:延时短但牺牲精确度 上面代码 format.samplesPerCall = 160 代表音频切片是 10ms,可以根据效果调整传给 pushAudio 的音频切片长度
2.TRTCAudioFrameDelegate 协议
#pragma mark -------------- TRTCAudioFrameDelegate -----------------
- (void)onCapturedRawAudioFrame:(TRTCAudioFrame *)frame {
NSData *audioData = frame.data.copy;
[HSThreadUtils runOnUiThread:^{
if (self.mISudAudioEventListener != nil && [self.mISudAudioEventListener respondsToSelector:@selector(onCapturedPCMData:)]) {
[self.mISudAudioEventListener onCapturedPCMData:audioData];
}
}];
}
onCapturedRawAudioFrame 回调方法返回 RTC 采集的本端 PCM 数据,处理方法请见下节
3.将 RTC 采集的 PCM 数据传给 SDK onCapturedAudioData 回调方法返回本端 PCM 数据切片,最终调用如下方法将 PCM 数据传给 SDK:
/**
* 音频流数据
*/
- (void)onCapturedPCMData:(NSData *)data {
[self.sudFSTAPPDecorator pushAudio:data];
}
pushAudio 接口可以在工作线程中调用 可以根据效果调整传给 pushAudio 的音频切片时间长度
五、App 关闭 RTC 音频流监听
小游戏在命中或超时导致退出语音识别场景后,会向 App 发送状态提示关闭 PCM 数据捕获 App 收到 MG_COMMON_GAME_ASR 状态, isOpen == NO 后, 调用腾讯云接口[TRTCCloud setAudioFrameDelegate:nil], 关闭腾讯云本端 PCM 数据采集
/// 结束原始音频采集
- (void)stopPCMCapture {
TRTCCloud *engine = [self getEngine];
if (engine != nil) {
/* 置空原始音频数据回调 */
[engine setAudioFrameDelegate:nil];
}
}
六、只用 ASR 玩游戏时
只用 ASR 玩游戏时,App 只需要处理 MG_COMMON_GAME_ASR 状态,负责开启/关闭本端 PCM 数据采集。不需要像文字命中一样向游戏发 mg_common_key_word_to_hit
七、用文字输入玩小游戏的文字命中场景
有语音识别场景的小游戏,通常也能并行使用文字输入来进行命中。游戏会通过 mg_common_key_word_to_hit 状态通知 App 命中场景开始, App 会通过 SudFSMMGListener 协议接收:
- (void)onGameMGCommonKeyWordToHit:(nonnull id <ISudFSMStateHandle>)handle model:(MGCommonKeyWrodToHitModel *)model;
文字命中场景,小游戏分两类 1.让 App 持有关键字的小游戏,如你画我猜,你说我猜,model.word 不为空,App 需要在本地判断是否命中,判断命中后,再通过接口方法[SudFSTAPPDecorator notifyAppComonDrawTextHit] 通知游戏 2.不让 App 持有关键字的小游戏,如数字炸弹,model.word 为空,App 需要每次将文字送给游戏,由游戏判断是否命中
- (void)handleGameKeywordHitting:(NSString *)content {
// 数字炸弹
if (self.sudFSMMGDecorator.isHitBomb) {
if ([self isPureInt:content]) {
/// 关键词命中
[self.sudFSTAPPDecorator notifyAppComonDrawTextHit:false keyWord:@"" text:content];
}
return;
}
// 你画我猜
if (self.sudFSMMGDecorator.keyWordHiting == YES && [content isEqualToString:self.sudFSMMGDecorator.drawKeyWord]) {
/// 关键词命中
[self.sudFSTAPPDecorator notifyAppComonDrawTextHit:true keyWord:self.sudFSMMGDecorator.drawKeyWord text:self.sudFSMMGDecorator.drawKeyWord];
}
}