三文带你轻松上手鸿蒙的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

相关文章

Ubuntu系统怎么安装Warp? 新一代AI 终端神器安装使用方法

《Ubuntu系统怎么安装Warp?新一代AI终端神器安装使用方法》Warp是一款使用Rust开发的现代化AI终端工具,该怎么再Ubuntu系统中安装使用呢?下面我们就来看看详细教程... Warp Terminal 是一款使用 Rust 开发的现代化「AI 终端」工具。最初它只支持 MACOS,但在 20

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出

Debian如何查看系统版本? 7种轻松查看Debian版本信息的实用方法

《Debian如何查看系统版本?7种轻松查看Debian版本信息的实用方法》Debian是一个广泛使用的Linux发行版,用户有时需要查看其版本信息以进行系统管理、故障排除或兼容性检查,在Debia... 作为最受欢迎的 linux 发行版之一,Debian 的版本信息在日常使用和系统维护中起着至关重要的作

macOS怎么轻松更换App图标? Mac电脑图标更换指南

《macOS怎么轻松更换App图标?Mac电脑图标更换指南》想要给你的Mac电脑按照自己的喜好来更换App图标?其实非常简单,只需要两步就能搞定,下面我来详细讲解一下... 虽然 MACOS 的个性化定制选项已经「缩水」,不如早期版本那么丰富,www.chinasem.cn但我们仍然可以按照自己的喜好来更换

四种简单方法 轻松进入电脑主板 BIOS 或 UEFI 固件设置

《四种简单方法轻松进入电脑主板BIOS或UEFI固件设置》设置BIOS/UEFI是计算机维护和管理中的一项重要任务,它允许用户配置计算机的启动选项、硬件设置和其他关键参数,该怎么进入呢?下面... 随着计算机技术的发展,大多数主流 PC 和笔记本已经从传统 BIOS 转向了 UEFI 固件。很多时候,我们也

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

轻松掌握python的dataclass让你的代码更简洁优雅

《轻松掌握python的dataclass让你的代码更简洁优雅》本文总结了几个我在使用Python的dataclass时常用的技巧,dataclass装饰器可以帮助我们简化数据类的定义过程,包括设置默... 目录1. 传统的类定义方式2. dataclass装饰器定义类2.1. 默认值2.2. 隐藏敏感信息

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O

Java操作xls替换文本或图片的功能实现

《Java操作xls替换文本或图片的功能实现》这篇文章主要给大家介绍了关于Java操作xls替换文本或图片功能实现的相关资料,文中通过示例代码讲解了文件上传、文件处理和Excel文件生成,需要的朋友可... 目录准备xls模板文件:template.xls准备需要替换的图片和数据功能实现包声明与导入类声明与

python解析HTML并提取span标签中的文本

《python解析HTML并提取span标签中的文本》在网页开发和数据抓取过程中,我们经常需要从HTML页面中提取信息,尤其是span元素中的文本,span标签是一个行内元素,通常用于包装一小段文本或... 目录一、安装相关依赖二、html 页面结构三、使用 BeautifulSoup javascript