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模块实现。核心步骤包括:

  1. 创建AudioCapturer实例配置音频参数
  2. 初始化AudioCapturer获取音频流
  3. 调用AudioCapturer.start()开始录音
  4. 使用@ohos.ai.asr模块创建AsrClient实例
  5. 调用AsrClient.start()启动语音识别
  6. 通过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(语音活动检测)优化,可通过配置pauseresume事件实现。

以上流程覆盖从权限配置到结果获取的核心步骤,实际开发中需根据业务场景调整参数和事件处理逻辑。

回到顶部