Преобразование загруженного аудиофрагмента для воспроизведения на сервере

У меня есть часовое аудио, транслируемое на бэкэнд с помощью вебсокета. Мне нужно начать транскрибировать аудио и выдавать ответ практически в реальном времени. По крайней мере, чтобы пользователи не ждали по часу, прежде чем проверить транскрипцию.

Я разбил проблему на следующие шаги

  • Запишите аудиопоток
  • разделите поток на 30-секундные фрагменты и загрузите
  • преобразовать аудиофрагменты в отдельные файлы и расшифровать
  • отправьте обратно транскрибированный текст

Проблема заключается в том, что при попытке воспроизвести второй фрагмент аудио я получаю ошибку Invalid data found when processing input. Он не воспроизводится и, похоже, не имеет никакой аудиоинформации, связанной с ним.

Возможно ли добавить звуковую информацию во второй чанк, так как первый чанк воспроизводится нормально.

Frontend

async startRecording() {
      this.isRecording = true;

      // Start WebSocket connection
      this.websocket = new WebSocket("URL");
      this.websocket.onopen = () => console.log("WebSocket connected");
      this.websocket.onclose = () => console.log("WebSocket disconnected");
      this.websocket.onstop  = () => console.log("WebSocket onstop");
      this.websocket.onerror = (error) => {
        console.error("WebSocket error:", error);
        this.stopRecording  ();
      };
      this.websocket.onmessage = (event) => {
        console.log(event.data)
      };

      const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
      this.mediaStream = stream
      this.mediaRecorder = new MediaRecorder(stream, { mimeType: "audio/webm" });

      // Send audio chunks in real-time
      this.mediaRecorder.ondataavailable = (event) => {
        if (this.websocket && this.websocket.readyState === WebSocket.OPEN) {
          this.websocket.send(event.data);
        }
      };

      this.mediaRecorder.start(30000); // Capture chunks every 30000ms
    },

Backend

async def receive(self, text_data=None, bytes_data=None):
        if bytes_data:

            audio_filename = f"audio_{datetime.now().strftime('%Y%m%d%H%M%S')}.webm"
            self.audio_file_path = os.path.join("audio/", audio_filename)
            os.makedirs(os.path.dirname(self.audio_file_path), exist_ok=True)
            self.audio_file = open(self.audio_file_path, "wb")

            
            self.audio_file.write(bytes_data)
            self.audio_file.close()

Я предполагаю, что второй чанк будет работать, если мы сможем добавить аудиоданные в чанк. ffmpeg, transcribe, pydub не читают файл с одной и той же ошибкой Invalid data found when processing input

Преобразование пайдуба

audio = AudioSegment.from_file(self.audio_file_path)
audio.export(mp3_file_path, format="mp3")

Похоже, что на сервере сложно обрабатывать чанки как отдельные воспроизводимые файлы. Проще создавать новый mediaainstance во фронтенде каждые 30 секунд.

Запустите таймер и создавайте новый экземпляр каждые 30 секунд. Бэкэнд будет создавать файл, когда получит байт_данных

Вернуться на верх