语音
简介
语音分为听和说的能力。
听的能力:ASR部分返回通过SkillCallback返回,NLP部分返回通过ModuleCallBack返回。
说的能力:设置中可调整多种发言人。
创建语音服务回调
SkillCallback mSkillCallback = new SkillCallback() { @Override public void onSpeechParResult(String s) throws RemoteException { //语音临时识别结果 } @Override public void onStart() throws RemoteException { //开始识别 } @Override public void onStop() throws RemoteException { //识别结束 } @Override public void onVolumeChange(int volume) throws RemoteException { //识别的声音大小变化 } /** @param status 0 : 正常返回 1 : other返回 2 : 噪音或single_other返回 3 : 超时 4 : 被强制取消 5 : asr结果提前结束,未经过NLU 6 : 全双工语意相同情况下,other返回 */ @Override public void onQueryEnded(int status) throws RemoteException { //status状态 } @Override public void onQueryAsrResult(String asrResult) throws RemoteException { //asrResult :最终识别结果 } }
适用平台:
豹小秘 | mini | 招财豹 | 豹小递max | 豹小秘DP |
是 | 是 | 是 | 是 | 是 |
连接语音服务
final SkillApi skillApi = new SkillApi(); skillApi.connectApi(context, new ApiListener() { @Override public void handleApiDisabled() { } @Override public void handleApiConnected() { //语音服务连接成功,注册语音回调 skillApi.registerCallBack(mSkillCallback); } @Override public void handleApiDisconnected() { //语音服务已断开 } });
适用平台:
豹小秘 | mini | 招财豹 | 豹小递max | 豹小秘DP |
是 | 是 | 是 | 是 | 是 |
TTS播放
方法名称:playText
调用方式
skillApi.playText(text, new TextListener() { @Override public void onStart() { //播放开始 } @Override public void onStop() { //播放停止 } @Override public void onError() { //播放错误 } @Override public void onComplete() { //播放完成 } });
参数
- text:TTS播放文本 注意:不支持播放 json 格式内容,请尽量避免在TTS文本中使用我们无法支持的长字符串,例如超链接、混乱的字符序列等。这可能会导致程序调用失败。单次tts播放建议在300字内,最高不超过1000,如果文本内容太多可以分段tts播放。
适用平台:
豹小秘 | mini | 招财豹 | 豹小递max | 豹小秘DP |
是 | 是 | 是 | 是 | 是 |
停止TTS播放
方法名称:stopTTS
调用方式:
skillApi.stopTTS();
适用平台:
豹小秘 | mini | 招财豹 | 豹小递max | 豹小秘DP |
是 | 是 | 是 | 是 | 是 |
设置拾音模式
机器人拾音模式分为单次拾音和长拾音(持续拾音)两种模式,单次拾音需要每次唤醒机器人后说话。持续拾音则是机器人会在后台一直监听用户说话,并在每次用户结束一句话之后给出回调返回。在API开发中,使用它切换长拾音和单次拾音。
注意:需要在机器人设置里面开启 “语音设别” 与 “持续拾音”开关接口才会生效
方法名称:setRecognizeMode
调用方式:
skillApi.setRecognizeMode(isContinue);
参数
- isContinue:boolean类型,true 持续识别 false 单次识别
适用平台:
豹小秘 | mini | 招财豹 | 豹小递max | 豹小秘DP |
是 | 是 | 是 | 是 | 是 |
关闭或开启语音识别
注意:需要在机器人设置里面开启 “语音识别” 与 “持续拾音”开关接口才会生效
备注:该开关作用是关闭或者开启语音识别,如果关闭,则语音功能完全关闭,语音唤醒等都不再生效;如果需要单次拾音,只需要设置拾音模式(setRecognizeMode)为false,即可用户不唤醒的时候,不拾音。
方法名称:setRecognizable
调用方式:
skillApi.setRecognizable(enable);
参数
- enable:boolean类型,true 开启 false 关闭
适用平台:
豹小秘 | mini | 招财豹 | 豹小递max | 豹小秘DP |
是 | 是 | 是 | 是 | 是 |
设置语音识别区域
方法名称:setAngleCenterRange
调用方式:
skillApi.setAngleCenterRange(angleCenter, angleRange);
参数
- angleCenter:中心角度,机器人收音的中间位置。float类型,[0,360)
- angleRange:区间角度,机器人收音的范围。float类型,[0,120]
例如下图为:angleCenter = 0,angleRange = 20
目前仅1代算法支持该接口设置中心角度,2代算法不支持。
适用平台:
豹小秘1.0 | 豹小秘1.1 | 豹大屏商超版 | 豹花瓶 | 其他平台 |
是 | 是 | 是 | 是 | 否 |
通过文本获取NLP结果
方法名称:queryByText
调用方式:
skillApi.queryByText(text);
参数
- text:需要query的文本,String类型
适用平台:
豹小秘 | mini | 招财豹 | 豹小递max | 豹小秘DP |
是 | 是 | 是 | 是 | 是 |
注意:该接口无返回值,query的结果通过ModuleCallback的onSendRequest,当作一条语音指令返回
此方法可用于采集原始音频,使用的是Android自带的Recorder实现。但因为机器人麦克风阵列的特殊性,只有正确的参数才能从Recorder中获取到数据
//音频采样率(固定16000) private final int AUDIO_RATE = 16000; //Buffer长度 //(请根据实际需求更改长度,buffer越大单帧时间也会越长,若录很短音频有可能出现没能保存的情况) private final int AUDIO_BUF_LEN = 5 * 2 * 16000; //声道(立体声) int channelConfig = AudioFormat.CHANNEL_IN_STEREO; int minRecBufSize = AudioRecord.getMinBufferSize(AUDIO_RATE, channelConfig, AudioFormat.ENCODING_PCM_16BIT); int recBufSize = minRecBufSize * 2; AudioRecord audioRecorder =new AudioRecord(AudioSource.MIC, AUDIO_RATE, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT, recBufSize); ... ... //buffersize //(请根据实际需求更改长度,buffer越大单帧时间也会越长,若录很短音频有可能出现没能保存的情况) mBufferSize = AUDIO_BUF_LEN //数据采集 byte[] tempBufRec = new byte[mBufferSize]; byte[] bfOutLeft = new byte[channelConfig == AudioFormat.CHANNEL_IN_STEREO ? mBufferSize / 2 : mBufferSize]; byte[] bfOutRight = new byte[channelConfig == AudioFormat.CHANNEL_IN_STEREO ? mBufferSize / 2 : mBufferSize]; int readBytes = mAudioRecorder.read(tempBufRec, 0, mBufferSize); if (readBytes == mBufferSize) { deinterleaveData(tempBufRec, bfOutLeft, bfOutRight, minRecBufSize); //分离后的数据,bfOutLeft为最终需要的数据 saveData(bfOutLeft) } ... ... ... //左右声道数据分离 private void deinterleaveData(byte[] src, byte[] leftdest, byte[] rightdest, int len) { int rIndex = 0; int lIndex = 0; for (int i = 0; i < len; i++ ) { leftdest[rIndex] = src[i]; leftdest[rIndex + 1] = src[i + 1]; rIndex = rIndex + 2; rightdest[lIndex] = src[i + 2]; rightdest[lIndex + 1] = src[i + 3]; lIndex = lIndex + 2; i = i + 4; } }
适用平台:
豹小秘 | mini | 招财豹 | 豹小递max | 豹小秘DP |
是 | 是 | 是 | 是 | 是 |
此方法的音频配置参数可用于对接其它音视频sdk,目前用此方法对接的声网、腾讯TRTC都能正常收音。
收音demo代码可以在这里找到:点击这里
注意1:所有参数为固定参数(除BufferSize外),不可变更,否则有可能采集不到数据。
注意2:由于VOIP通话协议的特殊性,机器人暂不支持VOIP通话协议。
VOIP通话协议需要把麦克风当做通讯设备,不是媒体设备。然而机器人的6麦克风阵列只支持作为媒体麦克风使用,不支持作为通讯设备使用。所以基于通讯设备的录音机器人都不支持,包含VOIP
text转mp3
方法名称:textToMp3
调用方式:
boolean status = RobotApi.getInstance().textToMp3(reqId, text, path, name, new CommandListener(){ @Override public void onResult(int result, String message) { if (Definition.RESULT_OK == result) { try { JSONObject jsonObject = new JSONObject(message); int code = jsonObject.optInt("code"); String errMessage = jsonObject.optString("message"); if (code == 0) { mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource(path + File.separator + name); mediaPlayer.prepare(); mediaPlayer.start(); } else{ } } catch (JSONException | IOException e) { e.printStackTrace(); } }else { } } });
参数
- reqId: int类型命令id,传0
- text String类型 需要转换的text
- path String类型 文件路径
- name String类型 文件名
- listener CommandListener 消息回调{“code”:0, “message”:”err msg”}
返回值
- int result 0 命令执行 / -1 没有执行
适用平台:
豹小秘 | mini | 招财豹 | 豹小递max | 豹小秘DP |
是 | 是 | 是 | 是 | 是 |
注意:
- 此接口是测试接口,不要用于正式业务逻辑,TTS内容不受发音人设置、语速设置等所有TTS设置影响,只输出默认音频。
- 调用接口需要app申请sdcard使用权限 ,否则会报错。
- 转换成功会在指定路径下生成/覆盖生成mp3文件
- 请自己管理该文件