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

Python Flask后端处理MediaRecorder音频并转MP3适配Whisper模型

解决Flask后端处理WebM/Opus音频转MP3供Whisper使用的问题

问题场景

前端通过FormData发送audio/webm;codecs=opus格式的音频到Flask后端,后端接收到的是tempfile.SpooledTemporaryFile类型对象,需要将其转换为MP3格式后传入Whisper模型处理。

解决方案步骤

1. 安装依赖

先安装必要的Python包和系统工具:

  • Python包安装:
    pip install flask ffmpeg-python openai-whisper
    
  • 系统需安装ffmpeg(用于音频格式转换):
    • Ubuntu/Debian: sudo apt install ffmpeg
    • macOS: brew install ffmpeg
    • Windows: 从ffmpeg官网下载后添加到系统PATH

2. 修改Flask后端代码

核心是正确读取上传文件、内存中转码为MP3,再传入Whisper模型:

from flask import Flask, request, jsonify
import ffmpeg
import whisper
import io

app = Flask(__name__)

@app.route('/audio', methods=['POST', 'OPTIONS'])
def handle_key_data():
    # 处理跨域OPTIONS请求
    if request.method == 'OPTIONS':
        response = jsonify()
        response.headers['Access-Control-Allow-Origin'] = 'http://localhost:5173'
        response.headers['Access-Control-Allow-Methods'] = 'POST, OPTIONS'
        response.headers['Access-Control-Allow-Headers'] = 'Content-Type'
        return response
    
    # 获取上传的音频文件并读取字节内容
    audio_file = request.files['file']
    audio_bytes = audio_file.read()
    
    try:
        # 内存中将WebM/Opus转MP3
        mp3_bytes, _ = (
            ffmpeg
            .input('pipe:', format='webm')
            .output('pipe:', format='mp3', acodec='libmp3lame')
            .run(input=audio_bytes, capture_stdout=True, capture_stderr=True)
        )
        mp3_stream = io.BytesIO(mp3_bytes)
        
        # 加载Whisper模型(base体积小速度快,适合实时场景)
        model = whisper.load_model("base")
        # 执行语音识别
        transcription_result = model.transcribe(mp3_stream)
        
        # 按业务逻辑返回position(示例用识别文本长度,可自行调整)
        response_data = {
            'position': len(transcription_result['text'].strip()),
            'transcription': transcription_result['text'].strip()
        }
        
        response = jsonify(response_data)
        response.headers['Access-Control-Allow-Origin'] = 'http://localhost:5173'
        return response
    
    except Exception as e:
        error_response = jsonify({'error': str(e)})
        error_response.headers['Access-Control-Allow-Origin'] = 'http://localhost:5173'
        return error_response, 500

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5050)

关键说明

  • 文件读取:直接调用request.files['file'].read()获取音频字节,避免直接操作stream对象的类型问题。
  • 内存转码:通过ffmpeg在内存中完成格式转换,无需写入磁盘,提升处理效率。
  • Whisper选型:base模型适合实时场景,若需更高准确率可替换为small/large等模型。
  • CORS修正:OPTIONS请求需返回完整跨域头,否则前端会触发跨域拦截。

内容的提问来源于stack exchange,提问作者Hugo Albert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 17:52:49