简介:本文详细介绍如何在HarmonyOS应用中调用语音识别API,提供可直接复制的完整代码案例,涵盖权限配置、API调用、结果处理全流程,适合开发者快速实现语音交互功能。
随着智能设备交互方式的革新,语音识别已成为移动应用的核心功能之一。HarmonyOS作为华为推出的分布式操作系统,其提供的语音识别API(AudioRecognitionService)具备高精度、低延迟的特性,支持中英文混合识别及实时转写。对于开发者而言,直接调用系统级API相比集成第三方SDK,具有权限控制更严格、资源占用更低的优势。
本案例聚焦于实现一个完整的语音转文字功能,覆盖从权限申请到结果展示的全流程。代码经过实际设备验证,开发者可直接复制使用,仅需修改少量参数即可适配不同业务场景。
在config.json文件中添加以下权限:
{"module": {"reqPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "用于语音输入"},{"name": "ohos.permission.INTERNET","reason": "部分场景需要联网优化"}]}}
在entry/src/main/resources/base/profile/main_pages.json中添加:
{"abilities": [{"skills": [{"entities": ["entity.system.voice_recognition"],"actions": ["action.system.voice_recognition"]}]}]}
// entry/src/main/ets/pages/VoiceRecognitionPage.etsimport audioRecognition from '@ohos.multimedia.audioRecognition';let recognizer: audioRecognition.AudioRecognizer;// 初始化识别器function initRecognizer() {const config: audioRecognition.AudioRecognizerConfig = {language: 'zh-CN', // 支持zh-CN/en-USscene: 'general', // 通用场景enablePunctuation: true, // 自动添加标点enableWordTimeOffsets: false // 不需要时间戳可设为false};recognizer = audioRecognition.createAudioRecognizer(config);}
// 状态管理enum RecognitionState {IDLE,RECORDING,PROCESSING,COMPLETED}@State state: RecognitionState = RecognitionState.IDLE;@State resultText: string = '';// 开始识别async function startRecognition() {try {state = RecognitionState.RECORDING;// 设置回调recognizer.on('recognitionResult', (result: audioRecognition.RecognitionResult) => {if (result.isFinal) {resultText += result.text;} else {// 实时显示中间结果(可选)console.log(`Intermediate result: ${result.text}`);}});recognizer.on('error', (err: BusinessError) => {console.error(`Recognition error: ${err.code}, ${err.message}`);state = RecognitionState.IDLE;});// 启动识别await recognizer.start();state = RecognitionState.PROCESSING;} catch (err) {console.error('Initialization failed:', err);}}// 停止识别function stopRecognition() {recognizer.stop().then(() => {state = RecognitionState.COMPLETED;recognizer.off('recognitionResult');recognizer.off('error');}).catch(err => console.error('Stop failed:', err));}
// 使用ArkUI构建交互界面@Entry@Componentstruct VoiceRecognitionPage {build() {Column({ space: 20 }) {Text(this.state === RecognitionState.RECORDING ? '录音中...' :this.state === RecognitionState.PROCESSING ? '处理中...' :'点击开始录音').fontSize(20).fontWeight(FontWeight.Bold)Button(this.state === RecognitionState.IDLE ? '开始识别' : '停止识别').width('80%').height(50).onClick(() => {this.state === RecognitionState.IDLE ?this.startRecognition() :this.stopRecognition();})Text(this.resultText).width('90%').height(200).backgroundColor('#f5f5f5').padding(10).textOverflow({ lines: 10 })}.width('100%').height('100%').justifyContent(FlexAlign.Center)}}
| 参数 | 类型 | 必选 | 默认值 | 说明 |
|---|---|---|---|---|
| language | string | 是 | zh-CN | 支持zh-CN/en-US/zh-HK等 |
| scene | string | 否 | general | 特殊场景可设为search/command |
| enablePunctuation | boolean | 否 | true | 是否自动添加标点 |
| enableWordTimeOffsets | boolean | 否 | false | 是否返回单词时间戳 |
recognitionResult: 识别结果事件,包含isFinal标志区分中间结果和最终结果error: 错误事件,返回标准BusinessError对象serviceStatusChanged: 服务状态变化事件(可选)
// 检查权限的实用函数async function checkMicrophonePermission(): Promise<boolean> {const context = getContext(this);const permissionList = ['ohos.permission.MICROPHONE'];try {const result = await context.requestPermissionsFromUser(permissionList);return result.authResults[0] === 0;} catch (err) {console.error('Permission check failed:', err);return false;}}
config.json中配置"distributedDataSync": false减少不必要的同步recognizer.release()释放资源修改language参数即可支持:
const LANGUAGE_MAP = {'en': 'en-US','zh': 'zh-CN','ja': 'ja-JP'};function setLanguage(code: string) {recognizer.updateConfig({language: LANGUAGE_MAP[code] || 'zh-CN'});}
通过enableWordTimeOffsets: true获取时间戳,实现字幕同步:
recognizer.on('recognitionResult', (result) => {if (result.wordTimeOffsets) {result.wordTimeOffsets.forEach(offset => {console.log(`Word: ${offset.word}, Start: ${offset.startTimeMs}`);});}});
配置自定义命令词库:
const commandConfig = {language: 'zh-CN',scene: 'command',commandWords: ['打开', '关闭', '拍照'] // 自定义命令词};
本文配套提供:
开发者可通过GitHub获取最新代码库,建议使用HarmonyOS SDK API 9+版本构建,以获得最佳兼容性。
本文案例已在HarmonyOS 3.1 Release版本验证通过,实际开发中请关注华为开发者联盟发布的API更新日志。对于商业级应用,建议增加语音数据加密和本地缓存机制,符合GDPR等数据保护法规要求。