phonetik
A Rust library and HTTP server for English phonetic analysis. Rhyme detection, stress scanning, meter identification, and syllable counting — backed by the full CMU Pronouncing Dictionary compiled directly into the binary.
No files to download. No API keys. No runtime dependencies. Phonetik::new() and go.
What it does
- Rhyme finding — perfect, slant, and near rhymes with confidence scores
- Stress analysis — extract stress patterns from any English text
- Meter detection — identify iambic pentameter, trochaic tetrameter, etc.
- Phoneme lookup — ARPAbet transcriptions for 126K words
- Syllable counting — per-word and batch
- Rhyme map — detect phoneme repetition patterns across lines of verse
- Word comparison — phonetic similarity scoring between any two words
Install
[dependencies]
phonetik = "0.3"
Or install the binaries:
cargo install phonetik
This gives you phonetik-server (HTTP API) and phonetik-mcp (MCP tool server).
Usage
use phonetik::Phonetik;
let ph = Phonetik::new();
// Rhymes
for r in ph.rhymes("love", 10) {
println!("{} ({:?}, {:.0}%)", r.word, r.rhyme_type, r.confidence * 100.0);
}
// ABOVE (Perfect, 100%)
// DOVE (Perfect, 100%)
// GLOVE (Perfect, 100%)
// MOVE (Slant, 60%)
// GROOVE (Slant, 60%)
// Meter
let scan = ph.scan("uneasy lies the head that wears the crown");
println!("{} — {}", scan.visual, scan.meter.name);
// x / x / x / x / x / — iambic pentameter
// Comparison
let cmp = ph.compare("cat", "bat").unwrap();
println!("{:.0}% similar, {:?}", cmp.similarity * 100.0, cmp.rhyme_type);
// 67% similar, Perfect
// Lookup
let info = ph.lookup("extraordinary").unwrap();
println!("{}: {} syllables", info.word, info.syllable_count);
// EXTRAORDINARY: 6 syllables
How it works
The entire CMU Pronouncing Dictionary is compiled into the binary at build time. Every phoneme is encoded as a single byte — no strings in the hot path. Rhyme detection is algorithmic:
- Perfect rhymes are resolved by grouping words that share identical sound from their last stressed vowel onward. One hash lookup.
- Slant rhymes use a vowel distance matrix and coda suffix matching. Words sharing the same consonant ending but different vowels (love/move) are found by index traversal, not pairwise comparison.
- Near rhymes walk a precomputed graph of consonant clusters that differ by one edit. Same vowel, slightly different ending (night/nice).
Server
The crate includes an HTTP server binary behind the server feature (enabled by default):
cargo install phonetik
phonetik-server
# Phonetik starting on :1273 [126052 words]
Endpoints: /health, /syllables, /syllable-counts, /rhymes, /rhymes/perfect, /rhymes/slant, /rhymes/near, /compare, /scan, /rhymemap, /document
MCP
phonetik includes an MCP (Model Context Protocol) server so AI assistants can use it as a tool. Runs over stdio — no network, no auth.
cargo install phonetik
Add to your MCP client config (Claude Code, Cursor, etc.):
{
"phonetik": {
"command": "phonetik-mcp"
}
}
Tools: lookup, rhymes, scan, compare, analyze_document
Feature flags
Both server and mcp are enabled by default. For library-only use:
[dependencies]
phonetik = { version = "0.3", default-features = false }
License
MIT