# STT Runner Speech-to-Text transcription using sherpa-onnx + Qwen3-ASR, Text-to-Speech with ZipVoice (zero-shot voice cloning), and LLM/embedding inference with llama.cpp (Granite-4.2 + nomic-embed-text-v1.5). ## Installation ```bash python3 -m venv .venv .venv/bin/pip install -r requirements.txt ``` ## Usage ### Speech-to-Text ```bash python stt_runner.py [--language=Indonesian] audio1.wav audio2.wav ... ``` ### Text-to-Speech ```bash python tts_runner.py [--output=out.wav] [--ref-audio=ref.wav] [--ref-text="..."] "text to speak" ``` Output defaults to `output.wav`. The reference audio/text (voice to clone) is set in `config/tts.py` and can be overridden per-run with `--ref-audio` / `--ref-text` (the text must match the audio exactly). ### LLM Chat (llama.cpp) ```bash python llm_runner.py "What is the capital of France?" # single prompt python llm_runner.py # interactive chat ``` ### Embedding (llama.cpp) ```bash python embed_runner.py "text to embed" "another text" python embed_runner.py "What is TSNE?" --prefix "search_query: " ``` ## Configuration Model paths and inference parameters are hardcoded in `config/`: - `config/model.py` — model paths (conv_frontend, encoder, decoder, tokenizer under `models/`) - `config/asr.py` — inference params: `LANGUAGE`, `HOTWORDS`, `NUM_THREADS`, `PROVIDER`, `SAMPLE_RATE`, `FEATURE_DIM`, `MAX_TOTAL_LEN`, `MAX_NEW_TOKENS` - `config/tts.py` — TTS model paths, `REFERENCE_AUDIO`, `REFERENCE_TEXT`, `OUTPUT_FILE`, `NUM_THREADS`, `PROVIDER`, `NUM_STEPS` - `config/llm.py` — Granite-4.2 model path, `N_CTX`, `N_THREADS`, `N_GPU_LAYERS`, `MAX_TOKENS`, `TEMPERATURE`, `TOP_P`, `TOP_K`, `SYSTEM_PROMPT`, `CHAT_TEMPLATE` - `config/embed.py` — nomic-embed-text-v1.5 model path, `N_CTX`, `N_THREADS`, `PREFIX_QUERY`, `PREFIX_DOCUMENT`, `DEFAULT_PREFIX` `LANGUAGE` defaults to `""` (all languages / auto-detect). Passing `--language` on the CLI overrides it. ## Download Model (Qwen3-ASR 1.7B int8) ```bash BASE="https://modelscope.cn/models/zengshuishui/Qwen3-ASR-onnx/resolve/master" mkdir -p models/model_1.7B models/tokenizer wget -O models/model_1.7B/conv_frontend.onnx "$BASE/model_1.7B/conv_frontend.onnx" wget -O models/model_1.7B/encoder.int8.onnx "$BASE/model_1.7B/encoder.int8.onnx" wget -O models/model_1.7B/decoder.int8.onnx "$BASE/model_1.7B/decoder.int8.onnx" for f in vocab.json merges.txt tokenizer_config.json preprocessor_config.json config.json chat_template.json; do wget -O "models/tokenizer/$f" "$BASE/tokenizer/$f" done ``` ## Download Model (ZipVoice TTS) ```bash mkdir -p models/zipvoice wget -qO- https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/sherpa-onnx-zipvoice-distill-int8-zh-en-emilia.tar.bz2 \ | tar xjf - -C models/zipvoice --strip-components=1 wget -O models/zipvoice/vocos_24khz.onnx \ https://github.com/k2-fsa/sherpa-onnx/releases/download/vocoder-models/vocos_24khz.onnx ``` ## Download Model (Granite-4.2 8B Q4_K_M) ```bash mkdir -p models/granite-4.2 wget -O models/granite-4.2/granite-4.2-8b-Q4_K_M.gguf \ "https://huggingface.co/ibm-granite/granite-4.2-8b-GGUF/resolve/main/granite-4.2-8b-Q4_K_M.gguf" ``` ## Download Model (nomic-embed-text-v1.5) ```bash mkdir -p models/nomic-embed-text-v1.5 wget -O models/nomic-embed-text-v1.5/nomic-embed-text-v1.5.Q4_K_M.gguf \ "https://huggingface.co/nomic-ai/nomic-embed-text-v1.5-GGUF/resolve/main/nomic-embed-text-v1.5.Q4_K_M.gguf" ```