Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python: How to prepend the string 'ub' to every pronounced vowel in a string?

Example: Speak -> Spubeak, more info here

Don't give me a solution, but point me in the right direction or tell which which python library I could use? I am thinking of regex since I have to find a vowel, but then which method could I use to insert 'ub' in front of a vowel?

like image 805
Sahat Yalkabov Avatar asked Feb 29 '12 19:02

Sahat Yalkabov


2 Answers

It is more complex then just a simple regex e.g.,

"Hi, how are you?" → "Hubi, hubow ubare yubou?"

Simple regex won't catch that e is not pronounced in are.

You need a library that provides a pronunciation dictionary such as nltk.corpus.cmudict:

from nltk.corpus import cmudict # $ pip install nltk
# $ python -c "import nltk; nltk.download('cmudict')"

def spubeak(word, pronunciations=cmudict.dict()):
    istitle = word.istitle() # remember, to preserve titlecase
    w = word.lower() #note: ignore Unicode case-folding
    for syllables in pronunciations.get(w, []):
        parts = []
        for syl in syllables:
            if syl[:1] == syl[1:2]:
                syl = syl[1:] # remove duplicate
            isvowel = syl[-1].isdigit()
            # pronounce the word
            parts.append('ub'+syl[:-1] if isvowel else syl)
        result = ''.join(map(str.lower, parts))
        return result.title() if istitle else result
    return word # word not found in the dictionary

Example:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import re

sent = "Hi, how are you?"
subent = " ".join(["".join(map(spubeak, re.split("(\W+)", nonblank)))
                   for nonblank in sent.split()])
print('"{}" → "{}"'.format(sent, subent))

Output

"Hi, how are you?" → "Hubay, hubaw ubar yubuw?"

Note: It is different from the first example: each word is replaced with its syllables.

like image 63
jfs Avatar answered Sep 27 '22 17:09

jfs


You can use regular expressions for substitutions. See re.sub.

Example:

>>> import re
>>> re.sub(r'(e)', r'ub\1', 'speak')
'spubeak'

You will need to read the documentation for regex groups and so on. You will also need to figure out how to match different vowels instead of just the one in the example.

For some great ideas (and code) for using regular expressions in Python for a pronunciation dictionary, take a look at this link, which is one of the design pages for the Cainteoir project: http://rhdunn.github.com/cainteoir/rules.html

Cainteoir's text-to-speech rule engine design (which is not fully implemented yet) uses regular expressions. See also Pronunciation Dictionaries and Regexes, another article by the Cainteoir author.

like image 38
Steven T. Snyder Avatar answered Sep 27 '22 18:09

Steven T. Snyder