Преобразование загруженного аудиофрагмента для воспроизведения на сервере
У меня есть часовое аудио, транслируемое на бэкэнд с помощью вебсокета. Мне нужно начать транскрибировать аудио и выдавать ответ практически в реальном времени. По крайней мере, чтобы пользователи не ждали по часу, прежде чем проверить транскрипцию.
Я разбил проблему на следующие шаги
- Запишите аудиопоток
- разделите поток на 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 секунд. Бэкэнд будет создавать файл, когда получит байт_данных