SpeechMarkdown parser - convert SpeechMarkdown to SSML
Project description
SpeechMarkdown Rust
High-performance SpeechMarkdown parser written in Rust. Converts SpeechMarkdown syntax to platform-specific SSML for Amazon Alexa, Google Assistant, Microsoft Azure, and more.
Install
| Language | Package | Install |
|---|---|---|
| Rust | speechmarkdown-rust | cargo add speechmarkdown-rust |
| Python | speechmarkdown-rust | pip install speechmarkdown-rust |
| Node.js | speechmarkdown | npm install speechmarkdown |
| .NET | SpeechMarkdown | dotnet add package SpeechMarkdown |
| Swift | Release asset | Download speechmarkdown-swift-package.zip |
Supported Platforms
| Platform | String ID |
|---|---|
| Amazon Alexa | "amazon-alexa" or "alexa" |
| Google Assistant | "google-assistant" or "google" |
| Microsoft Azure | "microsoft-azure" or "azure" |
| Apple | "apple" |
| W3C | "w3c" |
| Samsung Bixby | "samsung-bixby" or "bixby" |
| ElevenLabs | "elevenlabs" |
| IBM Watson | "ibm-watson" or "watson" |
API
All bindings expose the same core methods:
| Method | Returns | Description |
|---|---|---|
to_ssml(input, platform) |
string |
Convert SpeechMarkdown to SSML for the given platform |
to_text(input) |
string |
Convert SpeechMarkdown to plain text (strips all markup) |
to_smd(ssml) |
string |
Convert SSML to SpeechMarkdown (best-effort, lossy for unsupported elements) |
parse(input) |
string (JSON) |
Parse SpeechMarkdown and return the AST as JSON |
is_speech_markdown(input) |
bool |
Check if a string contains SpeechMarkdown syntax |
validate(input) |
bool |
Validate that SpeechMarkdown parses without errors |
Usage
Rust
use speechmarkdown_rust::{SpeechMarkdownParser, Platform};
// Convert to SSML
let ssml = SpeechMarkdownParser::to_ssml(
"Hello (world)[emphasis:\"strong\"]",
Platform::AmazonAlexa,
)?;
// Convert to plain text
let text = SpeechMarkdownParser::to_text("Hello (world)[emphasis:\"strong\"]")?;
// Parse to AST (JSON string)
let ast = SpeechMarkdownParser::parse("Hello world")?;
// Check if input contains SpeechMarkdown syntax
if SpeechMarkdownParser::is_speech_markdown(&input) {
// ...
}
// Validate input
SpeechMarkdownParser::validate(&input)?;
// Convert SSML back to SpeechMarkdown (best-effort)
let smd = SpeechMarkdownParser::to_smd(r#"<speak><emphasis level="strong">word</emphasis></speak>"#)?;
// Returns: ++word++
Python
from speechmarkdown_rust import to_ssml, to_text, parse, is_speech_markdown, validate
ssml = to_ssml('Hello (world)[emphasis:"strong"]', 'amazon-alexa')
text = to_text('Hello (world)[emphasis:"strong"]')
ast = parse('Hello world')
is_smd = is_speech_markdown('Hello (world)[emphasis:"strong"]') # True
is_smd = is_speech_markdown('Hello world') # False
validate('Hello (world)[emphasis:"strong"]') # raises ValueError if invalid
# Convert SSML to SpeechMarkdown (best-effort)
smd = to_smd('<speak><emphasis level="strong">word</emphasis></speak>')
# Returns: ++word++
Node.js
const { to_ssml, to_text, parse, is_speech_markdown, validate } = require('speechmarkdown')
const ssml = to_ssml('Hello (world)[emphasis:"strong"]', 'amazon-alexa')
const text = to_text('Hello (world)[emphasis:"strong"]')
const ast = parse('Hello world')
is_speech_markdown('Hello (world)[emphasis:"strong"]') // true
is_speech_markdown('Hello world') // false
validate('Hello (world)[emphasis:"strong"]') // throws if invalid
// Convert SSML to SpeechMarkdown (best-effort)
const smd = to_smd('<speak><emphasis level="strong">word</emphasis></speak>')
// Returns: ++word++
.NET (C#)
using SpeechMarkdown;
var parser = new SpeechMarkdownParser();
string ssml = parser.ToSsml("Hello (world)[emphasis:\"strong\"]", Platform.AmazonAlexa);
string text = parser.ToText("Hello (world)[emphasis:\"strong\"]");
string json = parser.ParseToJson("Hello world");
bool isSmd = parser.IsSpeechMarkdown("Hello (world)[emphasis:\"strong\"]"); // true
parser.Validate("Hello (world)[emphasis:\"strong\"]"); // throws on invalid
// Convert SSML to SpeechMarkdown (best-effort)
string smd = parser.ToSmd("<speak><emphasis level=\"strong\">word</emphasis></speak>");
// Returns: ++word++
Swift
Download speechmarkdown-swift-package.zip from the latest release, unzip it, and add it as a local package in Xcode. Includes macOS (arm64 + x86_64), iOS device (arm64), and iOS simulator (arm64) slices.
- Xcode: File > Add Packages > Add Local > select the unzipped directory
- Or in Package.swift:
.package(path: "./path/to/speechmarkdown-swift-package")
To build from source instead: ./build-swift-package.sh (requires Rust toolchain with aarch64-apple-darwin and x86_64-apple-darwin targets)
import SpeechMarkdown
let parser = SpeechMarkdownParser()
let ssml = try parser.toSsml(input: "Hello (world)[emphasis:\"strong\"]", platform: "amazon-alexa")
let text = try parser.toText(input: "Hello (world)[emphasis:\"strong\"]")
let json = try parser.parseToJson(input: "Hello world")
let isSmd = parser.isSpeechMarkdown(input: "Hello (world)[emphasis:\"strong\"]") // true
try parser.validate(input: "Hello (world)[emphasis:\"strong\"]") // throws on invalid
// Convert SSML to SpeechMarkdown (best-effort)
let smd = try parser.toSmd(ssml: "<speak><emphasis level=\"strong\">word</emphasis></speak>")
// Returns: ++word++
C API
#include "speechmarkdown.h"
// Convert to SSML
const char* ssml = speechmarkdown_to_ssml("Hello (world)[emphasis:\"strong\"]", "amazon-alexa");
speechmarkdown_free((char*)ssml);
// Convert to plain text
const char* text = speechmarkdown_to_text("Hello (world)[emphasis:\"strong\"]");
speechmarkdown_free((char*)text);
// Parse to JSON
const char* json = speechmarkdown_parse("Hello world");
speechmarkdown_free((char*)json);
// Check for SpeechMarkdown syntax
bool is_smd = speechmarkdown_is_speech_markdown("Hello (world)[emphasis:\"strong\"]");
// Validate
bool valid = speechmarkdown_validate("Hello (world)[emphasis:\"strong\"]");
// Convert SSML to SpeechMarkdown (best-effort)
const char* smd = speechmarkdown_to_smd("<speak><emphasis level=\"strong\">word</emphasis></speak>");
speechmarkdown_free((char*)smd);
// Get last error (thread-local)
const char* err = speechmarkdown_get_error();
Building from Source
cargo build --release
This produces:
- Windows:
target/release/speechmarkdown_rust.dll - macOS:
target/release/libspeechmarkdown_rust.dylib - Linux:
target/release/libspeechmarkdown_rust.so
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file speechmarkdown_rust-0.1.15.tar.gz.
File metadata
- Download URL: speechmarkdown_rust-0.1.15.tar.gz
- Upload date:
- Size: 492.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4bcad418f2eae21dbb32de936ba45e2950b40695cfcd545b8babacc752295f98
|
|
| MD5 |
021bb7454a1870d3a6d8b7f6867ec05b
|
|
| BLAKE2b-256 |
37bc2f4087781fed39b72a67f3120e217c9e3fd6523186a650a0c4f2841ad919
|
Provenance
The following attestation bundles were made for speechmarkdown_rust-0.1.15.tar.gz:
Publisher:
publish.yml on AACTools/speechmarkdown-rust
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
speechmarkdown_rust-0.1.15.tar.gz -
Subject digest:
4bcad418f2eae21dbb32de936ba45e2950b40695cfcd545b8babacc752295f98 - Sigstore transparency entry: 1602252630
- Sigstore integration time:
-
Permalink:
AACTools/speechmarkdown-rust@95c769cab47c33f0e52c20f3eabb0722aef47f43 -
Branch / Tag:
refs/tags/v0.1.15 - Owner: https://github.com/AACTools
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@95c769cab47c33f0e52c20f3eabb0722aef47f43 -
Trigger Event:
push
-
Statement type:
File details
Details for the file speechmarkdown_rust-0.1.15-cp313-cp313-win_amd64.whl.
File metadata
- Download URL: speechmarkdown_rust-0.1.15-cp313-cp313-win_amd64.whl
- Upload date:
- Size: 252.0 kB
- Tags: CPython 3.13, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c7d8c3d8615390bf3c18bd08d41bd02b6af2914efeb89a5cd116a7bf0a4447c7
|
|
| MD5 |
b460ba06cd0a3ca3cb9b78b2baecc750
|
|
| BLAKE2b-256 |
174c365bdef610bc86f8ea267b3180576f84665059cb8b0773a4a9bf9143d344
|
Provenance
The following attestation bundles were made for speechmarkdown_rust-0.1.15-cp313-cp313-win_amd64.whl:
Publisher:
publish.yml on AACTools/speechmarkdown-rust
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
speechmarkdown_rust-0.1.15-cp313-cp313-win_amd64.whl -
Subject digest:
c7d8c3d8615390bf3c18bd08d41bd02b6af2914efeb89a5cd116a7bf0a4447c7 - Sigstore transparency entry: 1602252741
- Sigstore integration time:
-
Permalink:
AACTools/speechmarkdown-rust@95c769cab47c33f0e52c20f3eabb0722aef47f43 -
Branch / Tag:
refs/tags/v0.1.15 - Owner: https://github.com/AACTools
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@95c769cab47c33f0e52c20f3eabb0722aef47f43 -
Trigger Event:
push
-
Statement type:
File details
Details for the file speechmarkdown_rust-0.1.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: speechmarkdown_rust-0.1.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 397.1 kB
- Tags: CPython 3.13, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dcf906c1e9d1c4b2b1081209076fa879d494e63a899dc89950118daf78384ce2
|
|
| MD5 |
677b9772b06a9bb92dc2efd5a6bd9969
|
|
| BLAKE2b-256 |
17b1f61026a078791ffbef866b2614d87925339c7fff78d1fc22cf93b914d308
|
Provenance
The following attestation bundles were made for speechmarkdown_rust-0.1.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
publish.yml on AACTools/speechmarkdown-rust
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
speechmarkdown_rust-0.1.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
dcf906c1e9d1c4b2b1081209076fa879d494e63a899dc89950118daf78384ce2 - Sigstore transparency entry: 1602252775
- Sigstore integration time:
-
Permalink:
AACTools/speechmarkdown-rust@95c769cab47c33f0e52c20f3eabb0722aef47f43 -
Branch / Tag:
refs/tags/v0.1.15 - Owner: https://github.com/AACTools
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@95c769cab47c33f0e52c20f3eabb0722aef47f43 -
Trigger Event:
push
-
Statement type:
File details
Details for the file speechmarkdown_rust-0.1.15-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: speechmarkdown_rust-0.1.15-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 387.0 kB
- Tags: CPython 3.13, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ef4083a27f73e1c6f996e4ef8d075ce3940dd39be7ad5b5377f10693f1a72d6b
|
|
| MD5 |
e8ff81aab173038cd6f5856490c83ab0
|
|
| BLAKE2b-256 |
757a5be9521b49e2cc9a0fced5330b5d0620b9e43c7437dd037f8ea7bc7ba0b3
|
Provenance
The following attestation bundles were made for speechmarkdown_rust-0.1.15-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:
Publisher:
publish.yml on AACTools/speechmarkdown-rust
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
speechmarkdown_rust-0.1.15-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl -
Subject digest:
ef4083a27f73e1c6f996e4ef8d075ce3940dd39be7ad5b5377f10693f1a72d6b - Sigstore transparency entry: 1602252803
- Sigstore integration time:
-
Permalink:
AACTools/speechmarkdown-rust@95c769cab47c33f0e52c20f3eabb0722aef47f43 -
Branch / Tag:
refs/tags/v0.1.15 - Owner: https://github.com/AACTools
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@95c769cab47c33f0e52c20f3eabb0722aef47f43 -
Trigger Event:
push
-
Statement type:
File details
Details for the file speechmarkdown_rust-0.1.15-cp313-cp313-macosx_11_0_arm64.whl.
File metadata
- Download URL: speechmarkdown_rust-0.1.15-cp313-cp313-macosx_11_0_arm64.whl
- Upload date:
- Size: 348.6 kB
- Tags: CPython 3.13, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a97ef7b5ee7eb67d7e4b7b52982999f67a641b24e49f916c5392dd6584e8b4a0
|
|
| MD5 |
f20351aeeeeca424ab5c4e1c3fc5a3bf
|
|
| BLAKE2b-256 |
2da5b4917540fdf9337dda317b745297f755543eed7459a29d58f5be84233f77
|
Provenance
The following attestation bundles were made for speechmarkdown_rust-0.1.15-cp313-cp313-macosx_11_0_arm64.whl:
Publisher:
publish.yml on AACTools/speechmarkdown-rust
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
speechmarkdown_rust-0.1.15-cp313-cp313-macosx_11_0_arm64.whl -
Subject digest:
a97ef7b5ee7eb67d7e4b7b52982999f67a641b24e49f916c5392dd6584e8b4a0 - Sigstore transparency entry: 1602252715
- Sigstore integration time:
-
Permalink:
AACTools/speechmarkdown-rust@95c769cab47c33f0e52c20f3eabb0722aef47f43 -
Branch / Tag:
refs/tags/v0.1.15 - Owner: https://github.com/AACTools
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@95c769cab47c33f0e52c20f3eabb0722aef47f43 -
Trigger Event:
push
-
Statement type:
File details
Details for the file speechmarkdown_rust-0.1.15-cp313-cp313-macosx_10_12_x86_64.whl.
File metadata
- Download URL: speechmarkdown_rust-0.1.15-cp313-cp313-macosx_10_12_x86_64.whl
- Upload date:
- Size: 355.2 kB
- Tags: CPython 3.13, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6519141415934773888e2a7ae659ca9aec56fc2138e303406c385bd7ffed8952
|
|
| MD5 |
7bbef9d467d9b50e78920ab181e9d32c
|
|
| BLAKE2b-256 |
50fc6a29da058f11c4959d88d78c1e7e84479bb288af1183ea6021494078d143
|
Provenance
The following attestation bundles were made for speechmarkdown_rust-0.1.15-cp313-cp313-macosx_10_12_x86_64.whl:
Publisher:
publish.yml on AACTools/speechmarkdown-rust
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
speechmarkdown_rust-0.1.15-cp313-cp313-macosx_10_12_x86_64.whl -
Subject digest:
6519141415934773888e2a7ae659ca9aec56fc2138e303406c385bd7ffed8952 - Sigstore transparency entry: 1602252680
- Sigstore integration time:
-
Permalink:
AACTools/speechmarkdown-rust@95c769cab47c33f0e52c20f3eabb0722aef47f43 -
Branch / Tag:
refs/tags/v0.1.15 - Owner: https://github.com/AACTools
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@95c769cab47c33f0e52c20f3eabb0722aef47f43 -
Trigger Event:
push
-
Statement type: