腾讯云语音识别(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");
}
}