Прочитать аудиофайл в запросе POST к Flask API

Я создаю приложение для настройки гитары с ReactJS для внешнего интерфейса и Python Flask в качестве внутреннего интерфейса.

Вот что пока делает приложение:

1. Приложение React (на стороне клиента) записывает звук с помощью библиотеки реакции React -mic

2. Отправляет запись через. запрос POST на получение Flask API, который забирает его и отправляет обратно в качестве ответа.

ПРОБЛЕМА. Отправляемый файл находится в форме на снимке экрана, которая представляет собой список с одним элементом Blob, состоящим из аудиофайла в Интернете.

введите описание изображения здесь

Когда я отправляю этот blob-файл аудиофайла webM в функции выборки, он оказывается неопределенным в приложении Flask, и я не уверен, как читать blob / webm audio на Python.

Функция POST в ReactJS:

 uploadFile(file) {
        var form = new FormData();
        form.append('file',file)
        form.append('title',"Guitar recording")
        fetch('http://127.0.0.1:5000/audio_record', {
            // content-type header should not be specified!
            method: 'POST',
            body: form
        }).then(function (response){
            return (response.text())
        }).then(function(text){
            console.log(text) // The text the endpoint returns
        })
            .catch(error => console.log(error)
            );
    }

Приложение Python Flask (где я пытаюсь прочитать файл, не работает ..):

import audioread
from flask import Flask, request #import main Flask class and request object
from flask_cors import CORS
import logging

from pydub import AudioSegment
from pydub.playback import play

logging.basicConfig(level=logging.INFO)

logger = logging.getLogger('HELLO WORLD')


app = Flask(__name__) #create the Flask app

CORS(app)

@app.route('/')
def landing():
    return 'Landing page'

# Get the blob of type "audio/webm;codecs=opus"
@app.route('/audio_record', methods=['POST'])
def save_record():

    logger.info("welcome to upload`")
    # file = request.files['file']
    #filename = secure_filename(file.title)

    file = request.form['file']

    print('File from the POST request is: {}'.format(file))
    try: 
        read_audio_file(file[0])
        return "****** Audio Read ******"
    except: 
        print("In the except", file[0]) # Gets printed as undefined
        title = request.form['title']
        print(title) # Able to print title 
        return "Request received and responded"
        # app.logger.debug(request.files['file'].filename) 


def read_audio_file(audio_from_post):
    print("Tring to read audio..")
    with audioread.audio_open(audio_from_post) as f:
        print(f.channels, f.samplerate, f.duration)
        for buf in f:
            print(buf)


if __name__ == '__main__':
    app.run(debug=True, port=5000) #run app in debug mode on port 5000

Я видел здесь, что было бы разумно преобразовать Blob к объекту Audio в ReactJS, но я не уверен, как это упростит чтение файла во Flask.

Есть идеи, как мне это сделать?

Я хочу прочитать файл на Python и выполнить быстрое преобразование Фурье (numpy.fft.fft), чтобы определить частоты в аудиоклипе.

Заранее спасибо!

ОБНОВЛЕНИЕ

Я решил, что хочу попробовать записать звук с помощью другой библиотеки, MediaRecorder, чтобы иметь возможность записывать звук в WAV, а не в webm. Думаю, я закодирую файл WAV в base64, отправлю его в форме во Flask и прочитаю с помощью волновая библиотека.


person meerkat    schedule 04.02.2020    source источник
comment
Вы думали вместо этого использовать программирование сокетов?   -  person dper    schedule 04.02.2020
comment
@dper Я не делал - разберусь. Я просто хотел что-то сделать с HTTP-запросами, хотя, возможно, это не самая подходящая альтернатива здесь :)   -  person meerkat    schedule 04.02.2020


Ответы (1)


Один из способов, которым вы могли бы подойти, - это отправка данных из внешнего интерфейса - это отправка большого двоичного объекта записи вместо всего объекта путем внесения следующего изменения в вашу функцию POST в React.

form.append('file',file.blob)

Затем на стороне сервера вы можете просто сделать следующее

request.files['file'].filename

А затем продолжаем сохранять его с помощью встроенного сохранить метод для дальнейшей обработки. Документацию для request.files можно найти здесь

person Saiprasad Balasubramanian    schedule 04.02.2020
comment
Когда я попробовал это, все, что я получил от Flask API, был blob, без возможности обрабатывать его дальше. - person meerkat; 05.02.2020
comment
Привет, если вы наберете request.files ['file'], вы получите объект класса werkzeug.datastructures.FileStorage - person Nicole Douglas; 07.08.2020