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

相关文章

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

Spring AI Alibaba接入大模型时的依赖问题小结

《SpringAIAlibaba接入大模型时的依赖问题小结》文章介绍了如何在pom.xml文件中配置SpringAIAlibaba依赖,并提供了一个示例pom.xml文件,同时,建议将Maven仓... 目录(一)pom.XML文件:(二)application.yml配置文件(一)pom.xml文件:首

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

Go Mongox轻松实现MongoDB的时间字段自动填充

《GoMongox轻松实现MongoDB的时间字段自动填充》这篇文章主要为大家详细介绍了Go语言如何使用mongox库,在插入和更新数据时自动填充时间字段,从而提升开发效率并减少重复代码,需要的可以... 目录前言时间字段填充规则Mongox 的安装使用 Mongox 进行插入操作使用 Mongox 进行更

SpringBoot整合DeepSeek实现AI对话功能

《SpringBoot整合DeepSeek实现AI对话功能》本文介绍了如何在SpringBoot项目中整合DeepSeekAPI和本地私有化部署DeepSeekR1模型,通过SpringAI框架简化了... 目录Spring AI版本依赖整合DeepSeek API key整合本地化部署的DeepSeek

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言

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 的版本信息在日常使用和系统维护中起着至关重要的作