Package: voxpopuli
VoxpopuliA wrapper around Espeak and Mbrola.This is a lightweight Python wrapper for Espeak and Mbrola, two co-dependent TTS tools. It enables you to
render sound by simply feeding it text and voice parameters. Phonemes (the data transmitted by Espeak to
mbrola) can also be manipulated using a mimalistic API.This is a short introduction, but you might want to look at thereadthedoc documentation.InstallThese instructions should work on any Debian/Ubuntu-derivativeInstall with pip as:pipinstallvoxpopuliYou have to have espeak and mbrola installed beforehand:sudoaptinstallmbrolaespeakYou'll also need some mbrola voices installed, which you can either get on their project page,
and then uppack in/usr/share/mbrola/<lang><voiceid>/or more simply by
installing them from the ubuntu repo's. All the voices' packages are of the formmbrola-<lang><voiceid>. You can even more simply install all the voices available
by running:sudoaptinstallmbrola-*In case the voices you need aren't all in the ubuntu repo's, you can use this convenient little script
that install voices directly fromMbrola's voice repo:# this installs all british english and french voices for instancesudopython3-mvoxpopuli.voice_installenfrUsagePicking a voice and making it say thingsThe most simple usage of this lib is just bare TTS, using a voice and
a text. The rendered audio is returned in a .wav bytes object:fromvoxpopuliimportVoicevoice=Voice(lang="fr")wav=voice.to_audio("salut c'est cool")Evaluatingtype(wav)whould returnbytes. You can then save the wav using thewbfile optionwithopen("salut.wav","wb")aswavfile:wavfile.write(wav)If you wish to hear how it sounds right away, you'll have to make sure you installed pyaudioviapip, and then do:voice.say("Salut c'est cool")Ou can also, say, use scipy to get the pcm audio as andarray:importscipy.io.wavfileimportread,writefromioimportBytesIOrate,wave_array=read(BytesIO(wav))reversed=wave_array[::-1]# reversing the sound filewrite("tulas.wav",rate,reversed)Getting different voicesYou can set some parameters you can set on the voice, such as language or pitchfromvoxpopuliimportVoice# really slow fice with high pitchvoice=Voice(lang="us",pitch=99,speed=40,voice_id=2)voice.say("I'm high on helium")The exhaustive list of parameters is:lang, a language code among those available (us, fr, en, es, ...) You can list
them using thelistvoicesmethod from aVoiceinstance.voice_id, an integer, used to select the voice id for a language. If not specified,
the first voice id found for a given language is used.pitch, an integer between 0 and 99 (included)speed, an integer, in the words per minute. Default and regular speed
is 160 wpm.volume, float ratio applied to the output sample. Some languages have presets
that our best specialists tested. Otherwise, defaults to 1.Handling the phonemic formTo render a string of text to audio, the Voice object actually chains espeak's output
to mbrola, who then renders it to audio. Espeak only renders the text to a list of
phonemes (such as the one in the IPA), who then are to be processed by mbrola.
For those who like pictures, here is a diagram of what happens when you runvoice.to_audio("Hello world")phonemes are represented sequentially by a code, a duration in milliseconds, and
a list of pitch modifiers. The pitch modifiers are a list of couples, each couple
representing the percentage of the sample at which to apply the pitch modification and
the pitch.Funny thing is, with voxpopuli, you can "intercept" that phoneme list as a
simple object, modify it, and then pass it back to the voice to render it to
audio. For instance, let's make a simple alteration that'll double the
duration for each vowels in an english text.fromvoxpopuliimportVoice,BritishEnglishPhonemesvoice=Voice(lang="en")# here's how you get the phonemes listphoneme_list=voice.to_phonemes("Now go away or I will taunt you a second time.")forphonemeinphoneme_list:#phoneme list object inherits from the list objectifphoneme.nameinBritishEnglishPhonemes.VOWELS:phoneme.duration*=3# rendering and saving the sound, then saying it out loud:voice.to_audio(phoneme_list,"modified.wav")voice.say(phoneme_list)Notes:For French, Spanish, German and Italian, the phoneme codes
used by espeak and mbrola are available as class attributes similar to theBritishEnglishPhonemesclass as above.More info on the phonemes can be found here:SAMPA pageWhat's left to doMoar unit testsMaybe some examples