diff --git a/CMakeLists.txt b/CMakeLists.txt index b3ac06eb2c..c5fec3691d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,19 +6,26 @@ project(espeak-ng HOMEPAGE_URL "https://github.com/espeak-ng/espeak-ng" ) +option(BUILD_ESPEAK_NG_EXE "Whether to build espeak-ng-bin" ON) +option(BUILD_ESPEAK_NG_TESTS "Whether to build tests" ON) + include(CTest) include(cmake/deps.cmake) include(cmake/config.cmake) add_subdirectory(src) -include(cmake/data.cmake) +if(BUILD_ESPEAK_NG_EXE) + include(cmake/data.cmake) +endif() include(cmake/docs.cmake) include(cmake/package.cmake) include(CPack) -include(CTest) -add_subdirectory(tests) +if(BUILD_ESPEAK_NG_TESTS) + include(CTest) + add_subdirectory(tests) +endif() option(BUILD_SHARED_LIBS "Build shared libraries" OFF) @@ -33,4 +40,4 @@ message(STATUS " async: ${USE_ASYNC}") install( DIRECTORY vim/ftdetect vim/syntax DESTINATION share/vim/vimfiles -) \ No newline at end of file +) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 03b4a7d9fa..7d24ffb2f4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -2,35 +2,38 @@ add_library(espeak-include INTERFACE) target_include_directories(espeak-include INTERFACE include include/compat) add_subdirectory(ucd-tools) -add_subdirectory(speechPlayer) +if(USE_SPEECHPLAYER) + add_subdirectory(speechPlayer) +endif() add_subdirectory(libespeak-ng) -add_executable(espeak-ng-bin espeak-ng.c) -set_target_properties(espeak-ng-bin PROPERTIES OUTPUT_NAME espeak-ng) -target_link_libraries( - espeak-ng-bin PRIVATE espeak-ng espeak-ng-config -) -if (MINGW) - target_link_options(espeak-ng-bin PRIVATE "-static-libstdc++" "-static") -endif() -if (MSVC) - target_sources(espeak-ng-bin PRIVATE compat/getopt.c) -endif() -if (NOT WIN32) - add_custom_target( - speak-ng ALL - COMMAND ${CMAKE_COMMAND} -E create_symlink espeak-ng ${CMAKE_CURRENT_BINARY_DIR}/speak-ng - COMMAND ${CMAKE_COMMAND} -E create_symlink espeak-ng ${CMAKE_CURRENT_BINARY_DIR}/espeak - COMMAND ${CMAKE_COMMAND} -E create_symlink espeak-ng ${CMAKE_CURRENT_BINARY_DIR}/speak - COMMENT "Link espeak-ng to compat names" - DEPENDS espeak-ng-bin +if(BUILD_ESPEAK_NG_EXE) + add_executable(espeak-ng-bin espeak-ng.c) + target_link_libraries( + espeak-ng-bin PRIVATE espeak-ng espeak-ng-config ) -endif() -install(TARGETS espeak-ng-bin) -install(DIRECTORY include/espeak include/espeak-ng TYPE INCLUDE) + if (MINGW) + target_link_options(espeak-ng-bin PRIVATE "-static-libstdc++" "-static") + endif() + if (MSVC) + target_sources(espeak-ng-bin PRIVATE compat/getopt.c) + endif() + if (NOT WIN32) + add_custom_target( + speak-ng ALL + COMMAND ${CMAKE_COMMAND} -E create_symlink espeak-ng ${CMAKE_CURRENT_BINARY_DIR}/speak-ng + COMMAND ${CMAKE_COMMAND} -E create_symlink espeak-ng ${CMAKE_CURRENT_BINARY_DIR}/espeak + COMMAND ${CMAKE_COMMAND} -E create_symlink espeak-ng ${CMAKE_CURRENT_BINARY_DIR}/speak + COMMENT "Link espeak-ng to compat names" + DEPENDS espeak-ng-bin + ) + endif() + install(TARGETS espeak-ng-bin) + install(DIRECTORY include/espeak include/espeak-ng TYPE INCLUDE) -if (ESPEAK_COMPAT AND NOT WIN32) - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/speak-ng DESTINATION bin) - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/espeak DESTINATION bin) - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/speak DESTINATION bin) -endif() \ No newline at end of file + if (ESPEAK_COMPAT AND NOT WIN32) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/speak-ng DESTINATION bin) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/espeak DESTINATION bin) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/speak DESTINATION bin) + endif() +endif() diff --git a/src/include/compat/endian.h b/src/include/compat/endian.h index c0e988e2f1..bef26509c2 100644 --- a/src/include/compat/endian.h +++ b/src/include/compat/endian.h @@ -20,7 +20,7 @@ #define ENDIAN_H_COMPAT_SHIM #pragma once -#if __has_include_next() +#if __has_include_next() && !defined(__APPLE__) # pragma GCC system_header // Silence "warning: #include_next is a GCC extension" # include_next #elif __has_include() diff --git a/src/include/compat/wctype.h b/src/include/compat/wctype.h index e0d2c64ee3..4cdc9d920e 100644 --- a/src/include/compat/wctype.h +++ b/src/include/compat/wctype.h @@ -44,7 +44,7 @@ #define iswspace ucd_isspace #define iswupper ucd_isupper #define iswxdigit ucd_isxdigit -#define tolower ucd_tolower -#define toupper udc_toupper +// #define tolower ucd_tolower +// #define toupper udc_toupper #endif diff --git a/src/include/espeak/speak_lib.h b/src/include/espeak/speak_lib.h deleted file mode 120000 index aef4ce539b..0000000000 --- a/src/include/espeak/speak_lib.h +++ /dev/null @@ -1 +0,0 @@ -../espeak-ng/speak_lib.h \ No newline at end of file diff --git a/src/include/espeak/speak_lib.h b/src/include/espeak/speak_lib.h new file mode 100644 index 0000000000..c15d140965 --- /dev/null +++ b/src/include/espeak/speak_lib.h @@ -0,0 +1,715 @@ +#ifndef SPEAK_LIB_H +#define SPEAK_LIB_H +/*************************************************************************** + * Copyright (C) 2005 to 2012 by Jonathan Duddington * + * email: jonsd@users.sourceforge.net * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, see: * + * . * + ***************************************************************************/ + + +/*************************************************************/ +/* This is the header file for the library version of espeak */ +/* */ +/*************************************************************/ + +#include +#include + +#if defined(_WIN32) || defined(_WIN64) +#ifdef LIBESPEAK_NG_EXPORT +#define ESPEAK_API __declspec(dllexport) +#else +#define ESPEAK_API __declspec(dllimport) +#endif +#else +#define ESPEAK_API +#endif + +#define ESPEAK_API_REVISION 12 +/* +Revision 2 + Added parameter "options" to eSpeakInitialize() + +Revision 3 + Added espeakWORDGAP to espeak_PARAMETER + +Revision 4 + Added flags parameter to espeak_CompileDictionary() + +Revision 5 + Added espeakCHARS_16BIT + +Revision 6 + Added macros: espeakRATE_MINIMUM, espeakRATE_MAXIMUM, espeakRATE_NORMAL + +Revision 7 24.Dec.2011 + Changed espeak_EVENT structure to add id.string[] for phoneme mnemonics. + Added espeakINITIALIZE_PHONEME_IPA option for espeak_Initialize() to report phonemes as IPA names. + +Revision 8 26.Apr.2013 + Added function espeak_TextToPhonemes(). + +Revision 9 30.May.2013 + Changed function espeak_TextToPhonemes(). + +Revision 10 29.Aug.2014 + Changed phonememode parameter to espeak_TextToPhonemes() and espeak_SetPhonemeTrace + +Revision 11 (espeak-ng) + Made ESPEAK_API import/export symbols correctly on Windows. + +Revision 12 (espeak-ng) + Exposed espeak_SetPhonemeCallback. This is available in eSpeak, but was not exposed in this header. + +*/ + /********************/ + /* Initialization */ + /********************/ + +// values for 'value' in espeak_SetParameter(espeakRATE, value, 0), nominally in words-per-minute +#define espeakRATE_MINIMUM 80 +#define espeakRATE_MAXIMUM 450 +#define espeakRATE_NORMAL 175 + + +typedef enum { + espeakEVENT_LIST_TERMINATED = 0, // Retrieval mode: terminates the event list. + espeakEVENT_WORD = 1, // Start of word + espeakEVENT_SENTENCE = 2, // Start of sentence + espeakEVENT_MARK = 3, // Mark + espeakEVENT_PLAY = 4, // Audio element + espeakEVENT_END = 5, // End of sentence or clause + espeakEVENT_MSG_TERMINATED = 6, // End of message + espeakEVENT_PHONEME = 7, // Phoneme, if enabled in espeak_Initialize() + espeakEVENT_SAMPLERATE = 8 // internal use, set sample rate +} espeak_EVENT_TYPE; + + + +typedef struct { + espeak_EVENT_TYPE type; + unsigned int unique_identifier; // message identifier (or 0 for key or character) + int text_position; // the number of characters from the start of the text + int length; // word length, in characters (for espeakEVENT_WORD) + int audio_position; // the time in mS within the generated speech output data + int sample; // sample id (internal use) + void* user_data; // pointer supplied by the calling program + union { + int number; // used for WORD and SENTENCE events. + const char *name; // used for MARK and PLAY events. UTF8 string + char string[8]; // used for phoneme names (UTF8). Terminated by a zero byte unless the name needs the full 8 bytes. + } id; +} espeak_EVENT; +/* + When a message is supplied to espeak_synth, the request is buffered and espeak_synth returns. When the message is really processed, the callback function will be repetedly called. + + + In RETRIEVAL mode, the callback function supplies to the calling program the audio data and an event list terminated by 0 (LIST_TERMINATED). + + In PLAYBACK mode, the callback function is called as soon as an event happens. + + For example suppose that the following message is supplied to espeak_Synth: + "hello, hello." + + + * Once processed in RETRIEVAL mode, it could lead to 3 calls of the callback function : + + ** Block 1: +