kasanoma_api / app /audio_utils.py
michsethowusu
Add Webpiper with custom voice
9ae08c5
Raw
History Blame Contribute Delete
1.52 kB
import wave
import audioop
from pathlib import Path
def to_portable_file(input_path: Path, output_path: Path) -> None:
"""
Converts a WAV file to mono, 16-bit, 48kHz.
Args:
input_path (Path): Path to the input WAV file.
output_path (Path): Path where the converted WAV file will be saved.
"""
if not input_path.exists():
raise FileNotFoundError(f"Input file not found: {input_path}")
with wave.open(str(input_path), 'rb') as wf:
nchannels, sampwidth, framerate, nframes, _, _ = wf.getparams()
frames = wf.readframes(nframes)
print(f"Original: Channels={nchannels}, SampleWidth={sampwidth*8}bit, FrameRate={framerate}, Frames={nframes}")
# Convert to mono
if nchannels != 1:
frames = audioop.tomono(frames, sampwidth, 0.5, 0.5)
nchannels = 1
# Convert to 16-bit
if sampwidth != 2:
frames = audioop.lin2lin(frames, sampwidth, 2)
sampwidth = 2
# Resample to 48kHz if needed
target_rate = 48000
if framerate != target_rate:
frames, _ = audioop.ratecv(frames, sampwidth, nchannels, framerate, target_rate, None)
framerate = target_rate
# Write converted WAV
with wave.open(str(output_path), 'wb') as wf_out:
wf_out.setnchannels(1)
wf_out.setsampwidth(2)
wf_out.setframerate(48000)
wf_out.writeframes(frames)
print(f"Converted to 48kHz, 16-bit mono WAV: {output_path}")