我正在运行一个简单的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状态代码中可以看到flask应用正确接收了POST请求,但是当我尝试读取数据时,我得到了一个空的b''字符串。解码音频文件的正确方法是什么?还是我在客户端脚本中发送POST请求的方式有问题?
我已经查看了StackOverflow上的其他问题,他们提到要在POST请求中将文件作为“文件”参数的一部分发送。
答案 0 :(得分:0)
尝试使用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)
。
答案 1 :(得分:0)
对于那些想要保存和处理 .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...
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);
}
});