三文带你轻松上手鸿蒙的AI语音01-及时语音识别

打印 上一主题 下一主题

主题 830|帖子 830|积分 2492

三文带你轻松上手鸿蒙的AI语音01-及时语音识别

媒介

HarmonyOSNext中集成了强盛的AI功能。Core Speech Kit(基础语音服务)是它提供的浩繁AI功能中的一种。
Core Speech Kit(基础语音服务)集成了语音类基础AI能力,包括文本转语音(TextToSpeech)及语音识别(SpeechRecognizer)能
力,便于用户与设备进行互动,实现将及时输入的语音与文本之间相互转换。
简单来讲Core Speech Kit主要提供了两大语音AI功能:

  • 语音识别
  • 文本转语音
语音识别介绍

语音识别功能可以将一段音频信息(短语音模式不超过60s,长语音模式不超过8h)转换为文本。
此中语音识别又可以实现:

  • 及时语音转文本
  • 声音文件转文本
及时语音转文本

实现流程

先介绍语音识别的流程,后面的笔墨转语音大同小异

  • 申请权限
  • 创建AI语音引擎
  • 设置监听回调
  • 开始监听
   tips: 完备代码在每一个功能的末尾,可以结合封装后的代码来阅读
  申请权限


因为在开辟功能过程中,必要调用手机的麦克风功能。所以必要自动申请权限。

申请权限分成3个步骤

  • 声明权限
  • 查抄是否拥有权限
  • 申请权限
声明权限


  • 在\entry\src\main\module.json5中添加以下设置代码 requestPermissions
    1. {
    2.   "module": {
    3.     ...
    4.     "requestPermissions": [
    5.       {
    6.         "name": "ohos.permission.MICROPHONE",
    7.         "reason": "$string:voice_reason",
    8.         "usedScene": {
    9.           "abilities": [
    10.             "FormAbility"
    11.           ],
    12.           "when": "always"
    13.         }
    14.       }
    15.     ],
    16.   }
    17. }
    复制代码
  • 在\entry\src\main\resources\base\element\string.json 添加 申请原因 voice_reason
    1. {
    2.   "string": [
    3.     {
    4.       "name": "module_desc",
    5.       "value": "module description"
    6.     },
    7.     {
    8.       "name": "EntryAbility_desc",
    9.       "value": "description"
    10.     },
    11.     {
    12.       "name": "EntryAbility_label",
    13.       "value": "label"
    14.     },
    15.     {
    16.       "name": "voice_reason",
    17.       "value": "用于获取用户的录音"
    18.     }
    19.   ]
    20. }
    复制代码
查抄权限

实际开辟中,我们在申请权限之前可以先调用接口checkAccessTokenSync,查抄下是否已经拥有权限。假如没有,则自动申请权限
申请权限

当我们必要申请某个功能的权限时,可以通过调用 requestPermissionsFromUser 来实现
封装好的权限代码

因为HarmonyOSNext中关于权限的代码,都是没有颠末封装的,难以使用。所以这里提供了封装好的版本。
没有封装过的示例代码:


封装好的代码
entry\src\main\ets\utils\permissionMananger.ets
  1. // 导入必要的模块,包括权限管理相关的功能
  2. import { abilityAccessCtrl, bundleManager, common, Permissions } from '@kit.AbilityKit';
  3. export class PermissionManager {
  4.   // 静态方法用于检查给定的权限是否已经被授予
  5.   static checkPermission(permissions: Permissions[]): boolean {
  6.     // 创建一个访问令牌管理器实例
  7.     let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
  8.     // 初始化tokenID为0,稍后将获取真实的tokenID
  9.     let tokenID: number = 0;
  10.     // 获取本应用的包信息
  11.     const bundleInfo =
  12.       bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
  13.     // 设置tokenID为应用的访问令牌ID
  14.     tokenID = bundleInfo.appInfo.accessTokenId;
  15.     // 如果没有传入任何权限,则返回false表示没有权限
  16.     if (permissions.length === 0) {
  17.       return false;
  18.     } else {
  19.       // 检查所有请求的权限是否都被授予
  20.       return permissions.every(permission =>
  21.       abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED ===
  22.       atManager.checkAccessTokenSync(tokenID, permission)
  23.       );
  24.     }
  25.   }
  26.   // 异步静态方法用于请求用户授权指定的权限
  27.   static async requestPermission(permissions: Permissions[]): Promise<boolean> {
  28.     // 创建一个访问令牌管理器实例
  29.     let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
  30.     // 获取上下文(这里假设getContext是一个可以获取到UI能力上下文的方法)
  31.     let context: Context = getContext() as common.UIAbilityContext;
  32.     // 请求用户授权指定的权限
  33.     const result = await atManager.requestPermissionsFromUser(context, permissions);
  34.     // 检查请求结果是否成功(authResults数组中每个元素都应该是0,表示成功)
  35.     return !!result.authResults.length && result.authResults.every(authResults => authResults === 0);
  36.   }
  37. }
复制代码
页面中使用权限代码

Index.ets
  1. import { PermissionManager } from '../utils/permissionMananger'
  2. import { Permissions } from '@kit.AbilityKit'
  3. @Entry
  4. @Component
  5. struct Index {
  6.   // 1 申请权限
  7.   fn1 = async () => {
  8.     // 准备好需要申请的权限 麦克风权限
  9.     const permissions: Permissions[] = ["ohos.permission.MICROPHONE"]
  10.     // 检查是否拥有权限
  11.     const isPermission = await PermissionManager.checkPermission(permissions)
  12.     if (!isPermission) {
  13.       //   如果没权限,就主动申请
  14.       PermissionManager.requestPermission(permissions)
  15.     }
  16.   }
  17.   build() {
  18.     Column() {
  19.       Button("申请权限")
  20.         .onClick(this.fn1)
  21.     }
  22.     .width("100%")
  23.     .height("100%")
  24.     .justifyContent(FlexAlign.Center)
  25.   }
  26. }
复制代码

及时语音识别相关步骤

   以下主要实现及时语音识别
  创建AI语音引擎

创建AI语音引擎主要有以下几个步骤

  • 声明AI语音引擎设置参数,主要有语种、地域信息等

  • 调用开始创建 createEngine 方法开始创建,而且返回 AI语音实例引擎
设置AI语音监听回调

在开始语音识别之前,必要先设置语音识别回调 setListener 。它主要有以下几个分类

  • 开始识别回调
  • 变乱回调
  • 识别结果回调
  • 识别完成回调
  • 识别错误回调

开始监听及时语音

必要先设置监听的参数,便可以调用startListening实现语音识别了
参数设置 此中,及时语音识别和语音文件识别的主要设置在 recognitionMode 字段, 0 体现及时语音识别

封装好的语音识别代码

\entry\src\main\ets\utils\SpeechRecognizerManager.ets
  1. import { speechRecognizer } from '@kit.CoreSpeechKit';
  2. class SpeechRecognizerManager {
  3.   /**
  4.    * 语种信息
  5.    * 语音模式:长
  6.    */
  7.   private static extraParam: Record<string, Object> = { "locate": "CN", "recognizerMode": "long" };
  8.   private static initParamsInfo: speechRecognizer.CreateEngineParams = {
  9.     /**
  10.      * 地区信息
  11.      * */
  12.     language: 'zh-CN',
  13.     /**
  14.      * 离线模式:1
  15.      */
  16.     online: 1,
  17.     extraParams: this.extraParam
  18.   };
  19.   /**
  20.    * 引擎
  21.    */
  22.   private static asrEngine: speechRecognizer.SpeechRecognitionEngine | null = null
  23.   /**
  24.    * 录音结果
  25.    */
  26.   static speechResult: speechRecognizer.SpeechRecognitionResult | null = null
  27.   /**
  28.    * 会话ID
  29.    */
  30.   private static sessionId: string = "asr" + Date.now()
  31.   /**
  32.    * 创建引擎
  33.    */
  34.   private static async createEngine() {
  35.     // 设置创建引擎参数
  36.     SpeechRecognizerManager.asrEngine = await speechRecognizer.createEngine(SpeechRecognizerManager.initParamsInfo)
  37.   }
  38.   /**
  39.    * 设置回调
  40.    */
  41.   private static setListener(callback: (srr: speechRecognizer.SpeechRecognitionResult) => void = () => {
  42.   }) {
  43.     // 创建回调对象
  44.     let setListener: speechRecognizer.RecognitionListener = {
  45.       // 开始识别成功回调
  46.       onStart(sessionId: string, eventMessage: string) {
  47.       },
  48.       // 事件回调
  49.       onEvent(sessionId: string, eventCode: number, eventMessage: string) {
  50.       },
  51.       // 识别结果回调,包括中间结果和最终结果
  52.       onResult(sessionId: string, result: speechRecognizer.SpeechRecognitionResult) {
  53.         SpeechRecognizerManager.speechResult = result
  54.         callback && callback(result)
  55.       },
  56.       // 识别完成回调
  57.       onComplete(sessionId: string, eventMessage: string) {
  58.       },
  59.       // 错误回调,错误码通过本方法返回
  60.       // 如:返回错误码1002200006,识别引擎正忙,引擎正在识别中
  61.       // 更多错误码请参考错误码参考
  62.       onError(sessionId: string, errorCode: number, errorMessage: string) {
  63.       },
  64.     }
  65.     // 设置回调
  66.     SpeechRecognizerManager.asrEngine?.setListener(setListener);
  67.   }
  68.   /**
  69.    * 开始监听
  70.    * */
  71.   static startListening() {
  72.     // 设置开始识别的相关参数
  73.     let recognizerParams: speechRecognizer.StartParams = {
  74.       // 会话id
  75.       sessionId: SpeechRecognizerManager.sessionId,
  76.       // 音频配置信息。
  77.       audioInfo: {
  78.         // 音频类型。 当前仅支持“pcm”
  79.         audioType: 'pcm',
  80.         // 音频的采样率。 当前仅支持16000采样率
  81.         sampleRate: 16000,
  82.         // 音频返回的通道数信息。 当前仅支持通道1。
  83.         soundChannel: 1,
  84.         // 音频返回的采样位数。 当前仅支持16位
  85.         sampleBit: 16
  86.       },
  87.       //   录音识别
  88.       extraParams: {
  89.         // 0:实时录音识别  会自动打开麦克风 录制实时语音
  90.         "recognitionMode": 0,
  91.         //   最大支持音频时长
  92.         maxAudioDuration: 60000
  93.       }
  94.     }
  95.     // 调用开始识别方法
  96.     SpeechRecognizerManager.asrEngine?.startListening(recognizerParams);
  97.   };
  98.   /**
  99.    * 取消识别
  100.    */
  101.   static cancel() {
  102.     SpeechRecognizerManager.asrEngine?.cancel(SpeechRecognizerManager.sessionId)
  103.   }
  104.   /**
  105.    * 释放ai语音转文字引擎
  106.    */
  107.   static shutDown() {
  108.     SpeechRecognizerManager.asrEngine?.shutdown()
  109.   }
  110.   /**
  111.    * 停止并且释放资源
  112.    */
  113.   static async release() {
  114.     SpeechRecognizerManager.cancel()
  115.     SpeechRecognizerManager.shutDown()
  116.   }
  117.   /**
  118.    * 初始化ai语音转文字引擎
  119.    */
  120.   static async init(callback: (srr: speechRecognizer.SpeechRecognitionResult) => void = () => {
  121.   }) {
  122.     await SpeechRecognizerManager.createEngine()
  123.     SpeechRecognizerManager.setListener(callback)
  124.     SpeechRecognizerManager.startListening()
  125.   }
  126. }
  127. export default SpeechRecognizerManager
复制代码
页面中调用语音识别代码

  1. import { PermissionManager } from '../utils/permissionMananger'
  2. import { Permissions } from '@kit.AbilityKit'
  3. import SpeechRecognizerManager from '../utils/SpeechRecognizerManager'
  4. @Entry
  5. @Component
  6. struct Index {
  7.   @State
  8.   text: string = ""
  9.   // 1 申请权限
  10.   fn1 = async () => {
  11.     // 准备好需要申请的权限 麦克风权限
  12.     const permissions: Permissions[] = ["ohos.permission.MICROPHONE"]
  13.     // 检查是否拥有权限
  14.     const isPermission = await PermissionManager.checkPermission(permissions)
  15.     if (!isPermission) {
  16.       //   如果没权限,就主动申请
  17.       PermissionManager.requestPermission(permissions)
  18.     }
  19.   }
  20.   // 2 实时语音识别
  21.   fn2 = () => {
  22.     SpeechRecognizerManager.init(res => {
  23.       console.log("实时语音识别", JSON.stringify(res))
  24.       this.text = res.result
  25.     })
  26.   }
  27.   build() {
  28.     Column({ space: 10 }) {
  29.       Text(this.text)
  30.       Button("申请权限")
  31.         .onClick(this.fn1)
  32.       Button("实时语音识别")
  33.         .onClick(this.fn2)
  34.     }
  35.     .width("100%")
  36.     .height("100%")
  37.     .justifyContent(FlexAlign.Center)
  38.   }
  39. }
复制代码



语音识别结果分析

语音识别成功后的数据格式如下
  1. 实时语音识别 {"isFinal":false,"isLast":false,"result":"是"}
  2. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否"}
  3. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否"}
  4. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否"}
  5. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给"}
  6. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给"}
  7. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给你"}
  8. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给你"}
  9. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给你"}
  10. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给你"}
  11. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给你"}
  12. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给你"}
  13. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给你承"}
  14. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给你承"}
  15. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给你承诺"}
  16. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给你承诺"}
  17. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给你承诺的"}
  18. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给你承诺的"}
  19. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给你承诺的"}
  20. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给你承诺的"}
  21. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给你承诺的"}
  22. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给你承诺的太"}
  23. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给你承诺的太多"}
  24. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给你承诺的太多"}
  25. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给你承诺的太多"}
  26. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给你承诺的太多"}
  27. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给你承诺的太多"}
  28. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给你承诺的太多"}
  29. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给你承诺的太多"}
  30. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给你承诺的太多"}
  31. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给你承诺的太多"}
  32. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给你承诺的太多"}
  33. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给你承诺的太多"}
  34. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给你承诺的太多"}
  35. I     实时语音识别 {"isFinal":false,"isLast":false,"result":"是否给你承诺的太多"}
  36. I     实时语音识别 {"isFinal":true,"isLast":false,"result":"是否给你承诺的太多?"}
  37. I     实时语音识别 {"isFinal":false,"isLast":false,"result":""}
复制代码
此中必要关注的是:

  • 识别功能是持续触发的,当收集到声音时持续触发
  • isFinal 体现一个句子是否结束

  • isLast 体现这一次语音识别是否结束
总结

HarmonyOSNext中集成了强盛的AI功能。Core Speech Kit(基础语音服务)是它提供的浩繁AI功能中的一种。
Core Speech Kit(基础语音服务)集成了语音类基础AI能力,包括文本转语音(TextToSpeech)及语音识别(SpeechRecognizer)能
力,便于用户与设备进行互动,实现将及时输入的语音与文本之间相互转换。
简单来讲Core Speech Kit主要提供了两大语音AI功能:

  • 语音识别
  • 文本转语音
此中语音识别又可以实现:

  • 及时语音转文本
  • 声音文件转文本
本文主要实现了 及时语音转文本声音文件转文本 将会在下文解说。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

刘俊凯

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表