Files
banban/talkingq-url/utils/ audio_format.py
2026-05-06 03:33:28 +08:00

34 lines
940 B
Python

import io
import wave
DEFAULT_SAMPLE_RATE = 16000
DEFAULT_CHANNELS = 1
DEFAULT_SAMPLE_WIDTH = 2
def detect_audio_format(audio_data: bytes) -> str:
if len(audio_data) >= 12 and audio_data[:4] == b"RIFF" and audio_data[8:12] == b"WAVE":
return "wav"
if audio_data.startswith(b"ID3"):
return "mp3"
if len(audio_data) >= 2 and audio_data[0] == 0xFF and (audio_data[1] & 0xE0) == 0xE0:
return "mp3"
return "pcm_s16le_16k_mono"
def wrap_pcm_as_wav(
audio_data: bytes,
*,
sample_rate: int = DEFAULT_SAMPLE_RATE,
channels: int = DEFAULT_CHANNELS,
sample_width: int = DEFAULT_SAMPLE_WIDTH,
) -> bytes:
wav_buffer = io.BytesIO()
with wave.open(wav_buffer, "wb") as wav_file:
wav_file.setnchannels(channels)
wav_file.setsampwidth(sample_width)
wav_file.setframerate(sample_rate)
wav_file.writeframes(audio_data)
return wav_buffer.getvalue()