HarmonyOS 鸿蒙Next中MP3格式的语音转文本
HarmonyOS 鸿蒙Next中MP3格式的语音转文本 你好,目前看提供的文档仅支持pcm格式的语音转文本,mp3格式的怎么转文本?
可以先将mp3格式音频转化为pcm格式,参考以下方案。
【背景知识】
语音识别支持将一段中文音频信息转换成文本,仅支持识别音频类型为pcm格式、采样率为16000、采样位数为16位,单通道的音频信息,具体可参考:音频配置信息。其他类型的音频文件(mp3、aac等)需要先转换成规定参数的pcm音频数据才能用于语音识别。
【解决方案】
可以根据音频文件参数通过如下两种方法将音频文件转换成语音识别需要的pcm音频数据。
方案一:音频文件的参数与语音识别所要求的一致时,解析解码音频文件得到语音识别需要的pcm音频数据。
如果需要识别的音频文件的参数(采样率、采样位数、通道数)与语音识别要求的音频配置规格一致,可以对该音频文件进行解封装以及解码操作,得到的pcm数据可直接用于语音识别。具体可参考:媒体数据解析和音频解码。
方案二:音频配置规格不一致时,使用三方库mp4parser进行重采样得到语音识别需要的pcm音频数据。
如果需要识别的音频文件的参数(采样率、采样位数、通道数)与语音识别要求的音频配置规格不一致,对音频文件解封装和解码后得到的pcm数据不能直接用于语音识别,可以通过三方库[@ohos/mp4parser](https://ohpm.openharmony.cn/#/cn/detail/@ohos%2Fmp4parser)将音频文件转换成对应音频配置规格要求的pcm文件,然后再用于语音识别。参考代码如下:
// inputFilePath:输入音频文件的沙箱文件路径,文件必须存在
// outputFilePath:输出pcm文件的沙箱文件路径,文件必须存在
export async function extractAudio(inputFilePath: string, outputFilePath: string) {
let callback: ICallBack = {
callBackResult: (code: number) => {
if (code === 0) {
console.info('Extract pcm audio succeed');
} else {
console.error('Extract pcm audio failed');
}
}
};
let cmd = `ffmpeg -i ${inputFilePath} -vn -acodec pcm_s16le -ar 16000 -ac 1 -f s16le ${outputFilePath}`;
MP4Parser.ffmpegCmd(cmd, callback);
}
更多关于HarmonyOS 鸿蒙Next中MP3格式的语音转文本的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
楼主可以尝试用这个三方库来实现
仓库地址:OpenHarmony三方库中心仓
;
// 配置音频参数
let audioInfo = {
audioType: 'pcm', // 这里要为pcm格式
sampleRate: 16000, // 固定采样率
sampleBit: 16, // 固定位深
soundChannel: 1 // 单声道
};
// 启动识别
recognizer.startListening({
audioInfo: audioInfo,
filePath: '/path/to/converted.pcm' // 转换后的文件路径
}, (err, result) => {
if (err) {
console.error('识别失败:', err);
return;
}
console.log('识别结果:', result.text);
});
鸿蒙的语音识别API speechRecognizer 只支持PCM格式的音频文件那就只能先将MP3转换成PCM
通过@kit.AudioKit
中的音频解码接口实现:
import audioDecoder from '@kit.AudioKit';
// 创建解码器实例
let decoder = await audioDecoder.createAudioDecoder();
// 配置解码参数(MP3→PCM)
let decodeOptions = {
streamInfo: {
format: audioDecoder.AudioFormat.MPEG, // 输入格式为MP3
sampleRate: 44100, // 需与实际音频参数一致
channels: 2
},
decodeOutput: {
format: audioDecoder.AudioFormat.PCM // 输出格式
}
};
await decoder.configure(decodeOptions);
// 执行解码并获取PCM数据
let pcmBuffer = await decoder.decode(inputFilePath, outputPCMFilePath);
在HarmonyOS Next中,可以使用@ohos.multimedia.audio
和@ohos.ai.speech
模块实现MP3语音转文本。首先通过createAudioPlayer
加载MP3文件,获取音频流数据。然后使用SpeechRecognizer
类进行语音识别,调用start
方法传入音频流数据,通过监听onResult
回调获取转换后的文本结果。需要声明ohos.permission.MICROPHONE
权限。转换过程依赖设备本地AI引擎,支持离线识别。
在HarmonyOS Next中处理MP3语音转文本,建议先使用音频解码库将MP3转为PCM格式,再调用官方ASR接口。目前系统原生ASR服务确实主要支持PCM/WAV格式,这是出于实时性和准确性的考虑。对于MP3转换,可以采用以下两种方案:
- 使用开源音频处理库(如FFmpeg)进行格式转换:
- 通过NDK集成FFmpeg解码MP3
- 转换为16kHz/16bit单声道PCM
- 再调用
huawei.hiai.asr
服务
- 使用华为音频服务中的AudioCapturer进行实时转码:
- 配置AudioCapturer参数为PCM格式
- 建立MP3解码管道
- 输出符合ASR要求的PCM流
注意转换时需要确保采样率(建议16kHz)、位深(16bit)和声道数(单声道)符合ASR引擎的要求。这种预处理方案在实测中识别准确率与直接PCM输入基本一致。