Источник:
Flite text-to-speech using Visual C++ 6.0
http://typefaster.sourceforge.net/flite-msvc-howto.html
Построение TTS Flite в Visual C++ 6.0
В этом документе дано описание процесса построения flite 1.2 from Visual C++. (Очевидно, вы не сможете скомпилировать flite 1.2 в Visual C++: "В Visual C++ 6.0 процесс компиляции завершается неудачно при большой базе данных файлов дифона."). На самом деле, использовать Flite в Visual C++ очень легко, для этого необходимо построить flite с помощью MinGW и подключить созданные библиотеки к вашему проекту.
Файлы, которые Вы можете загрузить на этой странице, сгенерированы из версии flite-1.2. Файлы защищены лицензией flite.
Я рекомендую использовать flite, если Вы хотите синтезировать речь из текста. flite требует намного меньше памяти, чем фестиваль, поэтому вы можете использовать много потоков, и они смогут синтезировать речь параллельно. Очевидно, что фестиваль не обеспечивает безопасность потоков.
Нетерпеливым пользователям достаточно загрузить библиотекиs: libflite_cmu_us_kal.a, libflite_usenglish.a, libflite_cmulex.a, libflite.a (правый щелчок мыши, сохранить файл как). Загрузите и распакуйте файл include.zip и посмотрите на пример кода, приведенный ниже. В то же время Вы можете построить библиотеки из исходного кода flite 1.2. Если Вам не важна эффективность кода (прим. переводчика: преимущества SAPI), Вы можете построить и использовать flite.exe (сохраните его на c:\). Он будет работать даже в MinGW.
Построение Flite с помощью MinGW
Я использую MinGW с тех пор как он создает бинарный файл, независимый от Cygwin dll.
+Установите Cygwin и убедитесь в наличие инструмента построения MinGW.
+Запустите установщик в 14Mб или около того и он сделает все сам.
+Отредактируйте /etc/profile в Cygwin путем изменения строки PATH= для запуска чего-либо, например так "/cygdrive/c/MinGW/bin:/usr/local/bin: ...". Это сработает точно так же как ввод в gcc в Cygwin, когда вы используете MinGW gcc. Перезапустите Cygwin.
+Загрузите исходный код flite 1.2 и распакуйте (Как вы знаете, можно напечатать cd c: в Cygwin)
+Run "./configure --disable-sockets", вы можете добавить "--with-vox=cmu_us_kal16". Вы можете подключить сокеты для работы в MinGW, но вам придется подключить #include < winsock.h >, сделать загрузочный блок и тд. За дополнительной информацией обратитесь к руководству Beej по сетевому программированию.
+Отредактируйте config/config и измените MMAPTYPE с posix на win32. Также я удалил -g из CFLAGS, чтобы уменьшить результат работы.
+Запустите make и (в зависимости от количества установленной оперативной памяти) подождите некоторое время. Вероятно, в конце компиляции вы получите сообщение об ошибке относительно функции gettimeofday. Эта функция, кажется, используется для получения временной метки, чтобы определить сколько времени затрачено на выполнение. Если вы хотите собрать flite.exe, то просто закомментируйте строки, содержащие gettimeofday, time_start и time_end, весь параграф if(flite_verbose ... и повторите запуск make. При желании вы можете использовать такие функции как: SYSTEMTIME now и GetSystemTime(&now)
Прим. пер. Вы можете построить библиотеки *.lib в Visual C++ из проектов в каталоге sapi.
Для замены gettimeofday, можно внести следующие изменения в код:
#include <time.h>
int main(int argc, char **argv){
struct tm tv; //struct timeval tv;
//...
_getsystime(&tv); //gettimeofday(&tv,NULL);
time_start = (double)(tv.tm_sec); //+(((double)tv.tv_usec)/1000000.0);
//...
_getsystime(&tv);//gettimeofday(&tv,NULL);
time_end = ((double)(tv.tm_sec)); //+((double)tv.tv_usec/1000000.0);
//...
}
Использование Flite в программах на Visual C++.
В меню Project выберите пункт Settings, перейдите на вкладку С/С++, в выпадающем списке "Category:" выберите пункт Preprocessor, в поле Additional include directories добавьте пути к заголовочным файлам flite (или к каталогу include из архиваinclude.zip). (Прим пер.: Например, там будет стоять что-то похожее "..\include,..\lang\cmulex" без дв. кавычек).
На вкладке Link добавьте путь к каталогу lib c библиотеками flite (или достаточно скопировать загруженные файлы .a-файлы в ту же самую директорию, содержащую файл проекта .dsw). Затем в поле "Object/library modules" добавьте следующую строку:
libflite_cmu_us_kal.a libflite_usenglish.a libflite_cmulex.a libflite.a winmm.lib Укажите .\ перед каждым файлом, если они расположены в каталоге проекта .dsw.
Если загруженные библиотечные файлы скопированы в отдельный подкаталог lib, созданный в каталоге проекта, то добавляемая строка примет вид: lib\libflite_cmu_us_kal.a lib\libflite_usenglish.a lib\libflite_cmulex.a lib\libflite.a winmm.lib
Вы можете заменить libflite_cmu_us_kal.a with libflite_cmu_us_kal16.a на свои файлы (в том числе на файлы *.lib, построенные из исходников каталога sapi). Теперь вы можете использовать код, приведенный ниже:
#include "flite.h"
extern "C"
{
cst_voice* register_cmu_us_kal();
}
cst_voice* voice;
int main(void)
{
flite_init();
voice=register_cmu_us_kal();
flite_text_to_speech("hello world",voice,"play");
return 0;
}
Пожалуйста, дайте мне знать, если обнаружите какие-либо ошибки или возможности для улучшения этого документа. Следует учесть, что этот материал дается без каких-либо гарантий, и у меня нет уверенности, что все это работает правильно.
Мой email адрес: mataav@yahoo.co.uk
Прим. переводчика.
Вместо изменений настроек проекта вы можете прямо в коде примера указать линкеру путь к библиотекам c помощью директивы
препроцессора #pragma comment(lib,"libfile.lib").
Допустим, что после распаковки архива flite 1.2 с исходным кодом он расположен в каталоге
D:\flite-1.2-release\flite-1.2-release, ваш пример - в подкаталоге D:\flite-1.2-release\flite-1.2-release\Test, а загруженные
библиотеки - в каталоге D:\flite-1.2-release\flite-1.2-release\Tes\lib . Вам следует открыть проект flite_sapi.dsw и собрать
4 библиотеки. Каждую библиотеку можно собирать отдельно с помощью файлов проектов cmu_us_kal.dsp и тд.
Все файлы библиотек собираются без ошибок и первые три, кроме flite.lib могут быть выборочно использованы вместо загруженных.
По умолчанию flite.lib собирается без api-функций из winmm.lib, поэтому пример не воспроизводит синтезированный голос.
Поэтому необходимо внести небольшие изменения в проект flite. В дереве решения flite в каталог решения audio к трем
имеющимся ссылкам на файлы добавьте файл au_wince.c из того же каталога на диске. Далее откройте файл native_audio.h и
добавьте в начале строку #define CST_AUDIO_WINCE
Далее в конце файла закоментируйте код
/*
#ifdef CST_AUDIO_NONE
#define AUDIO_OPEN_NATIVE audio_open_none
#define AUDIO_CLOSE_NATIVE audio_close_none
#define AUDIO_SET_SAMPLE_RATE_NATIVE audio_set_sample_rate_none
#define AUDIO_WRITE_NATIVE audio_write_none
#define AUDIO_DRAIN_NATIVE audio_drain_none
#define AUDIO_FLUSH_NATIVE audio_flush_none
#endif
#ifndef AUDIO_OPEN_NATIVE
#define AUDIO_OPEN_NATIVE audio_open_none
#define AUDIO_CLOSE_NATIVE audio_close_none
#define AUDIO_SET_SAMPLE_RATE_NATIVE audio_set_sample_rate_none
#define AUDIO_WRITE_NATIVE audio_write_none
#define AUDIO_DRAIN_NATIVE audio_drain_none
#define AUDIO_FLUSH_NATIVE audio_flush_none
#define CST_AUDIO_NONE
#endif
cst_audiodev *AUDIO_OPEN_NATIVE(int sps, int channels, cst_audiofmt fmt);
int AUDIO_CLOSE_NATIVE(cst_audiodev *ad);
int AUDIO_WRITE_NATIVE(cst_audiodev *ad,void *buff,int num_bytes);
int AUDIO_DRAIN_NATIVE(cst_audiodev *ad);
int AUDIO_FLUSH_NATIVE(cst_audiodev *ad);
*/
Сохраните изменения. После этого flite.lib собирается с функциями для работы со звуком в Windows.
В этом случае, код примера будет следующим:
#include "..\include\flite.h"
#pragma comment(lib,"D:\\flite-1.2-release\\flite-1.2-release\\sapi\\cmu_us_kal\\Debug\\cmu_us_kal.lib")
//#pragma comment(lib,"lib\\libflite_cmu_us_kal.a")
#pragma comment(lib,"D:\\flite-1.2-release\\flite-1.2-release\\sapi\\cmulex\\Debug\\cmulex.lib")
//#pragma comment(lib,"lib\\libflite_cmulex.a")
#pragma comment(lib,"D:\\flite-1.2-release\\flite-1.2-release\\sapi\\usenglish\\Debug\\usenglish.lib");
//#pragma comment(lib,"lib/libflite_usenglish.a")
#pragma comment(lib,"D:\\flite-1.2-release\\flite-1.2-release\\sapi\\flite\\Debug\\flite.lib");
//#pragma comment(lib,"lib\\libflite.a")
extern "C"
{
cst_voice* register_cmu_us_kal();
}
cst_voice* voice;
int main(void)
{
flite_init();
voice=register_cmu_us_kal();
flite_text_to_speech("hello world",voice,"play");
return 0;
}
Если ваш компилятор выдает сообщение о недостатке памяти, используйте ключ /Zm, то отредактируйте файл проекта *.dsp вручную.
Добавьте ключ /Zm1000 в командную строку компилятора, что обеспечит для компилятора память в 750Мб, вместо 75Мб по умолчанию.
Дополнительную информацию см. в MSDN "/Zm (Specify Precompiled Header Memory Allocation Limit)"