def export_dictionary(ts_all, lex, dictfn2, prompt_words): logging.info("Exporting dictionary...") utt_dict = {} if prompt_words: for ts in ts_all: tsd = ts_all[ts] tokens = tsd['ts'].split(' ') # logging.info ( '%s %s' % (repr(ts), repr(tokens)) ) for token in tokens: if token in utt_dict: continue if not token in lex: logging.error( "*** ERROR: missing token in dictionary: '%s' (tsd=%s, tokens=%s)" % (token, repr(tsd), repr(tokens))) sys.exit(1) utt_dict[token] = lex.get_multi(token) else: for token in lex: utt_dict[token] = lex.get_multi(token) ps = {} with open(dictfn2, 'w') as dictf: dictf.write('!SIL SIL\n') for token in sorted(utt_dict): for form in utt_dict[token]: ipa = utt_dict[token][form]['ipa'] xsr = ipa2xsampa(token, ipa, spaces=True) xs = (xsr.replace('-', '').replace('\' ', '\'').replace( ' ', ' ').replace('#', 'nC')) dictf.write((u'%s %s\n' % (token, xs)).encode('utf8')) for p in xs.split(' '): if len(p) < 1: logging.error( u"****ERROR: empty phoneme in : '%s' ('%s', ipa: '%s', token: '%s')" % (xs, xsr, ipa, token)) pws = p[1:] if p[0] == '\'' else p if not pws in ps: ps[pws] = {p} else: ps[pws].add(p) logging.info("%s written." % dictfn2) logging.info("Exporting dictionary ... done.") return ps, utt_dict
def test_ipa(self): res = ipa2xsampa("EISENBAHN", u"ˈaɪ̯zən̩ˌbaːn") #print "res: %s" % res self.assertEqual(res, "'aIz@nba:n") res = ipa2xsampa("DIPHTONGTEST", u"aɪɔɪaʊɜ'") #print "res: %s" % res self.assertEqual(res, "aIOIaU3") res = ipa2mary("EISENBAHN", u"ˈaɪ̯zən̩ˌbaːn") #print "res: %s" % res self.assertEqual(res, "'aIz@nba:n") res = ipa2mary("DIPHTONGTEST", u"aɪɔɪaʊɜ'") #print "res: %s" % res self.assertEqual(res, "aIOIaUr='")
def test_ipa(self): res = ipa2xsampa("EISENBAHN", u"ˈaɪ̯zən̩ˌbaːn") #print "res: %s" % res self.assertEqual(res, "'aIz@nba:n") res = ipa2xsampa("DIPHTONGTEST", u"aɪɔɪaʊɜ'") #print "res: %s" % res self.assertEqual(res, "aIOIaU3") res = ipa2xsampa("BON", u"bɔ̃") #print "res: %s" % res self.assertEqual(res, "bO~") res = ipa2xsampa("RESTAURANT", u"ʁɛstɔʁɑ̃") #print "res: %s" % res self.assertEqual(res, "REstORA~") res = ipa2xsampa("VIN", u"vɛ̃") #print "res: %s" % res self.assertEqual(res, "vE~") res = ipa2xsampa("BRUN", u"bʁœ̃") #print "res: %s" % res self.assertEqual(res, "bR9~") res = ipa2xsampa("POIGNANT", u"pwaɲɑ̃") #print "res: %s" % res self.assertEqual(res, "pwaJA~") res = ipa2mary("EISENBAHN", u"ˈaɪ̯zən̩ˌbaːn") #print "res: %s" % res self.assertEqual(res, "'aIz@nba:n") res = ipa2mary("DIPHTONGTEST", u"aɪɔɪaʊɜ'") #print "res: %s" % res self.assertEqual(res, "aIOIaUr='") res = ipa2mary("BON", u"bɔ̃") #print "res: %s" % res self.assertEqual(res, "bO~") res = ipa2mary("RESTAURANT", u"ʁɛstɔʁɑ̃") #print "res: %s" % res self.assertEqual(res, "REstORA~") res = ipa2mary("VIN", u"vɛ̃") #print "res: %s" % res self.assertEqual(res, "vE~") res = ipa2mary("BRUN", u"bʁœ̃") #print "res: %s" % res self.assertEqual(res, "bR9~") res = ipa2mary("POIGNANT", u"pwaɲɑ̃") #print "res: %s" % res self.assertEqual(res, "pwaJA~")
def gen_ipa(self, word): if self._host_tts == 'local': if self.engine == 'mary': self.marytts.voice = self._voice self.marytts.locale = self._locale mp = self.marytts.g2p(word) return mary2ipa(word, mp) elif self.engine == 'espeak': self.espeak.voice = self._voice e_ipa = self.espeak.g2p(word, ipa='2') xs = ipa2xsampa(word, e_ipa) ipa = xsampa2ipa(word, xs) logging.debug(u'espeak g2p: %s -> %s -> %s -> %s' % (word, e_ipa, xs, ipa)) return ipa elif self.engine == 'sequitur': if not self.voice in SEQUITUR_MODELS: raise Exception("no sequitur model for voice '%s'" % self.voice) return sequitur_gen_ipa(SEQUITUR_MODELS[self.voice], word) else: raise Exception("unknown engine '%s'" % self.engine) else: args = { 'l': self._locale, 'v': self._voice, 'e': self._engine, 't': word.encode('utf8') } url = 'http://%s:%s/tts/g2p?%s' % (self._host_tts, self._port_tts, urllib.urlencode(args)) response = requests.get(url) if response.status_code != 200: return None return response.json()['ipa']
def export_audio (train_val, tsdict): global data_dir, utt_num, options destdirfn = '%s/%s' % (data_dir, train_val) for utt_id in tsdict: with codecs.open('%s/%09d.id' % (destdirfn, utt_num[train_val]), 'w', 'utf8') as idf, \ codecs.open('%s/%09d.tkn' % (destdirfn, utt_num[train_val]), 'w', 'utf8') as tknf, \ codecs.open('%s/%09d.wrd' % (destdirfn, utt_num[train_val]), 'w', 'utf8') as wrdf : ts = tsdict[utt_id] tkn = u'' wrd = u'' for token in tokenize(ts['ts'], lang=options.lang): if not (token in lex): logging.error(u'token %s missing from dict!' % token) logging.error(u'utt_id: %s' % utt_id) logging.error(u'ts: %s' % ts['ts']) sys.exit(1) ipas = lex[token]['ipa'] xsr = ipa2xsampa(token, ipas, spaces=True) xs = (xsr.replace('-', '') .replace('\' ', '\'') .replace(' ', ' ') .replace('#', 'nC')) if tkn: tkn += u' | ' wrd += u' ' tkn += xs wrd += token tknf.write('%s\n' % tkn) wrdf.write('%s\n' % wrd) cmd = 'ln -s %s/%s/%s.wav %s/%09d.wav' % (wav16_dir, ts['corpus_name'], utt_id, destdirfn, utt_num[train_val]) logging.debug(cmd) os.system(cmd) # utt2spkf.write('%s %s\n' % (utt_id, ts['spk'])) utt_num[train_val] = utt_num[train_val] + 1
def lex_edit(lex_token): global lex, lang lex_base = lex_token.split('_')[0] if lex_token in lex: lex_entry = lex[lex_token] else: ipas = lex_gen_ipa(lex_base, 'de', 'sequitur', 'de') lex_entry = {'ipa': ipas} lex[lex_token] = lex_entry ipas = lex_entry['ipa'] try: tts.locale = 'de' tts.engine = 'mary' tts.voice = 'dfki-pavoque-neutral-hsmm' tts.say_ipa(ipas, async=True) except: logging.error('EXCEPTION CAUGHT %s' % traceback.format_exc()) lex_gen = {} lex_gen['de-mary'] = lex_gen_ipa(lex_base, 'de', 'mary', 'bits3') lex_gen['de-espeak'] = lex_gen_ipa(lex_base, 'de', 'espeak', 'de') lex_gen['de-sequitur'] = lex_gen_ipa(lex_base, 'de', 'sequitur', 'de') while True: print print u"Token : %s" % lex_token print u"IPA : %s" % lex_entry['ipa'] print for engine in sorted(lex_gen): print u"%-11s : %s" % (engine, lex_gen[engine]) print if lex_token in lex: m = lex.get_multi(lex_token) for k in m: print u"%s [%s]" % (k, m[k]['ipa']) else: print u"NEW TOKEN" print u"SPEAK P:de-unitsel O:de-hsmm I:fr-hsmm U:en-hsmm" print u"GEN G:de-mary H:de-espeak J:de-sequitur K:fr-mary L:en-mary" print u" E:Edit Q:Quit " try: resp = raw_input("Lex> ") # quit if resp.lower() == 'q': break # generate de-mary elif resp.lower() == 'g': lex_entry['ipa'] = lex_gen_ipa(lex_base, 'de', 'mary', 'bits3', True) # generate de-espeak elif resp.lower() == 'h': lex_entry['ipa'] = lex_gen_ipa(lex_base, 'de', 'espeak', 'de', True) # generate en-mary elif resp.lower() == 'l': tts.locale = 'en-US' tts.engine = 'mary' tts.voice = 'cmu-rms-hsmm' ipas = tts.gen_ipa(lex_base) tts.say_ipa(ipas, async=True) lex_entry['ipa'] = ipas # generate fr-mary elif resp.lower() == 'k': tts.locale = 'fr' tts.engine = 'mary' tts.voice = 'upmc-pierre-hsmm' ipas = tts.gen_ipa(lex_base) tts.say_ipa(ipas, async=True) lex_entry['ipa'] = ipas # generate de-sequitur elif resp.lower() == 'j': lex_entry['ipa'] = lex_gen_ipa(lex_base, 'de', 'sequitur', 'de', True) # speak de mary unitsel elif resp.lower() == 'p': if len(lex_entry['ipa']) == 0: continue ipas = lex_entry['ipa'] tts.locale = 'de' tts.engine = 'mary' tts.voice = 'bits3' tts.say_ipa(ipas, async=True) # speak de mary hsmm elif resp.lower() == 'o': if len(lex_entry['ipa']) == 0: continue ipas = lex_entry['ipa'] tts.locale = 'de' tts.engine = 'mary' tts.voice = 'dfki-pavoque-neutral-hsmm' tts.say_ipa(ipas, async=True) # speak fr mary hsmm elif resp.lower() == 'i': if len(lex_entry['ipa']) == 0: continue ipas = lex_entry['ipa'] tts.locale = 'fr' tts.engine = 'mary' tts.voice = 'upmc-pierre-hsmm' tts.say_ipa(ipas, async=True) # speak en mary hsmm elif resp.lower() == 'u': ipas = lex_entry['ipa'] tts.locale = 'en-US' tts.engine = 'mary' tts.voice = 'cmu-rms-hsmm' tts.say_ipa(ipas, async=True) # edit XS elif resp.lower() == 'e': ipas = lex_entry['ipa'] xs = ipa2xsampa(lex_token, ipas, stress_to_vowels=False) readline.add_history(xs) xs = raw_input(xs + '> ') ipas = xsampa2ipa(lex_token, xs) lex_entry['ipa'] = ipas except: logging.error('EXCEPTION CAUGHT %s' % traceback.format_exc()) lex.save() print "new lexicon saved." print
with codecs.open('%s/train.lex' % WORKDIR, 'w', 'utf8') as trainf, \ codecs.open('%s/test.lex' % WORKDIR, 'w', 'utf8') as testf, \ codecs.open('%s/all.lex' % WORKDIR, 'w', 'utf8') as allf : cnt = 0 for token in lex: if not token in wiktionary: # print u"Missing in wiktionary: %s" % token num_missing += 1 else: num_found += 1 source_ipa = wiktionary[token][1] target_ipa = lex[token]['ipa'].replace(u'-', u'') target_xs = ipa2xsampa (token, target_ipa, spaces=True, stress_to_vowels=False) if cnt % 10 == 0: testf.write (u'%s %s\n' % (source_ipa, target_xs)) else: trainf.write (u'%s %s\n' % (source_ipa, target_xs)) allf.write (u'%s %s\n' % (source_ipa, target_xs)) cnt += 1 logging.info('sequitur workdir %s done. %d entries.' % (WORKDIR, cnt))
lex = Lexicon(file_name=dict_name) logging.info("loading lexicon...done.") # # export # misc.mkdirs(workdir) with codecs.open('%s/train.lex' % workdir, 'w', 'utf8') as trainf, \ codecs.open('%s/test.lex' % workdir, 'w', 'utf8') as testf, \ codecs.open('%s/all.lex' % workdir, 'w', 'utf8') as allf : cnt = 0 for word in lex: ipa = lex[word]['ipa'] xs = ipa2xsampa(word, ipa, spaces=True, stress_to_vowels=False) if cnt % 10 == 0: testf.write(u'%s %s\n' % (word, xs)) else: trainf.write(u'%s %s\n' % (word, xs)) allf.write(u'%s %s\n' % (word, xs)) cnt += 1 logging.info('sequitur workdir %s done.' % workdir)
def export_sphinx_case(work_dir, sphinxtrain_cfg_fn): # # language model # misc.mkdirs('%s' % work_dir) fn = '%s/prompts.sent' % work_dir with codecs.open(fn, 'w', 'utf8') as outf: for cfn in ts_all: transcript = transcripts[cfn]['ts'] outf.write('%s\n' % transcript) logging.info("%s written." % fn) fn = '%s/wlist.txt' % work_dir with codecs.open(fn, 'w', 'utf8') as outf: for word in lex: if ENABLE_NOISE_FILLER: if word == NOISE_WORD: logging.debug('skipping noise word') continue outf.write('%s\n' % word) logging.info("%s written." % fn) # # create work_dir structure # mfcc_dir = "%s/mfcc" % work_dir misc.mkdirs('%s/logs' % work_dir) misc.mkdirs('%s/etc' % work_dir) misc.mkdirs('%s' % mfcc_dir) # generate sphinx_train.cfg, featdir in there # inf = codecs.open ('data/src/speech/sphinx_train.cfg', 'r', 'utf8') # outf = codecs.open ('%s/etc/sphinx_train.cfg' % work_dir, 'w', 'utf8') # for line in inf: # s = line.replace('%FEATDIR%', mfcc_dir).replace('%WORKDIR%', work_dir) # outf.write (s) # inf.close() # outf.close() misc.copy_file(sphinxtrain_cfg_fn, '%s/etc/sphinx_train.cfg' % work_dir) if ENABLE_NOISE_FILLER: misc.copy_file('data/src/speech/sphinx-voxforge-noise.filler', '%s/etc/voxforge.filler' % work_dir) else: misc.copy_file('data/src/speech/sphinx-voxforge.filler', '%s/etc/voxforge.filler' % work_dir) misc.copy_file('data/src/speech/sphinx-feat.params', '%s/etc/feat.params' % work_dir) # # prompts # train_fifn = '%s/etc/voxforge_train.fileids' % work_dir train_tsfn = '%s/etc/voxforge_train.transcription' % work_dir test_fifn = '%s/etc/voxforge_test.fileids' % work_dir test_tsfn = '%s/etc/voxforge_test.transcription' % work_dir runfeatfn = '%s/run-feat.sh' % work_dir lex_covered = set() SPHINXFE = "sphinx_fe -i '%s' -part 1 -npart 1 -ei wav -o '%s' -eo mfc -nist no -raw no -mswav yes -samprate 16000 -lowerf 130 -upperf 6800 -nfilt 25 -transform dct -lifter 22 >>logs/mfcc%02d.log 2>&1 &\n" with codecs.open(runfeatfn, 'w', 'utf8') as runfeatf: runfeatf.write('#!/bin/bash\n\n') cnt = 0 for cfn in ts_all: w16filename = "%s/%s/%s.wav" % (wav16_dir, cfn2corpus[cfn], cfn) mfcfilename = "mfcc/%s.mfc" % cfn runfeatf.write(SPHINXFE % (w16filename, mfcfilename, cnt)) cnt = (cnt + 1) % NJOBS if cnt == 0: runfeatf.write('wait\n') logging.info("%s written." % runfeatfn) with codecs.open (train_fifn, 'w', 'utf8') as train_fif, \ codecs.open (train_tsfn, 'w', 'utf8') as train_tsf, \ codecs.open (test_fifn, 'w', 'utf8') as test_fif, \ codecs.open (test_tsfn, 'w', 'utf8') as test_tsf: for cfn in ts_train: train_fif.write('%s\n' % cfn) tokens = tokenize(ts_train[cfn]['ts'], lang=options.lang, keep_punctuation=False) ts = u' '.join(tokens) train_tsf.write(u'<s> %s </s> (%s)\n' % (ts, cfn)) for token in tokens: if not token in lex: logging.error('word %s not covered by dict!') sys.exit(1) lex_covered.add(token) for cfn in ts_test: test_fif.write('%s\n' % cfn) tokens = tokenize(ts_test[cfn]['ts'], lang=options.lang, keep_punctuation=False) ts = u' '.join(tokens) test_tsf.write(u'<s> %s </s> (%s)\n' % (ts, cfn)) for token in tokens: if not token in lex: logging.error('word %s not covered by dict!') sys.exit(1) lex_covered.add(token) logging.info("%s written." % train_tsfn) logging.info("%s written." % train_fifn) logging.info("%s written." % test_tsfn) logging.info("%s written." % test_fifn) # generate dict phoneset = set() pdfn = '%s/etc/voxforge.dic' % work_dir with codecs.open(pdfn, 'w', 'utf8') as pdf: for word in lex: if ENABLE_NOISE_FILLER: if word == NOISE_WORD: logging.debug('skipping noise word') continue if not word in lex_covered: logging.debug( 'skipping word %s as it is not covered by transcripts' % word) continue ipa = lex[word]['ipa'] xs = ipa2xsampa(word, ipa) xa = xsampa2xarpabet(word, xs) pdf.write(u'%s %s\n' % (word, xa)) phones = xa.split(' ') for phone in phones: if len(phone.strip()) == 0: logging.error( u"***ERROR: empty phone detected in lex entry %s %s" % (word, ipa)) phoneset.add(phone) logging.info("%s written." % pdfn) logging.info("Got %d phones." % len(phoneset)) phfn = '%s/etc/voxforge.phone' % work_dir with codecs.open(phfn, 'w', 'utf8') as phf: for phone in phoneset: phf.write(u'%s\n' % phone) phf.write(u'SIL\n') if ENABLE_NOISE_FILLER: phf.write(u'NSPC\n') logging.info("%s written." % phfn) misc.render_template('data/src/speech/sphinx-run.sh.template', '%s/sphinx-run.sh' % work_dir, lm_name=lm_name)
misc.mkdirs('%s/local/dict.adapt' % data_dir) dictfn2 = '%s/local/dict.adapt/lexicon.txt' % data_dir logging.info ( "Exporting dictionary..." ) ps = {} with open (dictfn2, 'w') as dictf: dictf.write('!SIL SIL\n') for token in sorted(lex): ipa = lex[token]['ipa'] xsr = ipa2xsampa (token, ipa, spaces=True) xs = xsr.replace('-','').replace('\' ', '\'').replace(' ', ' ').replace('#', 'nC') dictf.write((u'%s %s\n' % (token, xs)).encode('utf8')) for p in xs.split(' '): if len(p)<1: logging.error ( u"****ERROR: empty phoneme in : '%s' ('%s', ipa: '%s', token: '%s')" % (xs, xsr, ipa, token) ) pws = p[1:] if p[0] == '\'' else p if not pws in ps: ps[pws] = set([p]) else:
def lex_edit(token): global lex, lex_token, lex_entry, lex_base lex_set_token (token) while True: try: lex_paint_main() c = stdscr.getch() if c == ord('q'): lex.save() break # generate de-mary elif c == ord('g'): tts.locale = 'de' tts.engine = 'mary' tts.voice = 'bits3' ipas = tts.gen_ipa (lex_base) tts.say_ipa(ipas) lex_entry['ipa'] = ipas # generate de-espeak elif c == ord('h'): tts.locale ='de' tts.engine ='espeak' tts.voice ='de' ipas = tts.gen_ipa (lex_base) lex_entry['ipa'] = ipas tts.locale ='de' tts.engine ='mary' tts.voice ='bits3' tts.say_ipa(ipas) # generate en-mary elif c == ord('l'): tts.locale ='en-US' tts.engine ='mary' tts.voice ='cmu-rms-hsmm' ipas = tts.gen_ipa (lex_base) tts.say_ipa(ipas) lex_entry['ipa'] = ipas # generate fr-mary elif c == ord('k'): tts.locale ='fr' tts.engine ='mary' tts.voice ='upmc-pierre-hsmm' ipas = tts.gen_ipa (lex_base) tts.say_ipa(ipas) lex_entry['ipa'] = ipas # generate de-sequitur elif c == ord('j'): ipas = sequitur_gen_ipa (SEQUITUR_MODEL, lex_base) tts.locale ='de' tts.engine ='mary' tts.voice ='bits3' tts.say_ipa(ipas) lex_entry['ipa'] = ipas # speak de mary unitsel elif c == ord('p'): if len(lex_entry['ipa']) == 0: continue ipas = lex_entry['ipa'] tts.locale = 'de' tts.engine = 'mary' tts.voice = 'bits3' tts.say_ipa(ipas) # speak de mary hsmm elif c == ord('o'): if len(lex_entry['ipa']) == 0: continue ipas = lex_entry['ipa'] tts.locale = 'de' tts.engine = 'mary' tts.voice = 'dfki-pavoque-neutral-hsmm' tts.say_ipa(ipas) # speak fr mary hsmm elif c == ord('i'): if len(lex_entry['ipa']) == 0: continue ipas = lex_entry['ipa'] tts.locale = 'fr' tts.engine = 'mary' tts.voice = 'pierre-voice-hsmm' tts.say_ipa(ipas) # speak en mary hsmm elif c == ord('u'): ipas = lex_entry['ipa'] tts.locale = 'en-US' tts.engine = 'mary' tts.voice = 'cmu-rms-hsmm' tts.say_ipa(ipas) # edit token elif c == ord('t'): token = misc.edit_popup(stdscr, ' Token ', '') lex_set_token (token) # edit XS elif c == ord('e'): ipas = lex_entry['ipa'] xs = ipa2xsampa (lex_token, ipas, stress_to_vowels=False) xs = misc.edit_popup(stdscr, ' X-SAMPA ', xs) ipas = xsampa2ipa (lex_token, xs) lex_entry['ipa'] = ipas except: logging.error('EXCEPTION CAUGHT %s' % traceback.format_exc())
def lex_edit(token): global lex, lex_token, lex_entry, lex_base lex_set_token(token) while True: try: lex_paint_main() c = raw_input('lex > ').lower() if c == 'q': lex.save() break # generate de-mary elif c == 'g': tts.locale = 'de' tts.engine = 'mary' tts.voice = 'bits3' ipas = tts.gen_ipa(lex_base) tts.say_ipa(ipas) lex_entry['ipa'] = ipas # generate de-espeak elif c == 'h': tts.locale = 'de' tts.engine = 'espeak' tts.voice = 'de' ipas = tts.gen_ipa(lex_base) lex_entry['ipa'] = ipas tts.locale = 'de' tts.engine = 'mary' tts.voice = 'bits3' tts.say_ipa(ipas) # generate en-mary elif c == 'l': tts.locale = 'en-US' tts.engine = 'mary' tts.voice = 'cmu-rms-hsmm' ipas = tts.gen_ipa(lex_base) tts.say_ipa(ipas) lex_entry['ipa'] = ipas # generate fr-mary elif c == 'k': tts.locale = 'fr' tts.engine = 'mary' tts.voice = 'upmc-pierre-hsmm' ipas = tts.gen_ipa(lex_base) tts.say_ipa(ipas) lex_entry['ipa'] = ipas # generate de-sequitur elif c == 'j': ipas = sequitur_gen_ipa(SEQUITUR_MODEL, lex_base) tts.locale = 'de' tts.engine = 'mary' tts.voice = 'bits3' tts.say_ipa(ipas) lex_entry['ipa'] = ipas # speak de mary unitsel elif c == 'p': if len(lex_entry['ipa']) == 0: continue ipas = lex_entry['ipa'] tts.locale = 'de' tts.engine = 'mary' tts.voice = 'bits3' tts.say_ipa(ipas) # speak de mary hsmm elif c == 'o': if len(lex_entry['ipa']) == 0: continue ipas = lex_entry['ipa'] tts.locale = 'de' tts.engine = 'mary' tts.voice = 'dfki-pavoque-neutral-hsmm' tts.say_ipa(ipas) # speak fr mary hsmm elif c == 'i': if len(lex_entry['ipa']) == 0: continue ipas = lex_entry['ipa'] tts.locale = 'fr' tts.engine = 'mary' tts.voice = 'pierre-voice-hsmm' tts.say_ipa(ipas) # speak en mary hsmm elif c == 'u': ipas = lex_entry['ipa'] tts.locale = 'en-US' tts.engine = 'mary' tts.voice = 'cmu-rms-hsmm' tts.say_ipa(ipas) # edit token elif c == 't': readline.add_history(lex_token.encode('utf8')) token = raw_input('token: ').decode('utf8') lex_set_token(token) # edit XS elif c == 'e': ipas = lex_entry['ipa'] xs = ipa2xsampa(lex_token, ipas, stress_to_vowels=False) readline.add_history(xs.encode('utf8')) xs = raw_input('X-SAMPA: ').decode('utf8') ipas = xsampa2ipa(lex_token, xs) lex_entry['ipa'] = ipas except: logging.error('EXCEPTION CAUGHT %s' % traceback.format_exc())
def export_audio(train_val, tsdict): global data_dir, utt_num, options, cnt destdirfn = data_dir lcnt = 0 for utt_id in tsdict: ts = tsdict[utt_id] tokens = tokenize(ts['ts'], lang=options.lang) covered_by_lex = True for token in tokens: if not (token in lex): logging.error(u'token %s missing from dict!' % token) logging.error(u'utt_id: %s' % utt_id) logging.error(u'ts: %s' % ts['ts']) covered_by_lex = False break if not covered_by_lex: continue print("about to export") with codecs.open('%s/%09d.id' % (destdirfn, utt_num[train_val]), 'w', 'utf8') as idf, \ codecs.open('%s/%09d.tkn' % (destdirfn, utt_num[train_val]), 'w', 'utf8') as tknf, \ codecs.open('%s/%09d.wrd' % (destdirfn, utt_num[train_val]), 'w', 'utf8') as wrdf : print("utterance read. " + str(wrdf) + "\n") tkn = u'' wrd = u'' for token in tokens: ipas = lex[token]['ipa'] xsr = ipa2xsampa(token, ipas, spaces=True) xs = (xsr.replace('-', '').replace('\' ', '\'').replace( ' ', ' ').replace('#', 'nC')) if tkn: tkn += u' | ' wrd += u' ' tkn += xs wrd += token tknf.write('%s\n' % tkn) wrdf.write('%s\n' % wrd) idf.write('utt_id\t%s\ncorpus\t%s\nlang\t%s\n' % (utt_id, ts['corpus_name'], options.lang)) os.symlink('%s/%s/%s.wav' % (work_dir, ts['corpus_name'], utt_id), '%s/%09d.wav' % (destdirfn, utt_num[train_val])) # cmd = 'ln -s %s/%s/%s.wav %s/%09d.wav' % (wav16_dir, ts['corpus_name'], utt_id, destdirfn, utt_num[train_val]) # logging.debug(cmd) # os.system(cmd) # utt2spkf.write('%s %s\n' % (utt_id, ts['spk'])) utt_num[train_val] = utt_num[train_val] + 1 cnt += 1 lcnt += 1 if cnt % 1000 == 0: logging.info( '%6d audio files linked from %s [%s] (%6d/%6d)...' % (cnt, ts['corpus_name'], train_val, lcnt, len(tsdict)))
tts.say_ipa(ipas, async=True) # edit token elif c == ord('t'): token = misc.edit_popup(stdscr, ' Token ', '') lex_set_token(token) # edit XS elif c == ord('e'): ipas = lex_entry['ipa'] xs = ipa2xsampa(lex_token, ipas, stress_to_vowels=False) xs = misc.edit_popup(stdscr, ' X-SAMPA ', xs) try: ipas = xsampa2ipa(lex_token, xs) lex_entry['ipa'] = ipas except: pass # # fini #
def synthesize(self, txt, mode='txt'): if self._host_tts == 'local': # import pdb; pdb.set_trace() wav = None if self.engine == 'mary': self.marytts.voice = self._voice self.marytts.locale = self._locale if mode == 'txt': wav = self.marytts.synth_wav(txt) elif mode == 'ipa': xs = ipa2mary('ipa', txt) wav = self.marytts.synth_wav(xs, fmt='xs') else: raise Exception("unknown mary mode '%s'" % mode) elif self.engine == 'espeak': if mode == 'txt': self.espeak.voice = self._voice self.espeak.speed = self._speed self.espeak.pitch = self._pitch wav = self.espeak.synth_wav(txt) # logging.debug ('synthesize: %s %s -> %s' % (txt, mode, repr(wav))) elif mode == 'ipa': xs = ipa2xsampa('ipa', txt) logging.debug('synthesize: %s %s -> %s' % (txt, mode, repr(xs))) wav = self.espeak.synth_wav(xs, fmt='xs') elif self.engine == 'pico': if mode == 'txt': self.picotts.voice = self._voice wav = self.picotts.synth_wav(txt) # logging.debug ('synthesize: %s %s -> %s' % (txt, mode, repr(wav))) else: raise Exception("unknown espeak mode '%s'" % mode) else: raise Exception("unknown engine '%s'" % self.engine) else: args = { 'l': self._locale, 'v': self._voice, 'e': self._engine, 'm': mode, 't': txt.encode('utf8') } url = 'http://%s:%s/tts/synth?%s' % ( self._host_tts, self._port_tts, urllib.urlencode(args)) response = requests.get(url) if response.status_code != 200: return None wav = response.content if wav: logging.debug('synthesize: %s %s -> WAV' % (txt, mode)) else: logging.error('synthesize: %s %s -> NO WAV' % (txt, mode)) return wav