簡體   English   中英

如何讀取/處理在 POST 請求中發送到 Flask API 的音頻文件?

[英]How to read/process an audio file sent in a POST request to a Flask API?

我正在運行一個簡單的 Flask 后端,它將處理帶有音頻文件的 HTTP 請求並讀取數據。 最終我想讀取數據並讓 ML model 對音頻數據進行推理,但第一步是以正確的編碼格式簡單地讀取數據。

我的 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)

當我運行客戶端腳本時,我從服務器獲得以下 output 。

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

我可以從 200 狀態代碼中看到 flask 應用程序正在正確接收 POST 請求,但是當我嘗試讀取數據時,我得到一個空的 b'' 字符串。 用於解碼音頻文件的正確方法是什么? 還是我在客戶端腳本中發送 POST 請求的方式有問題?

我查看了 StackOverflow 上的其他問題,他們提到將文件作為 POST 請求中“文件”參數的一部分發送。

嘗試使用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)

對於那些想要保存和處理.wav或任何文件的人,您可以使用FileStorage.save

main.py(燒瓶)

@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...

索引.html

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

表單.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);
  }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM