HarmonyOS NEXT AI基础语音服务-语音输入

简介: 本案例展示了一个基于AI语音服务的实时语音转文字功能,通过麦克风采集音频并转换为文本。主要步骤包括:申请麦克风权限、初始化语音识别引擎、设置识别回调、配置音频参数及实现UI交互(长按按钮控制录音启停)。代码使用TypeScript编写,涵盖权限管理、引擎生命周期、异常处理等核心环节,确保功能稳定运行。适用于需要实时语音转写的场景,如会议记录、语音输入等。

案例描述

这是一个基于AI基础语音服务实现的实时语音转文字案例,通过麦克风采集音频并实时转换为文本。

在这里插入图片描述

实现步骤:

1. 导入必要模块

import {
    speechRecognizer } from '@kit.CoreSpeechKit'
import {
    abilityAccessCtrl } from '@kit.AbilityKit'
import {
    promptAction } from '@kit.ArkUI'

2. 申请麦克风权限

async requestPermissions() {
   
  const atManager = abilityAccessCtrl.createAtManager();
  const res = await atManager.requestPermissionsFromUser(getContext(), ['ohos.permission.MICROPHONE'])
  this.hasPermissions = 
    res.authResults.every(grantStatus => grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
}

3. 初始化语音识别引擎

async startRecord() {
   
  if (canIUse('SystemCapability.AI.SpeechRecognizer')) {
   
    this.asrEngine = await speechRecognizer.createEngine({
   
      language: 'zh-CN',
      online: 1
    })
    // ...引擎初始化代码...
  }
}
    "requestPermissions": [
      {
   
        "name": "ohos.permission.MICROPHONE",
        "reason": "$string:EntryAbility_label",
        "usedScene": {
   }
      }
    ],

4. 设置语音识别回调

this.asrEngine.setListener({
   
  onResult(sessionId: string, result: speechRecognizer.SpeechRecognitionResult) {
   
    _this.text = result.result  // 实时更新识别结果
    if (result.isLast) {
           // 识别结束处理
      _this.isRecording = false
    }
  },
  // ...其他回调方法...
})

5. 配置音频参数

const audioParam: speechRecognizer.AudioInfo = {
   
  audioType: 'pcm',      // 音频格式
  sampleRate: 16000,     // 采样率
  soundChannel: 1,       // 单声道
  sampleBit: 16          // 采样位数
}

落地代码:

完整组件结构

@Entry
@ComponentV2
struct SpeechRecognizer {
   
  @Local isRecording: boolean = false
  @Local text: string = ''
  hasPermissions: boolean = false
  asrEngine?: speechRecognizer.SpeechRecognitionEngine

  // 组件生命周期方法
  aboutToAppear(): void {
   
    this.requestPermissions()
  }

  // ...其他方法实现...
}

UI交互设计

build() {
   
  Column() {
   
    // 文本展示区域
    Row() {
   
      Text(this.text)
        .width('100%')
    }

    // 长按语音按钮
    Button(this.isRecording ? '开始 说话' : '按住 说话')
      .gesture(LongPressGesture()
        .onAction(() => this.startRecord())
        .onActionEnd(() => this.closeRecord()))
  }
}

总结梳理:

核心点

  • 权限管理:使用AbilityKit动态申请麦克风权限
  • 引擎生命周期:在组件aboutToAppear初始化,操作结束及时释放资源
  • 语音识别流程
    1. 创建识别引擎
    2. 配置音频参数(PCM格式/16K采样率)
    3. 设置结果回调实时更新UI
    4. 长按手势控制识别启停
  • 异常处理:通过promptAction提示权限异常和设备忙状态

完整代码

import {
    speechRecognizer } from '@kit.CoreSpeechKit'
import {
    abilityAccessCtrl } from '@kit.AbilityKit'
import {
    promptAction } from '@kit.ArkUI'


@Entry
@ComponentV2
struct SpeechRecognizer {
   
  @Local isRecording: boolean = false
  @Local text: string = ''
  hasPermissions: boolean = false
  asrEngine?: speechRecognizer.SpeechRecognitionEngine

  aboutToAppear(): void {
   
    // 获取麦克风权限
    this.requestPermissions()
  }

  async requestPermissions() {
   
    const atManager = abilityAccessCtrl.createAtManager();
    const res = await atManager.requestPermissionsFromUser(getContext(), ['ohos.permission.MICROPHONE'])
    this.hasPermissions =
      res.authResults.every(grantStatus => grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
  }

  // 开始麦克风识别
  async startRecord() {
   
    if (canIUse('SystemCapability.AI.SpeechRecognizer')) {
   
      if (!this.hasPermissions) {
   
        return promptAction.showToast({
    message: '麦克风未授权' })
      }
      if (this.isRecording) {
   
        return promptAction.showToast({
    message: '正在录制...' })
      }
      this.isRecording = true
      this.asrEngine = await speechRecognizer.createEngine({
   
        language: 'zh-CN',
        online: 1
      })
      const _this = this
      this.asrEngine.setListener({
   
        onStart(sessionId: string, eventMessage: string) {
   
        },
        onEvent(sessionId: string, eventCode: number, eventMessage: string) {
   
        },
        onResult(sessionId: string, result: speechRecognizer.SpeechRecognitionResult) {
   
          _this.text = result.result
          if (result.isLast) {
   
            _this.isRecording = false
          }
        },
        onComplete(sessionId: string, eventMessage: string) {
   
        },
        onError(sessionId: string, errorCode: number, errorMessage: string) {
   
        }
      })
      const audioParam: speechRecognizer.AudioInfo = {
   
        audioType: 'pcm',
        sampleRate: 16000,
        soundChannel: 1,
        sampleBit: 16
      }
      const extraParam: Record<string, Object> = {
   
        "recognitionMode": 0,
        "vadBegin": 2000,
        "vadEnd": 3000,
        "maxAudioDuration": 20000
      }
      const recognizerParams: speechRecognizer.StartParams = {
   
        sessionId: '10000',
        audioInfo: audioParam,
        extraParams: extraParam
      }
      this.asrEngine.startListening(recognizerParams)
    }
  }

  async closeRecord() {
   
    if (canIUse('SystemCapability.AI.SpeechRecognizer')) {
   
      this.asrEngine?.finish('10000')
      this.asrEngine?.cancel('10000')
      this.asrEngine?.shutdown()
    }
  }

  build() {
   
    Column() {
   
      Row() {
   
        Text(this.text)
          .width('100%')
          .lineHeight(32)
      }
      .alignItems(VerticalAlign.Top)
      .width('100%')
      .layoutWeight(1)

      Button(this.isRecording ? '开始 说话' : '按住 说话')
        .width('100%')
        .gesture(LongPressGesture()
          .onAction(() => {
   
            this.startRecord()
          })
          .onActionEnd(() => {
   
            this.closeRecord()
          })
          .onActionCancel(() => {
   
            this.closeRecord()
          }))

    }
    .padding(15)
    .height('100%')
    .width('100%')
  }
}
相关文章
|
4月前
|
监控 JavaScript 编译器
从“天书”到源码:HarmonyOS NEXT 崩溃堆栈解析实战指南
本文详解如何利用 hiAppEvent 监控并获取 sourcemap、debug so 等核心产物,剖析了 hstack 工具如何将混淆的 Native 与 ArkTS 堆栈还原为源码,助力开发者掌握异常分析方法,提升应用稳定性。
576 64
|
8月前
|
容器
HarmonyOS NEXT仓颉开发语言实战案例:外卖App
仓颉语言实战分享,教你如何用仓颉开发外卖App界面。内容包括页面布局、导航栏自定义、搜索框实现、列表模块构建等,附完整代码示例。轻松掌握Scroll、List等组件使用技巧,提升HarmonyOS应用开发能力。
|
7月前
|
移动开发 前端开发 JavaScript
鸿蒙NEXT时代你所不知道的全平台跨端框架:CMP、Kuikly、Lynx、uni-app x等
本篇基于当前各大活跃的跨端框架的现状,对比当前它们的情况和未来的可能,帮助你在选择框架时更好理解它们的特点和差异。
783 0
|
8月前
|
安全 API 开发工具
【HarmonyOS NEXT】一键扫码功能
这些Kit为我们应用开发提升了极大地效率。很多简单的功能,如果不需要太深的定制化需求,直接调用kit提供的API就可以实现,在android或者ios上需要很多代码才能实现的功能效果。
268 0
|
5月前
|
存储 缓存 5G
鸿蒙 HarmonyOS NEXT端云一体化开发-云存储篇
本文介绍用户登录后获取昵称、头像的方法,包括通过云端API和AppStorage两种方式,并实现上传头像至云存储及更新用户信息。同时解决图片缓存问题,添加上传进度提示,支持自动登录判断,提升用户体验。
243 1
|
5月前
|
存储 负载均衡 数据库
鸿蒙 HarmonyOS NEXT端云一体化开发-云函数篇
本文介绍基于华为AGC的端云一体化开发流程,涵盖项目创建、云函数开通、应用配置及DevEco集成。重点讲解云函数的编写、部署、调用与传参,并涉及环境变量设置、负载均衡、重试机制与熔断策略等高阶特性,助力开发者高效构建稳定云端服务。
543 1
鸿蒙 HarmonyOS NEXT端云一体化开发-云函数篇
|
5月前
|
存储 JSON 数据建模
鸿蒙 HarmonyOS NEXT端云一体化开发-云数据库篇
云数据库采用存储区、对象类型、对象三级结构,支持灵活的数据建模与权限管理,可通过AGC平台或本地项目初始化,实现数据的增删改查及端侧高效调用。
269 1
|
5月前
|
存储 开发者 容器
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
本文介绍了ArkTS语言中的Class类、泛型、接口、模块化、自定义组件及状态管理等核心概念,并结合代码示例讲解了对象属性、构造方法、继承、静态成员、访问修饰符等内容,同时涵盖了路由管理、生命周期和Stage模型等应用开发关键知识点。
457 1
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
|
5月前
鸿蒙 HarmonyOS NEXT星河版APP应用开发-阶段三
本文介绍了UI开发中的样式复用与组件构建技术,涵盖@Extend、@Styles和@Builder的使用方法,并通过Swiper轮播、Scroll滚动、Tabs导航等常用组件实现典型界面效果,结合生肖抽卡、小米轮播、回顶按钮等案例,展示实际应用技巧。
168 1
|
5月前
鸿蒙 HarmonyOS NEXT星河版APP应用开发-阶段二
本文介绍鸿蒙应用界面开发中的弹性布局(Flex)、绝对定位、层叠布局及ArkTS语法进阶,涵盖字符串拼接、类型转换、数组操作、条件与循环语句,并结合B站视频卡、支付宝首页等案例,深入讲解点击事件、状态管理与界面交互功能。
366 1
鸿蒙 HarmonyOS NEXT星河版APP应用开发-阶段二

热门文章

最新文章