申请语音权限
ohos.permission.MICROPHONE
初始化引擎
this.asrEngine = await speechRecognizer.createEngine({
language: 'zh-CN',
online: 1
})
设置回调,用来接收语音识别相关的回调信息
export enum VoiceState {
DEFAULT,
VOICING,
VOICEOVER,
}
const _this = this
this.asrEngine.setListener({
onStart(sessionId: string, eventMessage: string) {
console.info(`onStart, sessionId: ${sessionId} eventMessage: ${eventMessage}`);
},
onEvent(sessionId: string, eventCode: number, eventMessage: string) {
console.info(`onEvent, sessionId: ${sessionId} eventCode: ${eventCode} eventMessage: ${eventMessage}`);
},
onResult(sessionId: string, result: speechRecognizer.SpeechRecognitionResult) {
_this.keyword = result.result
_this.onChange(result.result)
console.info(`onResult, sessionId: ${sessionId} sessionId: ${JSON.stringify(result)}`);
},
onComplete(sessionId: string, eventMessage: string) {
_this.onComplete(_this.keyword)
_this.keyword = ''
_this.voiceState = VoiceState.DEFAULT
console.info(`onComplete, sessionId: ${sessionId} eventMessage: ${eventMessage}`);
},
onError(sessionId: string, errorCode: number, errorMessage: string) {
console.error(`onError, sessionId: ${sessionId} errorCode: ${errorCode} errorMessage: ${errorMessage}`);
}
})
设置开始识别的相关参数,调用startListening方法,开始合成
this.asrEngine?.startListening({
sessionId: this.asrEngineId,
audioInfo: {
audioType: 'pcm',
sampleRate: 16000,
soundChannel: 1,
sampleBit: 16
}
})
录制音频
- 配置音频采集参数并创建AudioCapturer实例
const audioStreamInfo: audio.AudioStreamInfo = {
samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_16000,
channels: audio.AudioChannel.CHANNEL_1,
sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
}
const audioCapturerInfo: audio.AudioCapturerInfo = {
source: audio.SourceType.SOURCE_TYPE_MIC,
capturerFlags: 0
}
const audioCapturerOptions: audio.AudioCapturerOptions = {
streamInfo: audioStreamInfo,
capturerInfo: audioCapturerInfo
}
this.audioCapturer = await audio.createAudioCapturer(audioCapturerOptions)
- 调用on('readData')方法,订阅监听音频数据读入回调
this.audioCapturer.on('readData', (buffer) => {
this.asrEngine?.writeAudio(this.asrEngineId, new Uint8Array(buffer))
})
- 调用start()方法进入running状态,开始录制音频
await this.audioCapturer.start()
this.voiceState = VoiceState.VOICING
取消录制
async closeRecord() {
this.audioCapturer?.stop()
this.audioCapturer?.release() 调用release()方法销毁实例,释放资源
this.asrEngine?.finish(this.asrEngineId)
this.asrEngine?.cancel(this.asrEngineId)
this.asrEngine?.shutdown()
if (this.keyword) {
this.voiceState = VoiceState.DEFAULT
this.keyword = ''
} else {
this.voiceState = VoiceState.VOICEOVER
}
}
通过长按属性执行开始录音和取消录音
.gesture(
LongPressGesture()
.onAction(() => {
this.startRecord()
})
.onActionEnd(() => {
this.closeRecord()
})
.onActionCancel(() => {
this.closeRecord()
})
)