Automatic Speech Recognition
Transformers
qwen3-asr
latent-reasoning
test-time-compute
parameter-efficient
Instructions to use voidful/latentASR with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use voidful/latentASR with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("automatic-speech-recognition", model="voidful/latentASR")# Load model directly from transformers import AutoModel model = AutoModel.from_pretrained("voidful/latentASR", device_map="auto") - Notebooks
- Google Colab
- Kaggle
| set -euo pipefail | |
| SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" | |
| ROOT_DIR="$(cd "${SCRIPT_DIR}/../.." && pwd)" | |
| cd "${ROOT_DIR}" | |
| LATENT_CKPT="${1:-}" | |
| if [[ -z "${LATENT_CKPT}" ]]; then | |
| echo "Usage: $0 <latent_checkpoint>" >&2 | |
| exit 1 | |
| fi | |
| if [[ ! -f "${LATENT_CKPT}" ]]; then | |
| echo "[error] Latent checkpoint not found: ${LATENT_CKPT}" >&2 | |
| exit 1 | |
| fi | |
| echo "============================================================" >&2 | |
| echo "Hyperparameter Grid Search on SpeechTest/fleurs (en)" >&2 | |
| echo "============================================================" >&2 | |
| DATASET="SpeechTest/fleurs" | |
| SPLIT="test" | |
| CONFIG="en" | |
| SEARCH_ALPHAS=(0.05 0.1 0.15 0.2) | |
| SEARCH_DEQ_TOLS=(0.01 0.05 0.1 0.5 1.0) | |
| BEST_ALPHA="-1.0" | |
| BEST_DEQ_TOL="0.1" | |
| BEST_WER=100.0 | |
| echo "Searching alphas: ${SEARCH_ALPHAS[*]}" >&2 | |
| echo "Searching DEQ tolerances: ${SEARCH_DEQ_TOLS[*]}" >&2 | |
| # Create a temporary directory for JSON outputs | |
| TMP_DIR=$(mktemp -d) | |
| trap 'rm -rf -- "$TMP_DIR"' EXIT | |
| for tol in "${SEARCH_DEQ_TOLS[@]}"; do | |
| for alpha in "${SEARCH_ALPHAS[@]}"; do | |
| JSON_OUT="${TMP_DIR}/res_${alpha}_${tol}.json" | |
| EVAL_LOG="${TMP_DIR}/eval_${alpha}_${tol}.log" | |
| echo " --> Testing alpha=${alpha}, deq_tol=${tol} ..." >&2 | |
| if python eval.py \ | |
| --dataset-name "${DATASET}" \ | |
| --configs "${CONFIG}" \ | |
| --split "${SPLIT}" \ | |
| --latent-ckpt "${LATENT_CKPT}" \ | |
| --skip-base-model \ | |
| --skip-baseline-ft \ | |
| --skip-prompt-tuning \ | |
| --skip-lora-r16 \ | |
| --output-json "${JSON_OUT}" \ | |
| --n-latent 4 \ | |
| --num-beams 1 \ | |
| --deq-tol "${tol}" \ | |
| --alpha "${alpha}" >"${EVAL_LOG}" 2>&1; then | |
| if [[ -f "${JSON_OUT}" ]]; then | |
| # Parse WER from JSON output | |
| LATENT_WER=$(python -c " | |
| import json, sys | |
| data = json.load(open(sys.argv[1])) | |
| try: | |
| wer = data['rows'][0]['latent_reasoning_wer'] | |
| print(f'{wer:.6f}' if wer is not None else '100.0') | |
| except: | |
| print('100.0') | |
| " "${JSON_OUT}") | |
| echo " WER for alpha=${alpha}, deq_tol=${tol} : ${LATENT_WER}" >&2 | |
| # Compare to find the minimum WER | |
| IS_BETTER=$(python -c "print('1' if float(${LATENT_WER}) < float(${BEST_WER}) else '0')") | |
| if [[ "${IS_BETTER}" == "1" ]]; then | |
| BEST_ALPHA=${alpha} | |
| BEST_DEQ_TOL=${tol} | |
| BEST_WER=${LATENT_WER} | |
| fi | |
| else | |
| echo " Failed to evaluate alpha=${alpha}, deq_tol=${tol} (No JSON)" >&2 | |
| fi | |
| else | |
| echo " Failed to evaluate alpha=${alpha}, deq_tol=${tol} (error)" >&2 | |
| echo " Check logs for details: vim ${EVAL_LOG}" >&2 | |
| fi | |
| done | |
| done | |
| echo "" >&2 | |
| echo "============================================================" >&2 | |
| echo "Best Alpha: ${BEST_ALPHA}, Best DEQ Tol: ${BEST_DEQ_TOL} (WER: ${BEST_WER})" >&2 | |
| echo "============================================================" >&2 | |
| # Output only the best values on stdout for capture | |
| echo "${BEST_ALPHA} ${BEST_DEQ_TOL}" | |