Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions src/deepgram/helpers/text_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -239,12 +239,18 @@ def ssml_to_deepgram(ssml_text: str) -> str:
# Parse XML fragments manually to handle mixed content
# Use regex to find and replace SSML elements

# Handle <phoneme> tags
phoneme_pattern = r'<phoneme\s+alphabet=["\']ipa["\']\s+ph=["\'](.*?)["\']\s*>(.*?)</phoneme>'
# Handle <phoneme> tags. Attribute order is not significant in SSML, so match
# the attributes as a group and pull `ph` out of it rather than requiring
# `alphabet` before `ph` (which silently dropped the pronunciation otherwise).
phoneme_pattern = r"<phoneme\s+([^>]*?)\s*>(.*?)</phoneme>"

def replace_phoneme(match):
ipa = match.group(1)
attributes = match.group(1)
word = match.group(2)
ph_match = re.search(r'ph=["\'](.*?)["\']', attributes)
if ph_match is None:
return word
ipa = ph_match.group(1)
return json.dumps({"word": word, "pronounce": ipa}, ensure_ascii=False)

ssml_text = re.sub(phoneme_pattern, replace_phoneme, ssml_text)
Expand Down
12 changes: 10 additions & 2 deletions tests/custom/test_text_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -234,10 +234,18 @@ def test_basic_phoneme(self):
"""Test converting basic phoneme tag"""
ssml = '<phoneme alphabet="ipa" ph="ˌæzəˈθaɪəpriːn">azathioprine</phoneme>'
result = ssml_to_deepgram(ssml)

assert '"word": "azathioprine"' in result
assert '"pronounce": "ˌæzəˈθaɪəpriːn"' in result


def test_phoneme_attribute_order_independent(self):
"""ph before alphabet must work too (SSML attribute order is not significant)"""
ssml = '<phoneme ph="ˌæzəˈθaɪəpriːn" alphabet="ipa">azathioprine</phoneme>'
result = ssml_to_deepgram(ssml)

assert '"word": "azathioprine"' in result
assert '"pronounce": "ˌæzəˈθaɪəpriːn"' in result

def test_basic_break(self):
"""Test converting break tag (milliseconds)"""
ssml = '<break time="500ms"/>'
Expand Down