Проект Flite+hts_engine 1.05 дает больше возможностей для дальнейшего улучшения за счет разделения файла приложения и файла голоса, что позволяет производить быструю замену голосовых файлов.
Архив Flite+hts_engine 1.05 https://www.sendspace.com/file/bazy0l
В исходный код внесены некоторые изменения, а также добавлены необходимые файлы из flite. Добавлен проект hts_engine_API для для отладки в vc6.0. Библиотеки и приложение собраны утилитой make с компилятором и линкером vs 2008.
Приложение испытано в XP c голосом hts_voice_cmu_us_arctic_slt-1.05.
Flite+hts_engine 1.05
Сообщений 1 страница 5 из 5
Поделиться12014-08-03 17:02:54
Поделиться22014-08-07 12:56:51
Flite+hts_engine 1.05 может синтезировать речь в реальном времени. Для этого необходимо ... Если спросит кто-нибудь, обязательно напишу.
Поделиться32014-08-07 13:29:28
Если вы соберете Flite+hts_engine 1.02 с hts_engine_api 1.06, то сможете использовать голоса из Festival и RHVoice0.4-a2
Успешно испытаны голоса alan и elena из каталога установки RHVoice0.4-a2. Текст должен быть на английском языке.
Иногда появляется необходимость собрать проект для отладки.
Для этого вам потребуется скопировать Flite+hts_engine в отдельный каталог и внести изменения в проектные файлы и собрать отладочные версии библиотек проекта.
В командную строку компилятора добавляются ключи /Zi /D "WIN32" /D "_DEBUG"
Например, так:
CFLAGS = /I ..\hts_engine_API\include /I ..\include /I ..\flite\include \
/I ..\flite\lang\cmu_us_kal /I ..\flite\lang\cmulex /I ..\flite\lang\usenglish \
/Zi /D "WIN32" /D "_DEBUG" \
/D "FLITE_PLUS_HTS_ENGINE" /D "NO_UNION_INITIALIZATION" \
/O2 /Ob2 /Oi /Ot /Oy /GT /TC /GL
Затем создаете рабочее пространство для проекта vc 6.0 из каталога bin и собираете приложение для отладки.
Скопируйте в bin подкаталог alan из каталога установки RHVoice.
Для того, чтобы в vc 6.0 отладить утилиту, принимающую параметры из командной строки, необходимо закоментировать код обработки аргументов командной строки и дописать код инициализации параметров программы.
Командный файл для синтеза речи с голосом alan:
flite_hts_engine -td alan\tree-dur.inf -tf alan\tree-lf0.inf -tm alan\tree-mgc.inf -md alan\dur.pdf -mf alan\lf0.pdf -mm alan\mgc.pdf -df alan\lf0.win1 -df alan\lf0.win2 -df alan\lf0.win3 -dm alan\mgc.win1 -dm alan\mgc.win2 -dm alan\mgc.win3 -o output.wav input.txt
pause
Первая командная строка не должна содержать символов перевода строк.
input.txt - текстовый файл в кодировке ANSI с вашим текстом.
output.wav - выходной файл, создается программой.
Во время отладки появится проблема с навигацией по файлам исходника. Предлагаю разобраться самостоятельно.
(Решается достаточно просто, путем переименования файла исходника программы и названия проекта.)
Ля ля ля ля ля.......
Поделиться42015-03-18 04:32:05
Сохранение меток в файл для последующего использования в hts_engine.exe
Метки создаются в файле flite+hts_engine-1.02\lib\flite_hts_engine.c функцией void Flite_HTS_Engine_synthesis(Flite_HTS_Engine * f, char *txt, FILE * wavfp).
Для сохранения в файл необходимо создать дескриптор открытого файла FILE * labfp в flite_hts_engine.c и передать в эту функцию.
Ниже приведен код измененной функции. Асемблерная вставка используется для разъименовывания указателей. Мне так понятнее.
/* Flite_HTS_Engine_synthesis: speech synthesis */
void Flite_HTS_Engine_synthesis(Flite_HTS_Engine * f, char *txt, FILE * wavfp, FILE * labfp)
{
int i;
cst_voice *v = NULL;
cst_utterance *u = NULL;
cst_item *s = NULL;
char **label_data = NULL;
int label_size = 0;
char *label_d2=NULL;
char szln[]={0x0a,0};
/* text analysis part */
v = REGISTER_VOX(NULL);
if (v == NULL)
return;
u = flite_synth_text(txt, v);
if (u == NULL)
return;
for (s = relation_head(utt_relation(u, "Segment")); s; s = item_next(s))
label_size++;
if (label_size <= 0)
return;
label_data = (char **) calloc(label_size, sizeof(char *));
for (i = 0, s = relation_head(utt_relation(u, "Segment")); s;
s = item_next(s), i++) {
label_data[i] = (char *) calloc(MAXBUFLEN, sizeof(char));
Flite_HTS_Engine_create_label(f, s, label_data[i]);
}
/* save Labels to file _out.lab */
//fwrite((char*)"hhhh", sizeof(char), 4, labfp); //ok
for (i = 0; i<label_size; i++){
_asm{
mov ecx, dword ptr[label_data]
mov eax, dword ptr [i]
imul eax,4
add ecx, eax
mov eax, [ecx]
mov dword ptr[label_d2],eax
}
fwrite(label_d2, sizeof(char), strlen(label_d2), labfp);
fwrite(szln, sizeof(char), 1, labfp);
}
/* speech synthesis part */
HTS_Engine_load_label_from_string_list(&f->engine, label_data, label_size);
HTS_Engine_create_sstream(&f->engine);
HTS_Engine_create_pstream(&f->engine);
HTS_Engine_create_gstream(&f->engine);
if (wavfp != NULL)
HTS_Engine_save_riff(&f->engine, wavfp);
HTS_Engine_refresh(&f->engine);
for (i = 0; i < label_size; i++)
free(label_data[i]);
free(label_data);
delete_utterance(u);
UNREGISTER_VOX(v);
}
В файл flite_hts_engine добавлены строки:
int main(int argc, char **argv)
{
int i;
FILE *txtfp = stdin, *wavfp = NULL;
FILE *labfp = NULL; /*for labels*/
...
/* read command */
while (--argc) {
...
case 'o':
wavfp = Getfp(*++argv, "wb");
--argc;
break;
case 'z': // <------- new
labfp = Getfp(*++argv, "w"); // <------- new
--argc; // <------- new
break; // <------- new
case 'h':
Usage();
break;
...
/* synthesis */
if (fgets(buff, INPUT_BUFF_SIZE, txtfp) != NULL && strlen(buff) > 0){
Flite_HTS_Engine_synthesis(&engine, buff, wavfp, labfp);
}
...
fclose(labfp); /*labs*/
return 0;
} //end of func
Поделиться52015-03-18 04:33:35
Команда для генерации звука и файла меток:
flite_hts_engine -td alan\tree-dur.inf -tf alan\tree-lf0.inf -tm alan\tree-mgc.inf -md alan\dur.pdf -mf alan\lf0.pdf -mm alan\mgc.pdf -df alan\lf0.win1 -df alan\lf0.win2 -df alan\lf0.win3 -dm alan\mgc.win1 -dm alan\mgc.win2 -dm alan\mgc.win3 -o output.wav -z _out.lab input.txt
pause
Команда вводится без перевода строки, _out.lab- файл меток в формате hts_engine.exe
Таким образом, достигается разделение кода сегментации текста и генерации меток и кода синтеза речи с помощью меток.