【问题标题】:How to read/process an audio file sent in a POST request to a Flask API?如何读取/处理在 POST 请求中发送到 Flask API 的音频文件?
【发布时间】:2020-02-19 03:52:50
【问题描述】:

我正在运行一个简单的 Flask 后端,它将处理带有音频文件的 HTTP 请求并读取数据。最终,我希望读取数据并让 ML 模型对音频数据进行推理,但第一步是简单地以正确的编码格式读取数据。

我的 Flask 应用程序代码如下:

@app.route('/api/audio', methods=['GET', 'POST'])
def get_score():
    if request.method == 'POST':
        length = request.content_length
        content_type = request.content_type
        data = request.data
        return f"""Content Type is  {content_type} and data is {data} \n length is {length}"""
    elif request.method == 'GET':
        return 'get method received'

我在客户端生成 POST 请求的测试代码如下:

def send_audio():
    #print('attempting to send audio')
    url = 'http://127.0.0.1:5000/api/audio'
    with open('/Users/kaushikandra/laughter-detection/LaughDetection/crowd_laugh_1.wav', 'rb') as file:
        data = {'uuid':'-jx-1', 'alarmType':1, 'timeDuration':10}
        files = {'messageFile': file}

        req = requests.post(url, files=files, json=data)
        print(req.status_code)
        print(req.text)

当我运行客户端脚本时,我从服务器得到以下输出。

200
Content Type is  multipart/form-data; boundary=d95c72e01bdfac029b16da2b8f144cbd and data is b'' 
 length is 129722

我可以从 200 状态代码中看到烧瓶应用程序正在正确接收 POST 请求,但是当我尝试读取数据时,我得到一个空的 b'' 字符串。用于解码音频文件的正确方法是什么?还是我在客户端脚本中发送 POST 请求的方式有问题?

我查看了有关 StackOverflow 的其他问题,他们提到将文件作为 POST 请求中“文件”参数的一部分发送。

【问题讨论】:

    标签: python http flask audio python-requests


    【解决方案1】:

    尝试使用request.files 获取您的音频文件:

    @app.route('/api/audio', methods=['GET', 'POST'])
    def get_score():
        if request.method == 'POST':
             request.files['messageFile']
    

    如果我记得,request.data 也只是一个空字符串。使用request.json()request.get_json(force=True)

    【讨论】:

      【解决方案2】:

      如果想保存和处理.wav或任何文件,可以使用FileStorage.save

      ma​​in.py (Flask)

      @app.route('/predict_with_db', methods=['POST'])
      def predictWithDb():
          if request.method == 'POST':
              save_path = os.path.join(dirname, "temp.wav")
              request.files['music_file'].save(save_path)
              #continue processing...
      

      index.html

      <input id="music_file" name="music_file" type="file" accept=".mp3,.wav" class="hidden" />
      

      form.js

      var formData = new FormData();
      const fp1 = $('#music_file').prop('files')[0];
      formData.append('music_file', fp1, fp1.name);
      
      $.ajax({
        type: "POST",
        url: "/predict",
        data: formData,
        processData: false,
        contentType: false,
        success: (result) => {
          console.log(result);
        },
        error: (err) => {
          console.log(err);
        }
      });
      

      【讨论】:

        猜你喜欢
        • 2020-05-20
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 2018-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多