跳转至

语音识别

语音识别ASR模块

ASR模块主要是语音转文字的过程,支持的交互场景包括单句识别连续识别,支持的开启方式开启录音器输入音频数据流

功能描述

单句识别:识别引擎中的语音边界检测(VAD)结果为完整的一句话时,整个识别过程结束;

连续识别:开启之后会一直处于识别状态,直到外部调用停止才会结束;

录音器:可以直接调用SDK内部录音器录音识别;

音频数据流:可以输入音频数据流开启识别。

备注:所有场景中,ASR通道同一时间只能开启一个,包括语音聊天、ASR识别、绘本内的录音交互。

ASR参数说明

ASR请求参数

AsrRequestConfig为语音识别必要参数,包括输入的音频格式信息,静音检测的配置等参数,具体说明如下:

参数 类型 默认值 说明
asrSrcFormatEnum {PCM, OPUS, OPU, SPEEX} PCM 当不使用内部录音器的时候该值为必填
asrFormatEnum {PCM, OPUS, OPU, SPEEX} PCM 上传至云端的音频格式,目前仅支持PCM、OPUS、SPEEX
asrLanguageEnum {CHINESE, ENGLISH} CHINESE 识别语言类型
asrRateEnum {RATE_8000, RATE_16000} RATE_16000 音频采样率
channel {CHANNEL_IN_MONO, CHANNEL_IN_STEREO} CHANNEL_IN_MONO CHANNEL_IN_MONO:单声道;CHANNEL_IN_STEREO:双声道;目前仅支持CHANNEL_IN_MONO
enableITN boolean true 返回结果的数字格式规则为阿拉伯数字格式(默认true)
enablePunctuation boolean true 是否开启标点
enableVoiceDetection boolean true 是否开启VAD
intermediateResult boolean true 是否打开中间返回结果
maxEndSilence int 2000 VAD末端检测值,单位为毫秒
maxStartSilence int 800 VAD前端检测值,单位为毫秒
enableVolume boolean false 使用内部录音时候,是否返回声音变化
设置为true的时候TuringOSClientAsrListener接口的onVoiceVolume方法才会回调

备注: VAD为语音活动检测(Voice Activity Detectio)又称语音端点检测,语音边界检测。

AsrRequestConfig参数的配置示例:

        AsrRequestConfig.Builder builder = new AsrRequestConfig.Builder();
        builder.asrLanguageEnum(AsrRequestConfig.CHINESE);
        builder.asrFormatEnum(AsrRequestConfig.PCM);
        builder.asrSrcFormatEnum(AsrRequestConfig.PCM);
        builder.asrRateEnum(AsrRequestConfig.RATE_16000);
        builder.enablePunctuation(false);
        builder.intermediateResult(true);
        builder.maxEndSilence(3000);
        /**
         * 目前仅支持CHANNEL_IN_MONO
         */
        builder.channel(AsrRequestConfig.CHANNEL_IN_MONO);
        builder.enableVoiceDetection(false);
        builder.enableVolume(true);

        AsrRequestConfig asrRequestConfig = builder.build();

ASR识别结果

TuringOSClientAsrListener

该接口为ASR识别结果回调接口,具体如下:

public interface TuringOSClientAsrListener {

    /**
     * 当使用SDK录音器开启的识别,此方法会在录音开始后回调
     * 一般用于UI显示开始录音,更新UI需要放到主线程,不能再此回调方法中更新
     */
    void onRecorderStart();

    /**
     * asr识别停止,包括请求Error或者外部调用client.stopAsr都会回调
     */
    void onStop();

    /**
     * 允许输入音频数据流,在该方法回调之后开始调用sendAudio
     */
    void onStreamOpen();

    /**
     *
     * 请求结果返回
     *
     * @param code 具体参考code说明
     * @param result 返回的json字符串
     * @param isLast Asr识别结果;last : 是否是最终结果
     * @param baseResp  返回的json字符串转换的Java对象
     */
    void onResult(int code, String result, boolean isLast, BaseResp baseResp);

    /**
     * Asr识别单论交互倒计时 最大值20s
     * 单句语音识别场景下的倒计时限制,连续识别不受影响
     *
     * @param second
     */
    void onTimer(int second);

    /**
     * 请求发生错误的信息
     *
     * @param code
     * @param msg
     */
    void onError(int code, String msg);

    /**
     * 使用内部录音时,返回声音音量变化,该方法的回调需要先设置参数enableVolume为true
     *
     */
    void onVoiceVolume(int i);

}

onStop特殊说明

  • 表示此次识别结束,可以开启下一次识别;
  • 单句识别场景中,当云端识别结果或者本地VAD(静音检测)判定为一句话完整识别后,该方法会在识别结果输出完成后回调,表示此次识别结束;
  • 所有场景中,ASR通道同一时间只能开启一个,包括语音聊天、ASR识别、绘本内的录音交互;
  • 所有场景中,外部调用stop或者release时,SDK内部数据处理完毕后会回调onStop,所以不要在onStop做太多操作。

其他说明

  • onRecorderStart:只有当使用SDK内部录音器开启识别时,该方法才会回调;
  • onStreamOpen:只有当使用音频流数据输入开启识别时,该方法才会回调;

  • onTimer:该方法主要是针对单句语音识别场景下的倒计时限制,单句识别一般为聊天场景,每句话都有一个而明确的结束节点;

  • onVoiceVolume:该方法回调需要先配置参数enableVolume为true,具体参数说明请参考AsrRequestConfig说明
  • onStop:表示此次识别结束,可以开启下一次识别;
  • SDK中使用到ASR录音功能(语音识别、语音对话、口语评测)的所有模块都会使用该接口回调结果;
  • 每一次开启Asr之后,不管是外部调用Stop还是内部识别完成,都会回调onStop方法,只有在onStop成功回调之后才正常开启下一次识别
  • BaseResp请参考ASR识别输出说明。

ASR识别调用

一、SDK录音识别

方法一:使用默认参数创建录音器

    /**
     * 
     * @param isLoop 是否循环录音识别
     * @param listener TuringOSClientAsrListener
     */
    public void startAsrWithRecorder(boolean isLoop, TuringOSClientAsrListener listener)

    //调用
    turingOSClient.startAsrWithRecorder(false, listener);

方法二:指定AsrRequestConfig参数,isLoop参数同上

    /**
     * 
     * @param isLoop 是否循环录音识别
     * @param asrRequestConfig  AsrRequestConfig
     * @param listener TuringOSClientAsrListener
     */
    public void startAsrWithRecorder(boolean isLoop, final AsrRequestConfig asrRequestConfig, final TuringOSClientAsrListener listener)

    //调用
    turingOSClient.startAsrWithRecorder(false, asrRequestConfig, listener);

参数说明

  • isLoop是区别单句语音识别和连续识别的标志。当isLoop=false时为单句识别,反之则为连续识别;

  • 在使用内部录音器时,asrRequestConfig中的asrSrcFormatEnum只能为PCM,其次asrRequestConfig中的asrFormatEnum取值只能为PCM或者OPUS。asrFormatEnum值为PCM时,会将录音的PCM数据上传进行识别,当配置为OPUS时,则会经过SDK内部编码为OPUS再上传至云端识别;

  • 当isLoop为true时,开启Vad时(enableVoiceDetection参数为true),触发Vad静音检测则结束本次录音;未开启Vad时,识别结果完整返回时(asrResponse中的state=200时,具体见ASR识别输出说明),结束本次识别。当isLoop为false时,ASR会一直处于识别状态,直到外部调用stopAsr方法。

二、音频流识别

方法说明

    /**
     * 
     * @param asrRequestConfig asrRequestConfig
     * @param listener TuringOSClientAsrListener
     */
    public void initAsrStream(final AsrRequestConfig asrRequestConfig, final TuringOSClientAsrListener listener)

        /**
     *
     * @param isAutoStop 当isAutoStop为false时,和上面没有isAutoStop一样,当时设置isAutoStop为
     *     true时,输入的音频数据在识别到完整的结果后会自动丢弃剩余数据
     * @param asrRequestConfig asrRequestConfig
     * @param listener TuringOSClientAsrListener
     */
    public void initAsrStream(boolean isAutoStop, final AsrRequestConfig asrRequestConfig, final TuringOSClientAsrListener listener)

     /**
     * 
     * @param dataBuffer 音频数据,长度不得大于1280个byte,并且要求为320的整数倍
     * @param length 音频数据长度
     */
    public void sendAudio(byte[] dataBuffer, int length)

参数说明

  • isAutoStop主要时为了区别单句语音识别还是连续识别。当isAutoStop=true时为单句识别,反之则为连续识别。

调用示例

    //第一步:参数配置
    AsrRequestConfig.Builder builder = new AsrRequestConfig.Builder();
    builder.asrLanguageEnum(AsrRequestConfig.CHINESE);

    //必须参数,代表最终上传服务器请求的格式参数,必须与传入可支持的格式对应
    builder.asrFormatEnum(AsrRequestConfig.OPUS);

    //必须参数,代表输入音频源的格式
    builder.asrSrcFormatEnum(AsrRequestConfig.OPUS);
    builder.asrRateEnum(AsrRequestConfig.RATE_16000);
    builder.enablePunctuation(false);
    builder.maxEndSilence(3000);
    builder.channel(AsrRequestConfig.CHANNEL_IN_MONO);

    AsrRequestConfig asrRequestConfig = builder.build();
    turingOSClient = TuringOSClient.getInstance(this, userData);    


    //第二步:初始化
    /**
     *
     * @param asrRequestConfig AsrRequestConfig
     * @param listener TuringOSClientAsrListener
     */
    turingOSClient.initAsrStream(asrRequestConfig, new TuringOSClientAsrListener() {

            @Override
            public void onRecorderStart() {

            }

            @Override
            public void onStop() {
               //stop后停止本轮的音频数据发送
            }

            @Override
            public void onStreamOpen() {
                //第二步:再数据流回调方法中开始输入数据
                startStreamPcmInput();
            }


            @Override
            public void onResult(int code, String result, boolean isLast,BaseResp   baseResp) {
                //识别结果

            }

            @Override
            public void onTimer(int second) {

            }

            @Override
            public void onError(int code, String msg) {

            }
        });



      //注意事项:在音频流关闭之后调用turingOSClient.stopAsr();
      private void startStreamPcmInput() {
            new Thread(pcmRun).start();
        }
        //注意事项:在音频流关闭之后调用turingOSClient.stopAsr();
      private Runnable pcmRun = new Runnable() {
        @Override
        public void run() {
            try {
                InputStream inputStream = getAssets().open("sample.pcm");
                while (!Thread.currentThread().isInterrupted()){
                    byte[] buffer = new byte[320];
                    int length = inputStream.read(buffer);
                    if (length == -1) {
                        turingOSClient.stopAsr();
                        break;
                    }
                    if (length == 320) {
                        turingOSClient.sendAudio(buffer, length);
                    } else {
                        turingOSClient.sendAudio(Arrays.copyOf(buffer, length), length);
                    }
                }
                inputStream.close();
                Log.i(TAG, "testFile: 流输入完成");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };

音频流识别说明

  • 在调用流输入方式时,asrFormatEnum和asrSrcFormatEnum为必须参数

  • 当asrSrcFormatEnum为PCM,即将要输入的音频数据源为PCM时,对应的asrFormatEnum的可能值只能为PCM或者OPUS,同内部录音器,SDK内部默认支持OPUS编码;

  • 当asrSrcFormatEnum为其他值时,对应的asrFormatEnum必须与asrSrcFormatEnum相同。

ASR识别输出

返回的结果在TuringOSClientAsrListener的onResult方法中,其中String result为json字符串,BaseResp baseResp为result转换为json后的java对象。

json示例如下:

{
    "asrResponse":{
        "binarysId":"0a2071a8-2bb6-4fae-b109-32bee00c1726",
        "state":200,
        "value":"深圳明天的天气"
    },
    "code":200,
    "globalId":"98412368730000000",
    "message":"success"
}

BaseResp说明

参数 类型 说明
code int 请求响应Code,具体可参考Code说明
message String 请求响应的消息描述
asrResponse AsrResponse(Object)
  • 当code=200表示识别成功;
  • 当code=5002时表示没有任何有效人声输入;
  • 其他code表示识别异常,参考Code说明

AsrResponse参数说明

参数 类型 是否必须 取值范围 说明
binarysId String Y - asr二进制参数Id
value String Y - asr识别内容
state int Y 200,210 210:asr识别中间结果返回,200:asr识别完成结果
  • AsrRequestConfig的参数intermediateResult设置为true之后,语音识别会实时返回识别结果;

  • state=210表示此次返回的识别结果为中间结果,此时onResult方法中的isLast为fasle;

  • state=200表示此次返回的识别结果为最终结果,此时onResult方法中的isLast为true。

安全停止ASR

该方法会完整发送完音频数据,得到完整的识别结果后释放Asr通道,会有一定的延时,释放成功后会回调onStop方法。

    /**
     *方法说明
     *该方法会将音频数据池中的数据发送完毕后正常结束Asr引擎
     *
     */
     public void stopAsr()

     //调用示例
     turingOSClient.stopAsr();
  • 该方法针对所有的asr通道生效。

释放ASR

该方法会丢弃正在识别的数据以及结果,直接释放Asr通道,释放成功之后会回调onStop方法。

    /**
     *该方法会强制停止释放Asr引擎
     *
     */
     public void releaseAsr()

     //调用示例
     turingOSClient.releaseAsr();
  • 该方法针对所有的asr通道生效,包括ASR识别、语音对话录音方式、绘本内录音交互、口语评测录音等模块。