火山+小游戏ASR 接入(Android)
SudMGP提供的互动小游戏,你画我猜、你说我猜、数字炸弹, 支持玩家用语音命中,提高可玩性,增强社交属性。接入步骤十分便捷,本文介绍接入SudMGP SDK的ASR功能的步骤。
一、背景
小游戏可以带有语音命中能力,App只要从声网RTC获得特定格式PCM数据,以指定方式传入SudMGP SDK, 即可。 在此以hello-sud-plus-android 为例,hello-sud-plus-android源码地址: https://github.com/SudTechnology/hello-sud-plus-android hello-sud-plus-android以SudMGPWrapper封装集成 SudMGP SDK, 我们建议客户用SudMGPWrapper集成SDK。
二、集成步骤
SDK Github地址:https://github.com/SudTechnology/sud-mgp-android 请使用最新版本,可用Maven方式集成, 以V1.3.2.1154版本举例:
- 1,集成SudMGP SDK: 标准版: implementation 'tech.sud.mgp:SudMGP:1.3.2.1154' Lite版: implementation 'tech.sud.mgp:SudMGP-lite:1.3.2.1154'
- 2,集成语音识别SudASR SDK: implementation 'tech.sud.mgp:SudASR:1.3.2.1154'
说明: 1,SudASR为扩展库,新版SDK运行时会查找该扩展库来实现ASR多语言识别的能力 2,库下载地址:https://github.com/SudTechnology/sud-mgp-android/releases 3,Demo地址:https://github.com/SudTechnology/hello-sud-plus-android
三、小游戏启动语音识别(ASR)
小游戏进入语音识别场景时,会自动启动ASR能力,此时,会向App发送MG_COMMON_GAME_ASR状态, isOpen == true, 见: SudFSMMGListener.onGameMGCommonGameASR
四、App 启动RTC音频流监听
App收到 MG_COMMON_GAME_ASR状态, isOpen == true后, 调用火山接口RTCEngine.registerLocalAudioProcessor(IAudioProcessor audioProcessor, AudioFormat audioFormat), 实现IAudioProcessor 接口对象, 启动火山本端PCM数据采集
1.1.调用 RTCEngine.registerLocalAudioProcessor:
@Override
public void startPCMCapture() {
RTCEngine engine = getEngine();
if (engine != null) {
AudioFormat audioFormat = new AudioFormat(AudioSampleRate.AUDIO_SAMPLE_RATE_16000, AudioChannel.AUDIO_CHANNEL_MONO);
engine.registerLocalAudioProcessor(iAudioProcessor, audioFormat);
}
}
AudioFormat 用来设置PCM数据格式, 调用pushAudio传入的音频切片是从RTC获取的PCM数据 PCM数据格式必须是:采样率:16000, 采样位数:16, 声道数: MONO PCM数据长度可以根据效果调整,长度大: 精确度好但延时长 长度小:延时短但牺牲精确度 可以根据效果调整下面传给pushAudio的音频切片长度
2.2.实现IAudioProcessor接口对象:
private final IAudioProcessor iAudioProcessor = new IAudioProcessor() {
@Override
public int processAudioFrame(IAudioFrame audioFrame) {
ISudAudioEventListener listener = mISudAudioEventListener;
if (listener != null) {
AudioPCMData audioPCMData = new AudioPCMData();
audioPCMData.data = audioFrame.getDataBuffer();
audioPCMData.dataLength = audioFrame.data_size();
listener.onCapturedPCMData(audioPCMData);
}
return 0;
}
};
processAudioFrame()回调方法返回RTC采集的本端PCM数据,处理方法请见下节
3.将RTC采集的PCM数据传给SDK onRecordAudioFrame()回调方法返回本端PCM数据切片,最终调用如下方法将PCM数据传给SDK:
/**
* 音频流数据
*/
public void onCapturedAudioData(AudioPCMData audioPCMData) {
sudFSTAPPDecorator.pushAudio(audioPCMData.data, audioPCMData.dataLength);
}
pushAudio接口可以在工作线程中调用 可以根据效果调整传给pushAudio的音频切片长度
五、App关闭RTC音频流监听
小游戏在命中或超时导致退出语音识别场景后,会向App发送状态提示关闭PCM数据捕获 App收到 MG_COMMON_GAME_ASR状态, isOpen == false后, 调用火山接口RTCEngine.registerLocalAudioProcessor(null, null),关闭火山本端PCM数据采集
@Override
public void stopPCMCapture() {
AsyncCallWrapper.sharedInstance().executeInSerial(new Runnable() {
@Override
public void run() {
RtcEngine engine = getEngine();
if (engine != null) {
/* 关闭获取PCM数据功能 */
engine.registerAudioFrameObserver(null);
}
}
});
}
六、只用ASR玩游戏时
只用ASR玩游戏时,App只需要处理MG_COMMON_GAME_ASR状态,负责开启/关闭本端PCM数据采集。不需要像文字命中一样向游戏发mg_common_key_word_to_hit
七、用文字输入玩小游戏的文字命中场景
有语音识别场景的小游戏,通常也能并行使用文字输入来进行命中。游戏会通过mg_common_key_word_to_hit状态通知App命中场景开始, App会通过回调接口接收: SudFSMMGListener.onGameMGCommonKeyWordToHit(ISudFSMStateHandle handle, SudMGPMGState.MGCommonKeyWordToHit model) 文字命中场景,小游戏分两类 1.让App持有关键字的小游戏,如你画我猜,你说我猜,model.word不为空,App需要在本地判断是否命中,判断命中后,再通过接口方法sudFSTAPPDecorator.notifyAPPCommonSelfTextHitState 通知游戏 2.不让App持有关键字的小游戏,如数字炸弹,model.word为空,App需要每次将文字送给游戏,由游戏判断是否命中
public void sendMsgCompleted(String msg) {
if (msg == null || msg.isEmpty()) {
return;
}
// 数字炸弹
if (sudFSMMGDecorator.isHitBomb() && HSTextUtils.isInteger(msg)) {
sudFSTAPPDecorator.notifyAPPCommonSelfTextHitState(false, null, msg, null, null, null);
return;
}
String keyword = gameKeywordLiveData.getValue();
if (keyword == null || keyword.isEmpty()) {
return;
}
// 你画我猜, 判断是否命中了关键字,这里是contains判断。接入方可根据自身业务使用equals或者其它自定义的条件。
if (msg.contains(keyword)) {
sudFSTAPPDecorator.notifyAPPCommonSelfTextHitState(true, keyword, msg, null, null, null);
gameKeywordLiveData.setValue(null);
}
}