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
- Ubuntu/Debian:
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
相关产品推荐
相关产品推荐

