HarmonyOS 鸿蒙Next语音转文字ASR功能如何实现?语音识别开发指南
HarmonyOS 鸿蒙Next语音转文字ASR功能如何实现?语音识别开发指南 问题描述
- HarmonyOS 5.0,DevEco Studio 5.0
- 需要实现语音转文字功能,用户说话后自动转换为文本
- 不清楚如何调用系统的语音识别API
- 希望了解完整的ASR开发流程
希望了解HarmonyOS语音识别(ASR)的完整实现方案,包括权限配置、API调用和错误处理
3 回复
1. 权限配置
在 module.json5 中添加麦克风权限:
{
"requestPermissions": [
{
"name": "ohos.permission.MICROPHONE",
"reason": "$string:microphone_permission_reason",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "inuse"
}
}
]
}
2. 完整实现代码
import { speechRecognizer } from '@kit.CoreSpeechKit'
import { abilityAccessCtrl, Permissions } from '@kit.AbilityKit'
import { BusinessError } from '@kit.BasicServicesKit'
@Entry
@Component
struct ASRPage {
@State recognizedText: string = ''
@State isListening: boolean = false
@State statusText: string = '点击开始录音'
private asrEngine: speechRecognizer.SpeechRecognitionEngine | null = null
private sessionId: string = '10000'
aboutToAppear(): void {
this.requestPermission()
}
aboutToDisappear(): void {
this.releaseEngine()
}
// 请求麦克风权限
async requestPermission(): Promise<void> {
const permissions: Permissions[] = ['ohos.permission.MICROPHONE']
const atManager = abilityAccessCtrl.createAtManager()
try {
const result = await atManager.requestPermissionsFromUser(
getContext(this),
permissions
)
if (result.authResults[0] === 0) {
await this.initASREngine()
} else {
this.statusText = '需要麦克风权限'
}
} catch (err) {
console.error('权限请求失败:', err)
}
}
// 初始化语音识别引擎
async initASREngine(): Promise<void> {
const extraParams: Record<string, Object> = {
"locate": "CN",
"recognizerMode": "short"
}
const initParams: speechRecognizer.CreateEngineParams = {
language: 'zh-CN',
online: 1, // 1: 在线识别
extraParams: extraParams
}
try {
this.asrEngine = await speechRecognizer.createEngine(initParams)
this.setListener()
this.statusText = '准备就绪'
} catch (err) {
const error = err as BusinessError
console.error(`引擎初始化失败: ${error.code} - ${error.message}`)
this.statusText = '初始化失败'
}
}
// 设置识别回调
setListener(): void {
if (!this.asrEngine) return
const listener: speechRecognizer.RecognitionListener = {
onStart: (sessionId: string, eventMessage: string) => {
this.isListening = true
this.statusText = '正在听...'
},
onEvent: (sessionId: string, eventCode: number, eventMessage: string) => {
console.info(`事件: ${eventCode} - ${eventMessage}`)
},
onResult: (sessionId: string, result: speechRecognizer.SpeechRecognitionResult) => {
// 获取识别结果
if (result.result) {
this.recognizedText = result.result
}
if (result.isFinal) {
this.statusText = '识别完成'
}
},
onComplete: (sessionId: string, eventMessage: string) => {
this.isListening = false
this.statusText = '点击开始录音'
},
onError: (sessionId: string, errorCode: number, errorMessage: string) => {
this.isListening = false
this.statusText = `错误: ${errorMessage}`
console.error(`识别错误: ${errorCode} - ${errorMessage}`)
}
}
this.asrEngine.setListener(listener)
}
// 开始识别
startRecognition(): void {
if (!this.asrEngine || this.isListening) return
const recognizerParams: speechRecognizer.StartParams = {
sessionId: this.sessionId,
audioInfo: {
audioType: 'pcm',
sampleRate: 16000,
soundChannel: 1,
sampleBit: 16
},
extraParams: {
"vadBegin": 2000,
"vadEnd": 3000,
"maxAudioDuration": 20000
}
}
try {
this.asrEngine.startListening(recognizerParams)
} catch (err) {
console.error('开始识别失败:', err)
}
}
// 停止识别
stopRecognition(): void {
if (!this.asrEngine || !this.isListening) return
try {
this.asrEngine.finish(this.sessionId)
} catch (err) {
console.error('停止识别失败:', err)
}
}
// 释放引擎
releaseEngine(): void {
if (this.asrEngine) {
try {
this.asrEngine.shutdown()
this.asrEngine = null
} catch (err) {
console.error('释放引擎失败:', err)
}
}
}
build() {
Column({ space: 20 }) {
// 状态显示
Text(this.statusText)
.fontSize(16)
.fontColor($r('app.color.text_secondary'))
// 识别结果
Text(this.recognizedText || '识别结果将显示在这里')
.fontSize(18)
.fontColor($r('app.color.text_primary'))
.padding(20)
.backgroundColor($r('app.color.surface'))
.borderRadius(12)
.width('100%')
.minHeight(120)
// 录音按钮
Button() {
Row({ space: 8 }) {
Image($r('app.media.ic_microphone'))
.width(24)
.height(24)
.fillColor(Color.White)
Text(this.isListening ? '停止' : '开始录音')
.fontSize(16)
.fontColor(Color.White)
}
}
.width(160)
.height(48)
.backgroundColor(this.isListening ? '#ef4444' : '#36e27b')
.borderRadius(24)
.onClick(() => {
if (this.isListening) {
this.stopRecognition()
} else {
this.startRecognition()
}
})
}
.width('100%')
.height('100%')
.padding(16)
.backgroundColor($r('app.color.background'))
}
}
更多关于HarmonyOS 鸿蒙Next语音转文字ASR功能如何实现?语音识别开发指南的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
HarmonyOS Next的ASR功能通过@ohos.multimedia.audio模块实现。核心步骤包括:
- 创建AudioCapturer实例配置音频参数
- 初始化AudioCapturer获取音频流
- 调用AudioCapturer.start()开始录音
- 使用@ohos.ai.asr模块创建AsrClient实例
- 调用AsrClient.start()启动语音识别
- 通过on(‘result’)监听识别结果
关键接口:createAudioCapturer()、AsrClient.createAsrClient()。需在module.json5中声明ohos.permission.MICROPHONE权限。
HarmonyOS Next的语音识别(ASR)功能基于@ohos.multimedia.audio和@ohos.ai.speech等套件实现。以下是核心开发流程:
1. 权限与配置
- 权限声明:在
module.json5文件中添加必要权限。
"requestPermissions": [
{
"name": "ohos.permission.MICROPHONE" // 麦克风权限
},
{
"name": "ohos.permission.INTERNET" // 在线识别需网络权限
}
]
- 模型文件:离线识别需将语音模型文件(如
.bin)放入项目resources/rawfile目录。
2. 关键API调用流程
步骤1:初始化语音识别器
import { speech } from '@ohos.ai.speech';
import { audio } from '@ohos.multimedia.audio';
// 创建识别器配置
let config: speech.AsrConfig = {
mode: speech.AsrMode.ONLINE, // 或 OFFLINE
language: 'zh-CN' // 支持中英文
};
// 初始化识别器
let asr = speech.createAsrEngine();
asr.init(config, (err) => {
if (err) {
console.error('初始化失败: ' + JSON.stringify(err));
return;
}
console.info('ASR引擎初始化成功');
});
步骤2:监听识别结果
// 订阅识别结果事件
asr.on('result', (event: speech.AsrResult) => {
console.info('识别结果: ' + event.text);
// event.isFinal 可判断是否为最终结果
});
// 错误监听
asr.on('error', (error: BusinessError) => {
console.error('识别错误: ' + JSON.stringify(error));
});
步骤3:启动与停止识别
// 开始录音识别(需已获麦克风权限)
asr.start({}, (err) => {
if (err) {
console.error('启动失败: ' + JSON.stringify(err));
}
});
// 停止识别
asr.stop((err) => {
if (err) {
console.error('停止失败: ' + JSON.stringify(err));
}
});
3. 音频输入配置(可选高级设置)
若需自定义音频源,可通过音频管理模块配置:
let audioCapturer = await audio.createAudioCapturer({
streamInfo: {
samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_16000,
channels: audio.AudioChannel.CHANNEL_1,
sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
}
});
// 将audioCapturer作为自定义源传递给ASR引擎
4. 错误处理要点
- 权限拒绝:检查动态权限弹窗是否被用户关闭。
- 初始化失败:确认模型文件路径(离线模式)或网络连接(在线模式)。
- 无识别结果:确保麦克风硬件正常,并检查环境噪音干扰。
5. 资源释放
在页面销毁或功能结束时需释放资源:
asr.off('result'); // 取消事件订阅
asr.release(); // 释放引擎资源
注意事项
- 在线识别需确保设备网络通畅,并注意隐私数据合规。
- 离线识别首次加载模型可能有延迟,建议预加载。
- 实时识别场景建议使用
VAD(语音活动检测)优化,可通过配置pause和resume事件实现。
以上流程覆盖从权限配置到结果获取的核心步骤,实际开发中需根据业务场景调整参数和事件处理逻辑。

