【问题标题】:Send recorded audio from browser to django server and save as .wav将录制的音频从浏览器发送到 django 服务器并保存为 .wav
【发布时间】:2020-01-06 09:38:20
【问题描述】:

我正在尝试构建一个 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,将其保存为音频文件)。

如果需要更多信息,请随时询问。谢谢!

【问题讨论】:

  • 那么问题是什么?你得到一个错误?还有什么?如果你只解释你想要什么而不解释发生了什么,那么我们只能猜测是什么问题。
  • @dirkgroten 不,没有错误。文件被保存了,但问题是波形文件只包含噪音,而不是录制时所说的音频。
  • 所以也许将其添加到您的问题中。你没这么说。

标签: javascript python django audio


【解决方案1】:

Wav 文件格式不支持 Opus 编解码器。

对于 Opus 编解码器,您需要使用 webm 文件格式。

所以你需要改变这个

new Blob(audio_chunks, {'type':'audio/wav; codecs=opus'});

new Blob(audio_chunks, {'type':'audio/webm; codecs=opus'});

new Blob(chunks, { 'type' : 'audio/wav; codecs=MS_PCM' }); //如果支持的话。

确保您保存 blob 的文件也与发送的文件格式相同。

【讨论】:

  • 尝试了 wav(使用 ms_pcm 编解码器)和 webm 格式。但问题还是一样。它仍然只是噪音。
  • 请让我知道您是否能够在本地录制文件(运行 mediarecorder 并播放的同一台电脑(wav/pcm、webm/opus)
【解决方案2】:

我遇到了同样的问题。我建议您在保存时将原始参数设置为音频,而不是对随机数字进行硬编码:

        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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2011-12-13
    • 2013-06-26
    • 1970-01-01
    相关资源
    最近更新 更多