跳到内容 跳到主导航 跳到页脚

语音

简介

语音分为听和说的能力。

听的能力: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

注意:

  1. 此接口是测试接口,不要用于正式业务逻辑,TTS内容不受发音人设置、语速设置等所有TTS设置影响,只输出默认音频。
  2. 调用接口需要app申请sdcard使用权限 ,否则会报错。
  3. 转换成功会在指定路径下生成/覆盖生成mp3文件 
  4. 请自己管理该文件

这篇文章是否有帮助?

-1