[英]Send recorded audio from browser to django server and save as .wav
我正在嘗試構建一個 Web 應用程序,該應用程序將記錄來自瀏覽器的音頻,並在每 3 秒后將記錄的音頻發送到 django API 進行分析(從語音進行情感識別)。 我正在使用MediaRecorder錄制音頻。 但只有噪音被保存在波形文件中。
我正在嘗試將錄制的音頻(作為 blob)發送到 django api。 然后在后端收到它時,我將其保存為 wav 文件。
我像這樣發送錄制的音頻:
navigator.mediaDevices.getUserMedia({audio:true}).then(stream => {audio_handler(stream)});
var audio_chunks = [];
audio_handler = function(stream){
rec = new MediaRecorder(stream, {mimeType : 'audio/webm', codecs : "opus"});
rec.ondataavailable = function(e){
audio_chunks.push(e.data);
}
}
//on rec.stop()
var blob = new Blob(audio_chunks, {'type':'audio/wav; codecs=opus'});
console.log(blob);
var xhttp = new XMLHttpRequest();
xhttp.open("POST", "http://localhost:8000/er/", true);
var data = new FormData();
data.append('data', blob, 'audio_blob');
xhttp.send(data);
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
console.log(this.responseText);
}
};
在 Django 后端保存為:
from django.http import JsonResponse
import wave
def get_emotion(request):
print(request.FILES.get('data'))
audio_data = request.FILES.get('data')
print(type(audio_data))
print(audio_data.size)
audio = wave.open('test.wav', 'wb')
audio.setnchannels(1)
audio.setnframes(1)
audio.setsampwidth(1)
audio.setframerate(16000)
blob = audio_data.read()
audio.writeframes(blob) #on playing 'test.wav' only noise can be heard
return JsonResponse({})
目前保存的音頻文件中只有一些噪音,而我希望保存的波形音頻文件與錄制時所說的音頻具有相同的內容。
請建議,如果有任何其他方法可以做同樣的事情(從瀏覽器錄制音頻並將其發送到 django api,將其保存為音頻文件)。
如果需要更多信息,請隨時詢問。 謝謝!
我遇到了同樣的問題。 我建議您在保存時將原始參數設置為音頻,而不是硬編碼隨機數字:
obj = wave.open(audio_data, 'r')
audio = wave.open('/../test.wav', 'wb')
audio.setnchannels(obj.getnchannels())
audio.setnframes(obj.getnframes())
audio.setsampwidth(obj.getsampwidth())
audio.setframerate(obj.getframerate())
blob = audio_data.read()
audio.writeframes(blob)
這會將實際通道、幀、寬度等設置為您正在編寫的音頻,而不會在您的 .wav 文件中引入任何噪音。 確保您至少使用Django==1.8.19
Wav 文件格式不支持 Opus 編解碼器。
對於 Opus 編解碼器,您需要使用 webm 文件格式。
所以你需要改變這個
新 Blob(audio_chunks, {'type':'audio/wav; codecs=opus'});
到
新 Blob(audio_chunks, {'type':'audio/webm; codecs=opus'});
或者
new Blob(chunks, { 'type' : 'audio/wav; codecs=MS_PCM' }); //如果支持。
確保您保存 blob 的文件也與發送的文件格式相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.