POWSM is the first phonetic foundation model that can perform four phone-related tasks:
Phone Recognition (PR), Automatic Speech Recognition (ASR), audio-guided grapheme-to-phoneme conversion (G2P), and audio-guided phoneme-to-grapheme
conversion (P2G).
[!TIP]
Check out our new model: 🐁POWSM-CTC, an encoder-only variant based on OWSM-CTC structure,
and 💎PRiSM: Benchmarking Phone Realization in Speech Models!
To use the pre-trained model, please install espnet and espnet_model_zoo. The requirements are:
Our models are trained on 16kHz audio with a fixed duration of 20s. When using the pre-trained model, please ensure the input speech is 16kHz and pad or truncate it to 20s.
To distinguish phone entries from BPE tokens that share the same Unicode, we enclose every phone in slashes and treat them as special tokens. For example, /pʰɔsəm/ would be tokenized as /pʰ//ɔ//s//ə//m/.
[!NOTE]
Jan 2026: We release a retrained version with improved ASR text normalization.
It is located in the subfolder textnorm_retrained and has the same structure as the main model.
Additional details are provided in the updated arXiv appendix.
python
1from espnet2.bin.s2t_inference import Speech2Text
2import soundfile as sf # or librosa34task ="<pr>"5s2t = Speech2Text.from_pretrained(6"espnet/powsm",7 device="cuda",8 lang_sym="<eng>",# ISO 639-3; set to <unk> for unseen languages9 task_sym=task,# <pr>, <asr>, <g2p>, <p2g>10)1112speech, rate = sf.read("sample.wav")13prompt ="<na>"# G2P: set to ASR transcript; P2G: set to phone transcription with slashes14pred = s2t(speech, text_prev=prompt)[0][0]1516# post-processing for better format17pred = pred.split("<notimestamps>")[1].strip()18if task =="<pr>"or task =="<g2p>":19 pred = pred.replace("/","")20print(pred)
Other tasks
See force_align.py in ESPnet recipe to try out CTC forced alignment with POWSM's encoder!
LID is learned implicitly during training, and you may run it with the script below:
python
1from espnet2.bin.s2t_inference_language import Speech2Language
2import soundfile as sf # or librosa34s2t = Speech2Language.from_pretrained(5"espnet/powsm",6 device="cuda",7 nbest=1,# number of possible languages to return8 first_lang_sym="<afr>",# fixed; defined in vocab list9 last_lang_sym="<zul>"# fixed; defined in vocab list10)1112speech, rate = sf.read("sample.wav")13pred = model(speech)[0]# a list of lang-prob pair14print(pred)
Citations
BibTex
1@article{powsm,
2 title={POWSM: A Phonetic Open Whisper-Style Speech Foundation Model},
3 author={Chin-Jou Li and Kalvin Chang and Shikhar Bharadwaj and Eunjung Yeo and Kwanghee Choi and Jian Zhu and David Mortensen and Shinji Watanabe},
4 year={2025},
5 eprint={2510.24992},
6 archivePrefix={arXiv},
7 primaryClass={cs.CL},
8 url={https://arxiv.org/abs/2510.24992},
9}