Converting spoken mathematical expressions into LaTeX: models, datasets, and benchmarks for S2L-equations and S2L-sentences in English and Russian.
Paper: Speech-to-LaTeX: New Models and Datasets for Converting Spoken Equations and Sentences (arXiv:2508.03542)
Project page (demos & samples): GitHub Pages — enable in repo Settings → Pages → Source: Deploy from branch → Branch: main (or master) → /docs.
Colab demo: Open in Colab — run ASR post-correction in the browser; choose a model, play repo samples (no dataset download), or record/upload your own audio.
| Path | Description |
|---|---|
ProcessLaTeXFormulaTools/ | LaTeX formula normalization |
ASRPostCorrection/ | ASR post-correction training and evaluation |
Multimodal/ | Gemma and SALMONN for Speech2LaTeX |
sample_datasets/ | Sample audio (equations & sentences, train/test) |
LaTeX normalization in ProcessLaTeXFormulaTools/process_formula/normalize_formulas.py:
from ProcessLaTeXFormulaTools.process_formula import NormalizeFormula
norm = NormalizeFormula(check_node=False)
print(norm(" \sum_i^n i ")) # ['\\sum_{i}^{n}i']
Install: pip install -r ProcessLaTeXFormulaTools/requirements.txt (from ProcessLaTeXFormulaTools/).
conda env create -f envs/multimodal/gemma_env.yml
conda activate gemma_s2l
If needed (PyTorch):
pip install torch==2.6.0 torchvision==0.21.0 torchaudio==2.6.0 --index-url https://download.pytorch.org/whl/cu124
In Multimodal/Gemma: create train.csv and test.csv with audio_path and formula_normalized, then:
python gemma_ft.py
python gemma_inf.py
Multi-GPU: torchrun --nproc_per_node="3" gemma_ft.py
conda env create -f envs/multimodal/salmonn_env.yml
conda activate salmonn_s2l
In Multimodal/Salmonn/SALMONN: download checkpoints (see configs/config.yaml), create CSV with audio_path and formula_normalized, then:
python convert_csv_to_json_annot.py
python train.py --cfg-path configs/config.yaml
Inference:
python inference.py --cfg-path "./configs/decode_config.yaml" --test_table "test.csv"
Training:
cd ASRPostCorrection
PYTHONPATH=. python train_qwen.py --config ./config-qwen2.5-in_context_training.json --train_df ../Data/latex_in_context_tts/latex_in_context_tts_v2_train.csv --val_df ../Data/latex_in_context_tts/latex_in_context_tts_v2_test.csv
Testing:
python test_qwen.py --cuda 0 --test_file_csv ../Data/latex_in_context_tts/latex_in_context_tts_v2_test.csv --batch_size 20 --ckpt ./ckpts/tts-in-context/version_9/
Evaluation:
from s2l.eval import LatexInContextMetrics
in_context_metrics = LatexInContextMetrics()
metrics_values = in_context_metrics.compute_all(outputs['latex_pred'], outputs['latex_true'])
in_context_metrics.dump(metrics_values)
CLI: python src/s2l/eval.py --csv-data <path> --pred-column model_prediction --target-column target_text
Run the Qwen checkpoint on repo sample audio and save JSON for the project page demo:
cd ASRPostCorrection
PYTHONPATH=. python run_qwen_demo.py --ckpt /path/to/checkpoint --output ../docs/demo_results.json
Without --samples_csv: the script loads HuggingFace marsianin500/Speech2Latex, matches samples to sample_datasets/, runs Whisper on local wavs, then Qwen. With --samples_csv: use a CSV with columns split, sample_id, whisper_transcription, reference_latex. Commit docs/demo_results.json so the project page can show reference vs predicted LaTeX per sample.
Upload selected ckpts to marsianin500 for the Colab demo:
cd ASRPostCorrection
pip install huggingface_hub
huggingface-cli login
python upload_ckpts_to_hf.py [--ckpts_dir ./ckpts] [--dry_run]
See upload_ckpts_to_hf.py for the list of models (0.5B, 1.5B, math-1.5B, 7B LoRA). Repo IDs: marsianin500/<base>-<variant>.
Pre-trained checkpoints (use in Colab demo or load with transformers):
| Model | Hugging Face |
|---|---|
| Qwen2.5-0.5B (equations, multilingual mix) | marsianin500/Qwen2.5-0.5B-instruct-equations_multilingual_mix |
| Qwen2.5-0.5B (equations, multilingual mix full) | marsianin500/Qwen2.5-0.5B-instruct-equations_multilingual_mix_full |
| Qwen2.5-0.5B (sentences, eng mix) | marsianin500/Qwen2.5-0.5B-instruct-sentences_eng_mix |
| Qwen2.5-1.5B (equations, multilingual mix) | marsianin500/Qwen2.5-1.5B-instruct-equations_multilingual_mix |
| Qwen2.5-math-1.5B (equations, multilingual mix full) | marsianin500/Qwen2.5-math-1.5B-instruct-equations_multilingual_mix_full |
| Qwen2.5-math-1.5B (equations, multilingual mix) | marsianin500/Qwen2.5-math-1.5B-instruct-equations_multilingual_mix |
| Qwen2.5-math-1.5B (sentences, eng mix) | marsianin500/Qwen2.5-math-1.5B-instruct-sentences_eng_mix |
| Qwen2.5-7B LoRA (equations, multilingual mix) | marsianin500/Qwen2.5-7B-instruct-r16a64-equations_multilingual_mix |
| Qwen2.5-7B LoRA (equations, multilingual mix full) | marsianin500/Qwen2.5-7B-instruct-r16a64-equations_multilingual_mix_full |
conda env create -f envs/tts/tts_env.yml
conda activate tts_s2l
Create CSV/JSONL with id, pronunciation, language. Set path and output_dir in EngTTS/tts.py, then:
python EngTTS/tts.py
@inproceedings{
korzh2026speechtolatex,
title={Speech-to-LaTeX: New Models and Datasets for Converting Spoken Equations and Sentences},
author={Dmitrii Korzh and Dmitrii Tarasov and Artyom Iudin and Elvir Karimov and Matvey Skripkin and Nikita Kuzmin and Andrey Kuznetsov and Oleg Rogov and Ivan Oseledets},
booktitle={The Fourteenth International Conference on Learning Representations},
year={2026},
url={https://openreview.net/forum?id=gk8WMxzIQP}
}
Python
85.9%
Jupyter Notebook
10.2%
Cuda
1.8%
Shell
1.4%
Converting spoken mathematical expressions into LaTeX: models, datasets, and benchmarks for S2L-equations and S2L-sentences in English and Russian.
Paper: Speech-to-LaTeX: New Models and Datasets for Converting Spoken Equations and Sentences (arXiv:2508.03542)
Project page (demos & samples): GitHub Pages — enable in repo Settings → Pages → Source: Deploy from branch → Branch: main (or master) → /docs.
Colab demo: Open in Colab — run ASR post-correction in the browser; choose a model, play repo samples (no dataset download), or record/upload your own audio.
| Path | Description |
|---|---|
ProcessLaTeXFormulaTools/ | LaTeX formula normalization |
ASRPostCorrection/ | ASR post-correction training and evaluation |
Multimodal/ | Gemma and SALMONN for Speech2LaTeX |
sample_datasets/ | Sample audio (equations & sentences, train/test) |
LaTeX normalization in ProcessLaTeXFormulaTools/process_formula/normalize_formulas.py:
from ProcessLaTeXFormulaTools.process_formula import NormalizeFormula
norm = NormalizeFormula(check_node=False)
print(norm(" \sum_i^n i ")) # ['\\sum_{i}^{n}i']
Install: pip install -r ProcessLaTeXFormulaTools/requirements.txt (from ProcessLaTeXFormulaTools/).
conda env create -f envs/multimodal/gemma_env.yml
conda activate gemma_s2l
If needed (PyTorch):
pip install torch==2.6.0 torchvision==0.21.0 torchaudio==2.6.0 --index-url https://download.pytorch.org/whl/cu124
In Multimodal/Gemma: create train.csv and test.csv with audio_path and formula_normalized, then:
python gemma_ft.py
python gemma_inf.py
Multi-GPU: torchrun --nproc_per_node="3" gemma_ft.py
conda env create -f envs/multimodal/salmonn_env.yml
conda activate salmonn_s2l
In Multimodal/Salmonn/SALMONN: download checkpoints (see configs/config.yaml), create CSV with audio_path and formula_normalized, then:
python convert_csv_to_json_annot.py
python train.py --cfg-path configs/config.yaml
Inference:
python inference.py --cfg-path "./configs/decode_config.yaml" --test_table "test.csv"
Training:
cd ASRPostCorrection
PYTHONPATH=. python train_qwen.py --config ./config-qwen2.5-in_context_training.json --train_df ../Data/latex_in_context_tts/latex_in_context_tts_v2_train.csv --val_df ../Data/latex_in_context_tts/latex_in_context_tts_v2_test.csv
Testing:
python test_qwen.py --cuda 0 --test_file_csv ../Data/latex_in_context_tts/latex_in_context_tts_v2_test.csv --batch_size 20 --ckpt ./ckpts/tts-in-context/version_9/
Evaluation:
from s2l.eval import LatexInContextMetrics
in_context_metrics = LatexInContextMetrics()
metrics_values = in_context_metrics.compute_all(outputs['latex_pred'], outputs['latex_true'])
in_context_metrics.dump(metrics_values)
CLI: python src/s2l/eval.py --csv-data <path> --pred-column model_prediction --target-column target_text
Run the Qwen checkpoint on repo sample audio and save JSON for the project page demo:
cd ASRPostCorrection
PYTHONPATH=. python run_qwen_demo.py --ckpt /path/to/checkpoint --output ../docs/demo_results.json
Without --samples_csv: the script loads HuggingFace marsianin500/Speech2Latex, matches samples to sample_datasets/, runs Whisper on local wavs, then Qwen. With --samples_csv: use a CSV with columns split, sample_id, whisper_transcription, reference_latex. Commit docs/demo_results.json so the project page can show reference vs predicted LaTeX per sample.
Upload selected ckpts to marsianin500 for the Colab demo:
cd ASRPostCorrection
pip install huggingface_hub
huggingface-cli login
python upload_ckpts_to_hf.py [--ckpts_dir ./ckpts] [--dry_run]
See upload_ckpts_to_hf.py for the list of models (0.5B, 1.5B, math-1.5B, 7B LoRA). Repo IDs: marsianin500/<base>-<variant>.
Pre-trained checkpoints (use in Colab demo or load with transformers):
| Model | Hugging Face |
|---|---|
| Qwen2.5-0.5B (equations, multilingual mix) | marsianin500/Qwen2.5-0.5B-instruct-equations_multilingual_mix |
| Qwen2.5-0.5B (equations, multilingual mix full) | marsianin500/Qwen2.5-0.5B-instruct-equations_multilingual_mix_full |
| Qwen2.5-0.5B (sentences, eng mix) | marsianin500/Qwen2.5-0.5B-instruct-sentences_eng_mix |
| Qwen2.5-1.5B (equations, multilingual mix) | marsianin500/Qwen2.5-1.5B-instruct-equations_multilingual_mix |
| Qwen2.5-math-1.5B (equations, multilingual mix full) | marsianin500/Qwen2.5-math-1.5B-instruct-equations_multilingual_mix_full |
| Qwen2.5-math-1.5B (equations, multilingual mix) | marsianin500/Qwen2.5-math-1.5B-instruct-equations_multilingual_mix |
| Qwen2.5-math-1.5B (sentences, eng mix) | marsianin500/Qwen2.5-math-1.5B-instruct-sentences_eng_mix |
| Qwen2.5-7B LoRA (equations, multilingual mix) | marsianin500/Qwen2.5-7B-instruct-r16a64-equations_multilingual_mix |
| Qwen2.5-7B LoRA (equations, multilingual mix full) | marsianin500/Qwen2.5-7B-instruct-r16a64-equations_multilingual_mix_full |
conda env create -f envs/tts/tts_env.yml
conda activate tts_s2l
Create CSV/JSONL with id, pronunciation, language. Set path and output_dir in EngTTS/tts.py, then:
python EngTTS/tts.py
@inproceedings{
korzh2026speechtolatex,
title={Speech-to-LaTeX: New Models and Datasets for Converting Spoken Equations and Sentences},
author={Dmitrii Korzh and Dmitrii Tarasov and Artyom Iudin and Elvir Karimov and Matvey Skripkin and Nikita Kuzmin and Andrey Kuznetsov and Oleg Rogov and Ivan Oseledets},
booktitle={The Fourteenth International Conference on Learning Representations},
year={2026},
url={https://openreview.net/forum?id=gk8WMxzIQP}
}
Python
85.9%
Jupyter Notebook
10.2%
Cuda
1.8%
Shell
1.4%