Some checks failed
Linux Build / Linux cpu (push) Has been cancelled
Linux Build / Linux cpu-clang (push) Has been cancelled
Linux Build / Linux vulkan (push) Has been cancelled
mac-build / macOS CPU (push) Has been cancelled
Nix Build / Nix (cpu) (push) Has been cancelled
Nix Build / Nix (vulkan) (push) Has been cancelled
windows-build / Windows CPU (push) Has been cancelled
65 lines
3.1 KiB
Python
65 lines
3.1 KiB
Python
#!/usr/bin/env python3
|
|
"""Prepare reproducible speech crops and a longform CLI path case."""
|
|
|
|
import argparse
|
|
import json
|
|
import random
|
|
import wave
|
|
from pathlib import Path
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description=__doc__)
|
|
parser.add_argument("source", type=Path)
|
|
parser.add_argument("output", type=Path)
|
|
parser.add_argument("--seed", type=int, default=1729)
|
|
parser.add_argument("--long-repeat", type=int, default=1)
|
|
args = parser.parse_args()
|
|
args.output.mkdir(parents=True, exist_ok=True)
|
|
with wave.open(str(args.source), "rb") as source:
|
|
params = source.getparams()
|
|
if params.nchannels != 1 or params.sampwidth != 2 or params.framerate != 16000:
|
|
raise ValueError("Source must be mono 16 kHz PCM16")
|
|
samples = source.readframes(params.nframes)
|
|
rng = random.Random(args.seed)
|
|
records = []
|
|
for index, seconds in enumerate([2.7, 5.3, 8.1, 12.6, 17.4]):
|
|
count = round(seconds * params.framerate)
|
|
start = rng.randrange(params.nframes - count + 1)
|
|
records.append((f"random{index + 1}", start, count))
|
|
if args.long_repeat < 1:
|
|
raise ValueError("--long-repeat must be positive")
|
|
long_samples = samples * args.long_repeat
|
|
long_frames = params.nframes * args.long_repeat
|
|
long_path = args.source
|
|
if args.long_repeat > 1:
|
|
long_path = args.output / "longform.wav"
|
|
with wave.open(str(long_path), "wb") as target:
|
|
target.setparams(params)
|
|
target.writeframes(long_samples)
|
|
for index, start in enumerate(range(0, long_frames, 25 * params.framerate)):
|
|
records.append((f"long-part{index + 1:02d}", start, min(25 * params.framerate, long_frames - start)))
|
|
manifest = []
|
|
for name, start, count in records:
|
|
path = args.output / (name + ".wav")
|
|
with wave.open(str(path), "wb") as target:
|
|
target.setparams(params)
|
|
data = long_samples if name.startswith("long-part") else samples
|
|
target.writeframes(data[start * 2:(start + count) * 2])
|
|
manifest.append({"id": name, "audio": str(path), "start_sample": start, "samples": count})
|
|
(args.output / "manifest.json").write_text(json.dumps(manifest, indent=2) + "\n")
|
|
requests = [{"id": item["id"], "audio": item["audio"]} for item in manifest]
|
|
requests.append({"id": "longform", "audio": str(long_path),
|
|
"options": {"audio_chunk_mode": "fixed"}})
|
|
requests.append({"id": "longform_auto", "audio": str(long_path)})
|
|
requests.append({"id": "longform_auto_repeat", "audio": str(long_path)})
|
|
requests.append({"id": "repeat_after_long", "audio": manifest[0]["audio"]})
|
|
case = {"id": "gigaam_random_longform", "family": "gigaam_asr", "task": "asr",
|
|
"model": "GigaAM-ASR-GGUF/gigaam-v3-ctc-f16.gguf", "outputs": ["text"],
|
|
"coverage": "Random speech crops, fixed-boundary longform, and short-after-long reuse.",
|
|
"requests": requests}
|
|
(args.output / "path_cases.json").write_text(json.dumps({"cases": [case]}, indent=2) + "\n")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|