voice_audio_multi/tests/gigaam_asr/prepare_inputs.py
Fabio c36510c21e
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
Initial import: audio.cpp with Orange Pi documentation
2026-11-04 19:05:22 +01:00

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()