Added new media files (video, audio, subtitles), two scripts for audio combination and captcha audio generation, and updated main.py and server.py for voice and speed settings. Script files were revised for clarity and additional instructions, supporting new workflow for proctor scheduling system documentation and audio generation.
65 lines
1.7 KiB
Python
65 lines
1.7 KiB
Python
import sys
|
|
import os
|
|
import wave
|
|
|
|
# Usage:
|
|
# python combine_wavs.py "abc123" "output.wav"
|
|
|
|
if len(sys.argv) < 3:
|
|
print('Usage: python combine_wavs.py "text" "output.wav"')
|
|
sys.exit(1)
|
|
|
|
text = sys.argv[1].lower()
|
|
output_filename = sys.argv[2]
|
|
|
|
current_folder = os.path.dirname(os.path.abspath(__file__))
|
|
|
|
# Folder where a.wav, b.wav, c.wav, 0.wav, 1.wav, etc. are stored
|
|
base_folder = os.path.join(current_folder, "captcha_audio")
|
|
print(f"Using base folder: {base_folder}")
|
|
|
|
# Output folder
|
|
output_folder = os.path.join(current_folder)
|
|
os.makedirs(output_folder, exist_ok=True)
|
|
|
|
output_path = os.path.join(output_folder, output_filename)
|
|
|
|
# Build the ordered list of WAVs to merge
|
|
wav_paths = []
|
|
|
|
for ch in text:
|
|
if ch.isspace():
|
|
continue # ignore spaces
|
|
|
|
key = ch.lower() # your files are a.wav, b.wav, ...
|
|
wav_name = f"{key}.wav"
|
|
wav_path = os.path.join(base_folder, wav_name)
|
|
|
|
if not os.path.exists(wav_path):
|
|
raise FileNotFoundError(f"Missing WAV for character: {ch} ({wav_path})")
|
|
|
|
wav_paths.append(wav_path)
|
|
|
|
if not wav_paths:
|
|
raise ValueError("No valid characters found to assemble.")
|
|
|
|
|
|
# Concatenate WAV files
|
|
with wave.open(wav_paths[0], "rb") as w:
|
|
params = w.getparams()
|
|
combined_frames = [w.readframes(w.getnframes())]
|
|
|
|
for wav_file in wav_paths[1:]:
|
|
with wave.open(wav_file, "rb") as w:
|
|
if w.getparams() != params:
|
|
raise ValueError(f"WAV format mismatch: {wav_file}")
|
|
combined_frames.append(w.readframes(w.getnframes()))
|
|
|
|
# Write output
|
|
with wave.open(output_path, "wb") as out:
|
|
out.setparams(params)
|
|
for frames in combined_frames:
|
|
out.writeframes(frames)
|
|
|
|
print(f"Saved combined WAV: {output_path}")
|