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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 12:03:31