Flutter/Django中AAC/ADTS转WAV实现语音转文本方案咨询
音频格式转换方案选择与实现
一、前端还是后端转换?
优先推荐后端转换,理由:
- 前端无需额外开发音频转换逻辑,降低App复杂度,规避不同设备的音频处理兼容性差异
- 避免转换后的WAV文件(体积远大于AAC)占用过多用户流量
- 后端服务器性能更稳定,处理音频转换的效率和容错性更高
前端转换适用场景:
- 后端服务器资源紧张,需要分散计算压力
- 目标用户设备性能较好,且对流量消耗不敏感
二、后端转换实现(Django)
依赖工具与库
- 安装
ffmpeg(跨平台音频处理工具,是pydub的依赖) - Python库:
pydub(简化音频格式转换的封装库)
步骤与代码修改
安装依赖:
# Ubuntu/Debian系统安装ffmpeg,其他系统自行调整安装方式 sudo apt-get install ffmpeg # 安装pydub pip install pydub修改语音转文本接口,添加格式转换逻辑:
from pydub import AudioSegment import io from speech_recognition import Recognizer, AudioFile, UnknownValueError, RequestError @api_view(['GET']) def speech_to_text(request): conn = mongo_conn() audio_file_ID = request.GET['AudioFileID'] audio_file = download_audio(conn, audio_file_ID) # 假设返回的是AAC格式字节数据 # 将AAC转换为WAV格式 try: # 读取字节流中的AAC音频 aac_audio = AudioSegment.from_file(io.BytesIO(audio_file), format="aac") # 导出为WAV字节流 wav_io = io.BytesIO() aac_audio.export(wav_io, format="wav") wav_io.seek(0) # 重置文件指针到起始位置 except Exception as e: return JsonResponse({'error': f'音频转换失败: {str(e)}'}, status=400) r = Recognizer() with AudioFile(wav_io) as source: audio_data = r.record(source) try: text = r.recognize_google(audio_data) return JsonResponse({'text': text}, safe=False) except UnknownValueError: return JsonResponse({'error': '无法识别音频内容'}, status=400) except RequestError as e: return JsonResponse({'error': f'语音识别服务请求失败: {str(e)}'}, status=500)
三、前端转换实现(Flutter)
依赖库
ffmpeg_kit_flutter:Flutter平台的FFmpeg封装库,支持音频格式转换path_provider:用于获取本地文件路径
步骤与代码修改
添加依赖到
pubspec.yaml:dependencies: ffmpeg_kit_flutter: ^4.5.1 path_provider: ^2.1.1修改录音停止后的逻辑,添加格式转换:
import 'package:ffmpeg_kit_flutter/ffmpeg_kit.dart'; import 'package:ffmpeg_kit_flutter/return_code.dart'; import 'package:path_provider/path_provider.dart'; Future stopRecorder() async { final filePath = await recorder.stopRecorder(); final aacFile = File(filePath!); print('录制的AAC文件路径: $filePath'); // 生成WAV文件保存路径 Directory? dir = await getExternalStorageDirectory(); final wavFilePath = "${dir!.path}/audio.wav"; // 执行FFmpeg转换命令:将AAC转为单声道、16kHz采样率的WAV(适配语音识别) final session = await FFmpegKit.execute( "-i ${aacFile.path} -acodec pcm_s16le -ar 16000 -ac 1 ${wavFilePath}" ); final returnCode = await session.getReturnCode(); if (ReturnCode.isSuccess(returnCode)) { final wavFile = File(wavFilePath); uploadAudio(wavFile); // 上传转换后的WAV文件 print('转换后的WAV文件路径: $wavFilePath'); } else { // 转换失败时,可选择上传原AAC文件让后端处理,或提示用户 print('音频转换失败,上传原AAC文件'); uploadAudio(aacFile); } setState(() { isRecording = false; audioFile = File(wavFilePath); // 根据转换结果调整赋值 }); }
内容的提问来源于stack exchange,提问作者Femn Dharamshi
相关产品推荐
相关产品推荐

