Views
No views yet
Nf3, exd5, O-O)onnx/encoder_model_int8.onnx — INT8 encoder (Conv layers kept FP32 for WASM compat)onnx/decoder_model_merged_int8.onnx — INT8 merged decoderggml/) — for whisper.cpp / mobile (React Native, Flutter, native apps):ggml/ggml-tiny.bin (77.7 MB) — FP16ggml/ggml-tiny-q5_0.bin (29.9 MB) — Q5_0 quantized (recommended for mobile)1import { pipeline } from "@huggingface/transformers";
2
3const transcriber = await pipeline(
4 "automatic-speech-recognition",
5 "atamano/whisper-chess-tiny-fr",
6 { dtype: { encoder_model: "int8", decoder_model_merged: "int8" } }
7);
8
9const result = await transcriber(audio, { language: "fr", task: "transcribe" });
10console.log(result.text); // e.g. "fou d 5"1from transformers import WhisperProcessor
2from optimum.onnxruntime import ORTModelForSpeechSeq2Seq
3
4processor = WhisperProcessor.from_pretrained("atamano/whisper-chess-tiny-fr")
5model = ORTModelForSpeechSeq2Seq.from_pretrained(
6 "atamano/whisper-chess-tiny-fr",
7 encoder_file_name="encoder_model_int8.onnx",
8 decoder_file_name="decoder_model_int8.onnx",
9 use_cache=True,
10)
11model.generation_config.forced_decoder_ids = processor.get_decoder_prompt_ids(
12 language="fr", task="transcribe", no_timestamps=True
13)ggml/ggml-tiny-q5_0.bin and pass it to your whisper.cpp binding of choice:initWhisper({ filePath: '.../ggml-tiny-q5_0.bin' }))"fou d 5", "tour prend e huit", "petit roque"), not algebraic notation. To play the move on a board you need two more steps that this checkpoint does NOT do for you:"fou d 5" → Bd5).a/b/c/d/e/f/g/h sound very close in French and the small Whisper architecture confuses them on roughly 10% of utterances).parseChessMove(text) — fuzzy speech → algebraic notationfindClosestLegalMove(text, legalSans, language) — when the parsed move isn't legal, picks the legal move whose canonical spoken form has the smallest edit distance to the transcription. Resolves ~7% of in-production misrecognitions without any model change.audio
↓ Whisper (this model)
text ("fou g 5")
↓ parseChessMove
SAN ("Bg5")
↓ chess.js / python-chess legal moves filter
│
├─ legal → play it
└─ illegal → findClosestLegalMove(text, legalSans, "fr")
↓ ("Bd5" with edit-distance 1)
play itdata/processed/training_moves.json — regenerate from the canonical vocab via python training/generate_moves.py.openai/whisper-tiny (39M params, 98% trainable via full fine-tune)speakchess.indiefoundry.com/contributesuppress_tokens whitelist: 164 chess-vocab tokens, all others suppressed at generation