如何将Flask请求的FileStorage转换为16kHz单声道numpy ndarray?
Flask中FileStorage转16kHz单声道numpy ndarray方案
直接上可运行的实现方案,两种方式任选:
方案1:用librosa(推荐,兼容多数音频格式)
librosa可以直接读取类文件对象,同时自动完成单声道转换和重采样,对MP3、WAV等格式兼容性好(需依赖ffmpeg)。
先安装依赖:
pip install librosa numpy
补全你的代码:
from flask import Flask, request import librosa from io import BytesIO app = Flask(__name__) @app.route('/api/transcribe', methods=['POST']) def transcribe(): if 'audioFile' not in request.files: return 'No audio file provided', 400 file = request.files['audioFile'] # 将FileStorage转为BytesIO类文件对象 audio_io = BytesIO(file.read()) # 读取并转成16kHz单声道的ndarray audio_array, _ = librosa.load(audio_io, sr=16000, mono=True) # 此处编写你的ASR转录逻辑,audio_array就是所需输入 # ... return 'Transcription processed', 200
方案2:用soundfile+resampy(适合无压缩音频)
如果只处理WAV这类无压缩格式,用soundfile更轻量,配合resampy完成重采样。
安装依赖:
pip install soundfile numpy resampy
代码实现:
from flask import Flask, request import numpy as np import soundfile as sf import resampy from io import BytesIO app = Flask(__name__) @app.route('/api/transcribe', methods=['POST']) def transcribe(): if 'audioFile' not in request.files: return 'No audio file provided', 400 file = request.files['audioFile'] audio_io = BytesIO(file.read()) # 读取原始音频数据和采样率 data, sr = sf.read(audio_io) # 转单声道:立体声取均值合并 if data.ndim > 1: data = np.mean(data, axis=1) # 重采样到16000Hz if sr != 16000: data = resampy.resample(data, sr, 16000) # data就是16kHz单声道的ndarray,用于ASR # ... return 'Transcription processed', 200
注意事项
- 若用soundfile处理MP3等压缩格式,需确保系统安装支持对应格式的libsndfile版本;librosa依赖ffmpeg,安装后可处理绝大多数常见音频格式。
- 不要直接传入
file对象给音频库,先转成BytesIO再读取,避免文件对象兼容性问题。
内容的提问来源于stack exchange,提问作者arm
相关产品推荐
相关产品推荐

