| @@ -1,141 +0,0 @@ | |||
| #!/usr/bin/python | |||
| # | |||
| # Copyright (C) 2011 Reece H. Dunn | |||
| # Licence: GPLv3 | |||
| # | |||
| # A script for generating the dictionary Makefile rules from the files in dictsource. | |||
| import sys | |||
| import os | |||
| voices = set() | |||
| dictionaries = {} | |||
| phoneme_data = set() | |||
| mbrola = set() | |||
| # Map voice names to dictionaries when these do not match. | |||
| special_voices = { | |||
| 'bs': 'hbs', | |||
| 'hr': 'hbs', | |||
| 'zh-yue': 'zhy', | |||
| } | |||
| # Support for extended dictionaries. | |||
| extended_dictionaries = { | |||
| 'ru': 'ru_listx', | |||
| 'zh': 'zh_listx', | |||
| 'zhy': 'zhy_list', | |||
| } | |||
| exclude_voices = [] | |||
| def find_voices(path): | |||
| for filename in os.listdir(path): | |||
| voice_path = os.path.join(path, filename) | |||
| if os.path.isdir(voice_path): | |||
| if not filename in ['!v', 'mb']: | |||
| find_voices(voice_path) | |||
| else: | |||
| if filename in special_voices.keys(): | |||
| voices.add(special_voices[filename]) | |||
| elif filename not in exclude_voices: | |||
| voices.add(filename) | |||
| def find_phoneme_data(path): | |||
| for filename in os.listdir(path): | |||
| phondata_path = os.path.join(path, filename) | |||
| if filename.startswith('ph_'): | |||
| phoneme_data.add(phondata_path) | |||
| def find_mbrola_voices(path): | |||
| for filename in os.listdir(path): | |||
| mbrola.add(filename) | |||
| find_voices('espeak-data/voices') | |||
| find_phoneme_data('phsource') | |||
| find_mbrola_voices('phsource/mbrola') | |||
| for filename in os.listdir('dictsource'): | |||
| if filename.endswith('_rules') or filename.endswith('_list') or filename in ['bg_listx', 'it_listx']: | |||
| dic, cat = filename.split('_') | |||
| if dic in voices: | |||
| if not dic in dictionaries.keys(): | |||
| dictionaries[dic] = [] | |||
| dictionaries[dic].append('dictsource/%s' % filename) | |||
| def write_phoneme_data_rules(f): | |||
| f.write('##### phoneme data:\n') | |||
| f.write('\n') | |||
| f.write('espeak-data/phondata: phsource/phonemes.stamp\n') | |||
| f.write('espeak-data/phondata-manifest: phsource/phonemes.stamp\n') | |||
| f.write('espeak-data/phonindex: phsource/phonemes.stamp\n') | |||
| f.write('espeak-data/phontab: phsource/phonemes.stamp\n') | |||
| f.write('espeak-data/intonations: phsource/phonemes.stamp\n') | |||
| f.write('\n') | |||
| f.write('phsource/phonemes.stamp: \\\n') | |||
| for phonfile in sorted(phoneme_data): | |||
| f.write('\t%s \\\n' % phonfile) | |||
| f.write('\tphsource/phonemes \\\n') | |||
| f.write('\tsrc/espeakedit\n') | |||
| f.write('\tESPEAK_DATA_PATH=$(PWD) src/espeakedit --compile && touch $@\n') | |||
| f.write('\n') | |||
| def write_dictionary_make_rules(f): | |||
| f.write('##### dictionaries:\n') | |||
| f.write('\n') | |||
| f.write('dictionaries: \\\n') | |||
| for n, name in enumerate(sorted(dictionaries.keys())): | |||
| if not name in ['bo']: # espeak fails to read these voices | |||
| if n == len(dictionaries.keys()) - 1: | |||
| f.write('\tespeak-data/%s_dict\n' % name) | |||
| else: | |||
| f.write('\tespeak-data/%s_dict \\\n' % name) | |||
| for name, files in sorted(dictionaries.items()): | |||
| f.write('\n') | |||
| f.write('%s: espeak-data/%s_dict\n' % (name, name)) | |||
| f.write('dictsource/%s_extra:\n' % name) | |||
| f.write('\ttouch dictsource/%s_extra\n' % name) | |||
| if name in extended_dictionaries.keys(): | |||
| ext = extended_dictionaries[name] | |||
| f.write('dictsource/%s:\n' % ext) | |||
| f.write('\tln -svf extra/%s dictsource/\n' % ext) | |||
| f.write('if HAVE_%s_EXTENDED_DICTIONARY\n' % name.upper()) | |||
| f.write('espeak-data/%s_dict: src/espeak phsource/phonemes.stamp %s dictsource/%s_extra dictsource/%s\n' % (name, ' '.join(sorted(files)), name, ext)) | |||
| f.write('else\n') | |||
| f.write('espeak-data/%s_dict: src/espeak-ng phsource/phonemes.stamp %s dictsource/%s_extra\n' % (name, ' '.join(sorted(files)), name)) | |||
| if name in extended_dictionaries.keys(): | |||
| f.write('endif\n') | |||
| f.write('\tcd dictsource && ESPEAK_DATA_PATH=$(PWD) LD_LIBRARY_PATH=../src:${LD_LIBRARY_PATH} ../src/espeak-ng --compile=%s && cd ..\n' % name) | |||
| def write_mbrola_make_rules(f): | |||
| f.write('\n##### mbrola:\n') | |||
| f.write('\n') | |||
| f.write('mbrola: \\\n') | |||
| for n, name in enumerate(sorted(mbrola)): | |||
| if n == len(mbrola) - 1: | |||
| f.write('\tespeak-data/mbrola_ph/%s_phtrans\n' % name) | |||
| else: | |||
| f.write('\tespeak-data/mbrola_ph/%s_phtrans \\\n' % name) | |||
| for name in sorted(mbrola): | |||
| f.write('\n') | |||
| f.write('espeak-data/mbrola_ph/%s_phtrans: phsource/mbrola/%s src/espeakedit\n' % (name, name)) | |||
| f.write('\tmkdir -p espeak-data/mbrola_ph\n') | |||
| f.write('\tESPEAK_DATA_PATH=$(PWD) src/espeakedit --compile-mbrola ${PWD}/$<\n') | |||
| try: | |||
| filename = sys.argv[1] | |||
| except: | |||
| filename = None | |||
| if filename: | |||
| with open(filename, 'r') as f: | |||
| prelude = f.read().split('##### phoneme data:\n')[0] | |||
| with open(filename, 'w') as f: | |||
| f.write(prelude) | |||
| write_phoneme_data_rules(f) | |||
| write_dictionary_make_rules(f) | |||
| write_mbrola_make_rules(f) | |||
| else: | |||
| write_phoneme_data_rules(sys.stdout) | |||
| write_dictionary_make_rules(sys.stdout) | |||
| write_mbrola_make_rules(sys.stdout) | |||