腾讯ASR语音识别接入

腾讯云语音识别(Automatic Speech Recognition,ASR)是将语音转化成文字的PaaS产品,为企业提供精准而极具性价比的识别服务。被微信、王者荣耀、腾讯视频等大量业务使用,适用于录音质检、会议实时转写、语音输入法等多个场景。

官方接入文档地址:

https://cloud.tencent.com/document/product/1093/35722

实时语音识别 Android SDK 及 Demo 下载地址:接入 SDK 下载

接入步骤

1. 下载好aar包添加依赖
implementation(name: 'asr-realtime-release', ext: 'aar')
2. 在 AndroidManifest.xml 添加如下权限:
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
3. 初始化ASR功能,只需要初始化一次
var aaiClient: AAIClient? = null
    fun initAsr() {
        // okhttp全局配置
        ClientConfiguration.setAudioRecognizeConnectTimeout(3000)
        ClientConfiguration.setAudioRecognizeWriteTimeout(5000)

        val appid: Int = ASRConstent.APPID
        val projectId = 0 //此参数固定为0
        val secretId = ASRConstent.SECRETID
        val secretKey = ASRConstent.SECRETKEY

        try {
            /**直接鉴权 */
            // 1、签名鉴权类,sdk中给出了一个本地的鉴权类,您也可以自行实现CredentialProvider接口,在您的服务器上实现鉴权签名
            aaiClient = AAIClient(getApplication(),
                appid,
                projectId,
                secretId,
                LocalCredentialProvider(secretKey)
            )
        } catch (e: ClientException) {
            e.printStackTrace()
        }
    }
4. 开始识别语音
    fun startAsr() {
        try {
            // 5、启动语音识别
            viewModelScope.launch {
                aaiClient?.startAudioRecognize(audioRecognizeRequest,
                    audioRecognizeResultlistener,
                    recognizeStateListener,
                    audioRecognizeConfiguration)
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

创建开始语音识别的各个listener

    // 初始化语音识别请求。
    val audioRecognizeRequest: AudioRecognizeRequest =
            builder
            .pcmAudioDataSource(getRecordDataSource())
            .setEngineModelType("16k_zh") // 设置引擎参数("16k_zh" 通用引擎,支持中文普通话+英文,"16k_en"英文引擎)
            .setFilterDirty(0) // 0 :默认状态 不过滤脏话 1:过滤脏话
            .setFilterModal(2) // 0 :默认状态 不过滤语气词  1:过滤部分语气词 2:严格过滤
            .setFilterPunc(1) // 0 :默认状态 不过滤句末的句号 1:滤句末的句号
            .setConvert_num_mode(1) //1:默认状态 根据场景智能转换为阿拉伯数字;0:全部转为中文数字。
            .setNeedvad(1) //0:关闭 vad,1:默认状态 开启 vad。
            .setWordInfo(1) //0:关闭 vad,1:默认状态 开启 vad。
//          .setNoiseThreshold(0) //是否严格过滤噪音 0不严格, 1 严格
            .build()

        // 初始化语音识别结果监听器。
    val audioRecognizeResultlistener: AudioRecognizeResultListener =
        object : AudioRecognizeResultListener {

            override fun onSliceSuccess(request: AudioRecognizeRequest?,
                                        result: AudioRecognizeResult?,
                                        seq: Int) {
                //返回分片的识别结果,此为中间态结果,会被持续修正, //在这里实时获取识别的结果
                result?.let {
                    
                }
            }

            override fun onSegmentSuccess(request: AudioRecognizeRequest?,
                                          result: AudioRecognizeResult?,
                                          seq: Int) {
                //返回语音流的识别结果,此为稳定态结果,可做为识别结果用与业务
             //在这里获取一句话识别的最终结果
            }

            override fun onSuccess(request: AudioRecognizeRequest?, result: String?) {}

            override fun onFailure(request: AudioRecognizeRequest?,
                                   clientException: ClientException?,
                                   serverException: ServerException?,
                                   response: String?) {
                     // 识别失败
            }
        }

    //自定义识别配置
    val audioRecognizeConfiguration: AudioRecognizeConfiguration =
        AudioRecognizeConfiguration.Builder() //分片默认40ms,可设置40-5000,必须为20的整倍数,
            //分片默认40ms,可设置40-5000,必须为20的整倍数,如果不是,sdk内将自动调整为20的整倍数,例如77将被调整为60,如果您不了解此参数不建议更改
            //.sliceTime(40)
            // 是否使能静音检测,
            .setSilentDetectTimeOut(false)
            //触发静音超时后是否停止识别,默认为true:停止,setSilentDetectTimeOut为true时参数有效
            .setSilentDetectTimeOutAutoStop(true)
            .audioFlowSilenceTimeOut(2000)
            .minVolumeCallbackTime(100)
            .isCompress(true).build()
5. 结束语音识别
    fun stopAsr() {
        viewModelScope.launch {
            if (aaiClient != null) {
                //停止语音识别,等待最终识别结果
                aaiClient?.stopAudioRecognize()
            }
        }
    }
6. 更多设置

6.1 设置状态监听器
AudioRecognizeStateListener 可以用来监听语音识别的状态:


6.2 回声消除

/**
 * 注: 部分android机型可以通过该方式解决回音消除失效的问题
 * https://blog.csdn.net/wyw0000/article/details/125195997
 */
// 1. 设置音频模式为AudioManager.MODE_IN_COMMUNICATION可以起到回音消除的作用
AudioManager audioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);


// 2. 音频源使用MediaRecorder.AudioSource.VOICE_COMMUNICATION可以起到回音消除的作用
int audioSource = MediaRecorder.AudioSource.VOICE_COMMUNICATION;
AudioRecord audioRecord = new AudioRecord(audioSource, sampleRate, channel, audioFormat, bufferSize);
/**
 * 注: 以下两个能力(AcousticEchoCanceler和NoiseSuppressor)和手机硬件能力相关,有些机型(比如小米11)即使isAvailable()==true,回音消除也不生效
 */
// AcousticEchoCanceler回音消除
if (AcousticEchoCanceler.isAvailable()) {
    Log.d(TAG, "AcousticEchoCanceler isAvailable.");
    AcousticEchoCanceler acousticEchoCanceler = AcousticEchoCanceler
            .create(audioRecord.getAudioSessionId());
    int resultCode = acousticEchoCanceler.setEnabled(true);
    if (AudioEffect.SUCCESS == resultCode) {
        Log.d(TAG, "AcousticEchoCanceler AudioEffect SUCCESS");
    }
}


// NoiseSuppressor噪音抑制
if (NoiseSuppressor.isAvailable()) {
    Log.d(TAG, "NoiseSuppressor isAvailable.");
    NoiseSuppressor noiseSuppressor = NoiseSuppressor
            .create(audioRecord.getAudioSessionId());
    int resultCode = noiseSuppressor.setEnabled(true);
    if (AudioEffect.SUCCESS == resultCode) {
        Log.d(TAG, "NoiseSuppressor AudioEffect SUCCESS");
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容