Прочитать аудиофайл в POST-запросе к Flask API - PullRequest
0 голосов
/ 04 февраля 2020

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

Это то, что приложение делает до сих пор:

1. Приложение React (на стороне клиента) записывает звук с использованием библиотеки реагирования реаги-ми c

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

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

enter image description here

Когда я отправляю этот BLOB-файл из аудиофайла webM в функции извлечения она выглядит как неопределенная в приложении Flask, и я не уверен, как прочитать аудио blob / webm в 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 и читать его с помощью волновой библиотеки .

1 Ответ

0 голосов
/ 04 февраля 2020

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

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

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

request.files['file'].filename

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

...