You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter/Django中AAC/ADTS转WAV实现语音转文本方案咨询

音频格式转换方案选择与实现

一、前端还是后端转换?

优先推荐后端转换,理由:

  • 前端无需额外开发音频转换逻辑,降低App复杂度,规避不同设备的音频处理兼容性差异
  • 避免转换后的WAV文件(体积远大于AAC)占用过多用户流量
  • 后端服务器性能更稳定,处理音频转换的效率和容错性更高

前端转换适用场景:

  • 后端服务器资源紧张,需要分散计算压力
  • 目标用户设备性能较好,且对流量消耗不敏感

二、后端转换实现(Django)

依赖工具与库

  • 安装ffmpeg(跨平台音频处理工具,是pydub的依赖)
  • Python库:pydub(简化音频格式转换的封装库)

步骤与代码修改

  1. 安装依赖:

    # Ubuntu/Debian系统安装ffmpeg,其他系统自行调整安装方式
    sudo apt-get install ffmpeg
    # 安装pydub
    pip install pydub
    
  2. 修改语音转文本接口,添加格式转换逻辑:

    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:用于获取本地文件路径

步骤与代码修改

  1. 添加依赖到pubspec.yaml:

    dependencies:
      ffmpeg_kit_flutter: ^4.5.1
      path_provider: ^2.1.1
    
  2. 修改录音停止后的逻辑,添加格式转换:

    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 07:01:54