三文带你轻松上手鸿蒙的AI语音02-声音文件转文本

2024-09-07 04:52

本文主要是介绍三文带你轻松上手鸿蒙的AI语音02-声音文件转文本,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

三文带你轻松上手鸿蒙的AI语音02-声音文件转文本

接上一文

前言

本文主要实现 使用鸿蒙的AI语音功能将声音文件识别并转换成文本

实现流程

  1. 利用AudioCapturer 录制声音,生成录音文件
  2. 利用AI语音功能,实现识别

image-20240829002516961

两个录音库介绍

HarmonyOS NEXT 应用开中,实现录音的两个核心库分别为

  1. AudioCapturer
  2. AVRecorder

AVRecorder录制出来的声音封装格式只能是aac,这个文件格式我们的AI语音引擎不支持,AI语音引擎只支持pcm格式,而 AudioCapturer录制的声音封装格式则是pcm。因此我们选择使用 AudioCapturer 来录制声音

AudioCapturer 介绍

AudioCapturer是音频采集器,用于录制PCM(Pulse Code Modulation)音频数据,适合有音频开发经验的开发者实现更灵活的录制功

能。

状态变化示意图

img

能看到使用 AudioCapturer 的主要流程为

  1. 创建 AudioCapturer 实例
  2. 调用 start 方法开始录音
  3. 调用stop方法停止录音
  4. 调用release方法释放实例

创建 AudioCapturer 实例

文末会提供封装好,可以直接使用的代码 下面的代码示例都是基于封装好的代码进行的

我们通过调用 createAudioCapturer方法实现创建 AudioCapturer 实例,其中该方法需要传递相关参数。

image-20240829003846034

调用 start 方法开始录音

开始调用 start 方法时,需要准备相关数据。如

  1. 提供录音的文件名,可以自定义
  2. 写入录音数据的回调函数(在录制声音的过程中持续触发)
  3. 调用start方法

image-20240829004425443

调用stop方法停止录音

调用stop方法则相对简单,直接调用即可

image-20240829004829409

调用release方法释放实例

同理

image-20240829004910026

封装好的录音代码

\entry\src\main\ets\utils\AudioCapturerManager.ets 下面是这个类的属性和方法的总结:

属性

  • static audioCapturer:
    • 类型是 audio.AudioCapturer | null,是一个静态属性,用于存储当前的音频捕获器实例。
  • private static recordFilePath:
    • 类型是 string,是一个静态私有属性,用于存储录音文件的路径。

方法

  • static async createAudioCapturer():
    • 如果 audioCapturer 已经存在,则直接返回该实例;否则创建一个新的音频捕获器实例,并设置其音频流信息和音频捕获信息,然后创建并返回新的实例。
  • static async startRecord(fileName: string):
    • 异步静态方法,用于启动录音过程。首先调用 createAudioCapturer() 方法确保有一个音频捕获器实例。之后初始化缓冲区大小,并打开或创建一个指定名称的 .wav 录音文件。定义一个读取数据的回调函数,用于将捕获到的数据写入文件中。最后开始录音,并记录下录音文件的路径。
  • static async stopRecord():
    • 异步静态方法,用于停止录音过程。停止音频捕获器的工作,释放其资源,并清除 audioCapturer 实例。
// 导入音频处理模块
import { audio } from '@kit.AudioKit';
// 导入文件系统模块
import fs from '@ohos.file.fs';// 定义一个管理音频录制的类
export class AudioCapturerManager {// 静态属性,用于存储当前的音频捕获器实例static audioCapturer: audio.AudioCapturer | null = null;// 静态私有属性,用于存储录音文件的路径private static recordFilePath: string = "";// 静态异步方法,用于创建音频捕获器实例static async createAudioCapturer() {if (AudioCapturerManager.audioCapturer) {return AudioCapturerManager.audioCapturer}// 设置音频流信息配置let audioStreamInfo: audio.AudioStreamInfo = {samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_16000, // 设置采样率为16kHzchannels: audio.AudioChannel.CHANNEL_1, // 设置单声道sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, // 设置样本格式为16位小端encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW // 设置编码类型为原始数据};// 设置音频捕获信息配置let audioCapturerInfo: audio.AudioCapturerInfo = {source: audio.SourceType.SOURCE_TYPE_MIC, // 设置麦克风为音频来源capturerFlags: 0 // 捕获器标志,此处为默认值};// 创建音频捕获选项对象let audioCapturerOptions: audio.AudioCapturerOptions = {streamInfo: audioStreamInfo, // 使用上面定义的音频流信息capturerInfo: audioCapturerInfo // 使用上面定义的音频捕获信息};// 创建音频捕获器实例AudioCapturerManager.audioCapturer = await audio.createAudioCapturer(audioCapturerOptions);// 返回创建的音频捕获器实例return AudioCapturerManager.audioCapturer;}// 静态异步方法,用于启动录音过程static async startRecord(fileName: string) {await AudioCapturerManager.createAudioCapturer()// 初始化缓冲区大小let bufferSize: number = 0;// 定义一个内部类来设置写入文件时的选项class Options {offset?: number; // 文件写入位置偏移量length?: number; // 写入数据的长度}// 获取应用的文件目录路径let path = getContext().filesDir;// 设置录音文件的完整路径let filePath = `${path}/${fileName}.wav`;// 打开或创建录音文件let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);// 定义一个读取数据的回调函数let readDataCallback = (buffer: ArrayBuffer) => {// 创建一个写入文件的选项对象let options: Options = {offset: bufferSize, // 文件当前位置偏移量length: buffer.byteLength // 数据长度};// 将数据写入文件fs.writeSync(file.fd, buffer, options);// 更新缓冲区大小bufferSize += buffer.byteLength;};// 给音频捕获器实例注册读取数据的事件监听器AudioCapturerManager.audioCapturer?.on('readData', readDataCallback);// 开始录音AudioCapturerManager.audioCapturer?.start();AudioCapturerManager.recordFilePath = filePath;// 返回录音文件的路径return filePath;}// 静态异步方法,用于停止录音过程static async stopRecord() {// 停止音频捕获器的工作await AudioCapturerManager.audioCapturer?.stop();// 释放音频捕获器的资源await AudioCapturerManager.audioCapturer?.release();// 清除音频捕获器实例AudioCapturerManager.audioCapturer = null;}
}

页面中开始录音

image-20240829005514157

可以通过以下路径查看录音文件是否真实生成

/data/app/el2/100/base/你的项目的boundle名称/haps/entry/files

image-20240829005634585

页面代码

Index.ets

import { PermissionManager } from '../utils/permissionMananger'
import { Permissions } from '@kit.AbilityKit'
import SpeechRecognizerManager from '../utils/SpeechRecognizerManager'
import { AudioCapturerManager } from '../utils/AudioCapturerManager'@Entry
@Component
struct Index {@Statetext: string = ""fileName: string = ""// 1 申请权限fn1 = async () => {// 准备好需要申请的权限 麦克风权限const permissions: Permissions[] = ["ohos.permission.MICROPHONE"]// 检查是否拥有权限const isPermission = await PermissionManager.checkPermission(permissions)if (!isPermission) {//   如果没权限,就主动申请PermissionManager.requestPermission(permissions)}}// 2 实时语音识别fn2 = () => {SpeechRecognizerManager.init(res => {console.log("实时语音识别", JSON.stringify(res))this.text = res.result})}// 3 开始录音fn3 = () => {this.fileName = Date.now().toString()AudioCapturerManager.startRecord(this.fileName)}// 4 接收录音fn4 = () => {AudioCapturerManager.stopRecord()}build() {Column({ space: 10 }) {Text(this.text)Button("申请权限").onClick(this.fn1)Button("实时语音识别").onClick(this.fn2)Button("开始录音").onClick(this.fn3)Button("结束录音").onClick(this.fn4)}.width("100%").height("100%").justifyContent(FlexAlign.Center)}
}

使用AI语音功能 实现声音文件转文本

这篇关于三文带你轻松上手鸿蒙的AI语音02-声音文件转文本的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1144110

相关文章

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

华为鸿蒙HarmonyOS 5.1官宣7月开启升级! 首批支持名单公布

《华为鸿蒙HarmonyOS5.1官宣7月开启升级!首批支持名单公布》在刚刚结束的华为Pura80系列及全场景新品发布会上,除了众多新品的发布,还有一个消息也点燃了所有鸿蒙用户的期待,那就是Ha... 在今日的华为 Pura 80 系列及全场景新品发布会上,华为宣布鸿蒙 HarmonyOS 5.1 将于 7

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

电脑蓝牙连不上怎么办? 5 招教你轻松修复Mac蓝牙连接问题的技巧

《电脑蓝牙连不上怎么办?5招教你轻松修复Mac蓝牙连接问题的技巧》蓝牙连接问题是一些Mac用户经常遇到的常见问题之一,在本文章中,我们将提供一些有用的提示和技巧,帮助您解决可能出现的蓝牙连接问... 蓝牙作为一种流行的无线技术,已经成为我们连接各种设备的重要工具。在 MAC 上,你可以根据自己的需求,轻松地

Spring AI 实现 STDIO和SSE MCP Server的过程详解

《SpringAI实现STDIO和SSEMCPServer的过程详解》STDIO方式是基于进程间通信,MCPClient和MCPServer运行在同一主机,主要用于本地集成、命令行工具等场景... 目录Spring AI 实现 STDIO和SSE MCP Server1.新建Spring Boot项目2.a

Go语言使用slices包轻松实现排序功能

《Go语言使用slices包轻松实现排序功能》在Go语言开发中,对数据进行排序是常见的需求,Go1.18版本引入的slices包提供了简洁高效的排序解决方案,支持内置类型和用户自定义类型的排序操作,本... 目录一、内置类型排序:字符串与整数的应用1. 字符串切片排序2. 整数切片排序二、检查切片排序状态:

POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能

《POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能》ApachePOI是一个流行的Java库,用于处理MicrosoftOffice格式文件,提供丰富API来创建、读取和修改O... 目录前言:Apache POIEasyPoiEasyExcel一、EasyExcel1.1、核心特性

Python中edge-tts实现便捷语音合成

《Python中edge-tts实现便捷语音合成》edge-tts是一个功能强大的Python库,支持多种语言和声音选项,本文主要介绍了Python中edge-tts实现便捷语音合成,具有一定的参考价... 目录安装与环境设置文本转语音查找音色更改语音参数生成音频与字幕总结edge-tts 是一个功能强大的

C#TextBox设置提示文本方式(SetHintText)

《C#TextBox设置提示文本方式(SetHintText)》:本文主要介绍C#TextBox设置提示文本方式(SetHintText),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录C#TextBox设置提示文本效果展示核心代码总结C#TextBox设置提示文本效果展示核心代