腾讯云+小游戏 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)delegate], 实现 TRTCAudioFrameDelegate 协议, 启动腾讯云本端 PCM 数据采集

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];
    }
}

results matching ""

    No results matching ""