簡體   English   中英

將錄制的音頻從瀏覽器發送到 django 服務器並另存為 .wav

[英]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.

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