腾讯云游戏多媒体引擎实时语音转文本_音视频解决方案_同尘科技

游戏多媒体引擎 2年前 (2023-03-20) 浏览 82

为方便开发者快速实现实时语音流转文本(以下用 实时 ASR 指代)功能,这里向您介绍实时语音转文本的使用场景以及接入流程。

使用场景

GME 语音转文本服务,可以将 GME SDK 采集的音频流实时识别成文字。该功能可应用于线上桌游场景,如 “你说我猜”“你画我猜” 等猜词游戏场景,玩家开始猜词后,调用 GME SDK实时 ASR 接口,即可将玩家的实时语音流送入 GME 进行实时识别。业务客户端或业务服务端使用 GME 返回的语音转文本识别结果,可进行相关游戏玩法的逻辑实现。说明实时语音流转文本目前仅支持中文识别。

前提条件

已开通实时语音服务:可参见 服务开通指引。已开通语音转文本服务:可参见 服务开通指引。已接入 GME SDK:包括核心接口和实时语音接口的接入,详情可参见 Native SDK 快速接入、Unity SDK 快速接入、Unreal SDK 快速接入。说明实时语音流转文本功能将产生实时语音服务费用、语音转文本服务费用。详情请参见 计费文档。

使用限制

实时语音流转文本默认单账号限制并发连接数为50路,如您有提高并发限制的需求,请提工单 进行咨询。

实现流程

整体流程

实时语音流转文本整体流程如下:


接入流程



接入步骤

1. 启动实时语音流转文本2. 实时语音流转文本回调3. 业务进行后续逻辑判断4. 停止实时语音流转文本

步骤1: 启动实时语音流转文本

在成功进房之后,开启麦克风采集及上行的情况下,调用 StartRealTimeASR 接口可以启动实时语音流转文本功能。iOSAndroid

//启动实时语音流转文本ret = (int)[[ITMGContext GetInstance] StartRealTimeASR];
//启动实时语音流转文本nRet = ITMGContext.GetInstance(getActivity()).StartRealTimeASR();

步骤2: 实时语音流转文本回调

启动实时语音流转文本功能之后,会在回调 ITMG_MAIN_EVENT_TYPE_REALTIME_ASR 中返回对应的信息。

字段 含义
sub_type ITMG_REALTIME_ASR_START:调用 StartRealTimeASR 接口返回值为0ITMG_REALTIME_ASR_CONTENT:转文本内容,可根据不同的slice_type获取不同状态的转文本结果ITMG_REALTIME_ASR_END:调用StopRealTimeASR 函数接口返回值为0,或者在成功启动实时语音转文本,如果中间发生错误,例如服务器返回异常,长时间断网也会返回此回调
index 前一段话的结果在整个音频流中的序号,从0开始逐句递增
result 执行结果,如果为 0 则表示成功
slice_type 转文本状态,业务层可根据需求关注不同状态的返回文本:0:一段话开始转文本 1:一段话转文本中,voice_text_str 为非稳态结果(结果还可能变化)2:一段话转文本结束,voice_text_str 为稳态结果(结果不再变化)识别过程中可能返回的 slice_type 序列可能有:0-1-2:一段话开始识别(slice_type=0)、识别中(可能有多次slice_type=1返回)、识别结束(slice_type=2)0-2:一段话开始识别(slice_type=0)、识别结束(slice_type=2)2:直接返回一段话完整的转文本结果(slice_type=2)
voice_text_str 转文本内容

回调示例代码:iOSAndroid

-(void)OnEvent:(ITMG_MAIN_EVENT_TYPE)eventType data:(NSDictionary *)data{    NSString* log =[NSString stringWithFormat:@"OnEvent:%d,data:%@", (int)eventType, data];    [self showLog:log];    NSLog(@"====%@====",log);    switch (eventType) {                case ITMG_MAIN_EVENT_TYPE_REALTIME_ASR :{            if (ITMG_REALTIME_ASR_START == ((NSNumber *)data[@"sub_type"]).intValue) {                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"实时语音流转文本" message:[NSString stringWithFormat:@"开始 结果:%@ 错误信息:%@",data[@"result"],data[@"error_info"]] delegate:NULL cancelButtonTitle:@"OK" otherButtonTitles:nil];                [alert show];                if (((NSNumber *)data[@"result"]).intValue == 0) {                    isRealTimeASRRunnig = true;                    asrResult = @"";                }            }            else if (ITMG_REALTIME_ASR_CONTENT == ((NSNumber *)data[@"sub_type"]).intValue){
asrResult = [NSString stringWithFormat:@"index:%@ \n slice_type:%@ \n voice_text_str:%@",data[@"index"],data[@"slice_type"],data[@"voice_text_str"]]; NSString *totalString = [NSString stringWithFormat:@" \n \n ASR: \n %@ \n sendType:%d \n sendList:%@ \n recvType:%d \nrecvlist:%@ \n %@",asrResult,sendType,sendArray,recvType,recvArray,tips]; [RunningTipsView Show:totalString parentView:_tipsScrollView]; } else if (ITMG_REALTIME_ASR_END == ((NSNumber *)data[@"sub_type"]).intValue){ UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"实时语音流转文本" message:[NSString stringWithFormat:@"结束 结果:%@ 错误信息:%@",data[@"result"],data[@"error_info"]] delegate:NULL cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; isRealTimeASRRunnig = false; asrResult = @""; } else { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"实时语音流转文本" message:[NSString stringWithFormat:@"未知操作 结果:%@ 错误信息:%@",data[@"result"],data[@"error_info"]] delegate:NULL cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; }``` } }```
}
...//判断回调if(ITMGContext.ITMG_MAIN_EVENT_TYPE.ITMG_MAIN_EVENT_TYPE_REALTIME_ASR== type) {    int code = data.getIntExtra("result", 0);    int sub_type = data.getIntExtra("sub_event", 0);
if (sub_type == ITMGContext.ITMG_REALTIME_ASR_CONTENT){
String totaString = " \n \n ASR: \n "; totaString += data.getIntExtra("index", -1); totaString += " \n slice_type:"; totaString += data.getIntExtra("slice_type", -1); totaString += " \n voice_text_str"; totaString += data.getStringExtra("voice_text_str"); totaString += "\nAudioRoute :" + "\n"; }
String errorInfo = data.getStringExtra("error_info"); String typeInfo ; if (sub_type == ITMGContext.ITMG_REALTIME_ASR_START) { typeInfo = "开始 结果:"; if (code ==0) { isRealTimeASRRunning = true; } } else if(sub_type == ITMGContext.ITMG_REALTIME_ASR_END) { typeInfo = "结束 结果:"; isRealTimeASRRunning = false; } else { typeInfo = "操作unknown 结果:"; } Toast.makeText(getActivity(), String.format("%s %d:错误信息:%s ",typeInfo,code,errorInfo), Toast.LENGTH_SHORT).show();}

步骤3: 业务进行后续逻辑判断

业务客户端在收到 GME 返回的实时语音识别结果后,即可在客户端或服务端根据玩法逻辑进行后续判断。

步骤4: 停止实时语音转文本

通过 StopRealTimeASR 接口可以停止实时语音转文本。示例代码:iOSAndroid

//停止实时语音ASRret = (int)[[ITMGContext GetInstance] StopRealTimeASR];
//停止实时语音ASRint nRet = ITMGContext.GetInstance(getActivity()).StopRealTimeASR();

最佳实践

在一局“你说我猜”游戏中,将所有玩家加入房间。以每一轮新词竞猜作为一个实时语音转文本的会话周期,即:在每一次更换新词时调用“启动实时语音转文本”接口;在当前词语竞猜时间截止时,或有玩家猜中时调用“停止实时语音转文本”接口。

对音视频的解决方案有疑惑?想了解解决方案收费? 联系解决方案专家

腾讯云限时活动1折起,即将结束: 马上收藏

同尘科技为腾讯云授权服务中心,购买腾讯云享受折上折,更有现金返利:同意关联,立享优惠

阿里云解决方案也看看?: 点击对比阿里云的解决方案

- 0人点赞 -

发表点评 (0条)

not found

暂无评论,你要说点什么吗?