@@ -0,0 +1,23 @@ | |||
cmake_minimum_required(VERSION 3.8) | |||
project(espeak-ng | |||
VERSION 1.52.0.1 | |||
DESCRIPTION "open source speech synthesizer that supports more than hundred languages and accents" | |||
HOMEPAGE_URL "https://github.com/espeak-ng/espeak-ng" | |||
) | |||
include(cmake/deps.cmake) | |||
include(cmake/config.cmake) | |||
add_subdirectory(src) | |||
include(cmake/data.cmake) | |||
option(BUILD_SHARED_LIBS "Build shared libraries" OFF) | |||
message(STATUS "Configuration:") | |||
message(STATUS " shared: ${BUILD_SHARED_LIBS}") | |||
message(STATUS " mbrola: ${USE_MBROLA} (${MBROLA_BIN})") | |||
message(STATUS " libsonic: ${USE_LIBSONIC} (${SONIC_LIB} ${SONIC_INC})") | |||
message(STATUS " libpcaudio: ${USE_LIBPCAUDIO} (${PCAUDIO_LIB} ${PCAUDIO_INC})") | |||
message(STATUS " klatt: ${USE_KLATT}") | |||
message(STATUS " speech-player: ${USE_SPEECHPLAYER}") | |||
message(STATUS " async: ${USE_ASYNC}") |
@@ -0,0 +1,10 @@ | |||
include(CheckSymbolExists) | |||
check_symbol_exists(mkstemp "stdlib.h" HAVE_MKSTEMP) | |||
option(USE_MBROLA "Use mbrola for speech synthesis" ${HAVE_MBROLA}) | |||
option(USE_LIBSONIC "Use libsonit for faster speech rates" ${HAVE_LIBSONIC}) | |||
option(USE_LIBPCAUDIO "Use libPcAudio for sound output" ${HAVE_LIBPCAUDIO}) | |||
option(USE_KLATT "Use klatt for speech synthesis" ON) | |||
option(USE_SPEECHPLAYER "Use speech-player for speech synthesis" ON) | |||
option(USE_ASYNC "Support asynchronous speech synthesis" ON) |
@@ -0,0 +1,168 @@ | |||
list(APPEND _dict_compile_list | |||
af am an ar as az | |||
ba be bg bn bpy bs | |||
ca chr cmn cs cv cy | |||
da de | |||
el en eo es et eu | |||
fa fi fr | |||
ga gd gn grc gu | |||
hak haw he hi hr ht hu hy | |||
ia id io is it | |||
ja jbo | |||
ka kk kl kn kok ko ku ky | |||
la lb lfn lt lv | |||
mi mk ml mr ms mto mt my | |||
nci ne nl nog no | |||
om or | |||
pap pa piqd pl pt py | |||
qdb quc qu qya | |||
ro ru | |||
sd shn si sjn sk sl smj sq sr sv sw | |||
ta te th tk tn tr tt | |||
ug uk ur uz | |||
vi | |||
yue | |||
) | |||
list(APPEND _mbrola_lang_list | |||
af1 ar1 ar2 | |||
ca cmn cr1 cs | |||
de2 de4 de6 de8 | |||
ee1 en1 es es3 es4 | |||
fr | |||
gr1 gr2 grc-de6 | |||
he hn1 hu1 | |||
ic1 id1 in ir1 it1 it3 | |||
jp | |||
la1 lt | |||
ma1 mx1 mx2 | |||
nl nz1 | |||
pl1 pt1 ptbr ptbr4 | |||
ro1 | |||
sv sv2 | |||
tl1 tr1 | |||
us us3 | |||
vz | |||
) | |||
set(DATA_DIST_ROOT ${CMAKE_CURRENT_BINARY_DIR}) | |||
set(DATA_DIST_DIR ${DATA_DIST_ROOT}/espeak-ng-data) | |||
set(PHONEME_TMP_DIR ${DATA_DIST_ROOT}/phsource) | |||
set(DICT_TMP_DIR ${DATA_DIST_ROOT}/dictsource) | |||
set(DATA_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/espeak-ng-data) | |||
set(PHONEME_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/phsource) | |||
set(DICT_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/dictsource) | |||
file(MAKE_DIRECTORY "${DATA_DIST_DIR}") | |||
file(MAKE_DIRECTORY "${DICT_TMP_DIR}") | |||
file(COPY "${DATA_SRC_DIR}/lang" DESTINATION "${DATA_DIST_DIR}") | |||
file(COPY "${DATA_SRC_DIR}/voices/!v" DESTINATION "${DATA_DIST_DIR}/voices") | |||
file(COPY "${PHONEME_SRC_DIR}" DESTINATION "${DATA_DIST_ROOT}") | |||
set(ESPEAK_RUN_ENV ${CMAKE_COMMAND} -E env "ESPEAK_DATA_PATH=${DATA_DIST_ROOT}") | |||
set(ESPEAK_RUN_CMD ${ESPEAK_RUN_ENV} $ENV{VALGRIND} "$<TARGET_FILE:espeak-ng-bin>") | |||
add_custom_command( | |||
OUTPUT "${DATA_DIST_DIR}/intonations" | |||
COMMAND ${ESPEAK_RUN_CMD} --compile-intonations | |||
WORKING_DIRECTORY "${PHONEME_SRC_DIR}" | |||
COMMENT "Compile intonations" | |||
DEPENDS | |||
"$<TARGET_FILE:espeak-ng-bin>" | |||
"${PHONEME_SRC_DIR}/intonation" | |||
) | |||
set(_phon_deps "") | |||
function(check_phon_deps _file) | |||
set(_file "${PHONEME_SRC_DIR}/${_file}") | |||
list(APPEND _phon_deps "${_file}") | |||
file(STRINGS "${_file}" _phon_incs REGEX "include .+") | |||
list(TRANSFORM _phon_incs REPLACE "^[ \t]*include[ \t]+" "") | |||
foreach(_inc ${_phon_incs}) | |||
check_phon_deps(${_inc}) | |||
endforeach(_inc) | |||
set(_phon_deps ${_phon_deps} PARENT_SCOPE) | |||
endfunction(check_phon_deps) | |||
check_phon_deps("phonemes") | |||
add_custom_command( | |||
OUTPUT | |||
"${DATA_DIST_DIR}/phondata" | |||
"${DATA_DIST_DIR}/phondata-manifest" | |||
"${DATA_DIST_DIR}/phonindex" | |||
"${DATA_DIST_DIR}/phontab" | |||
COMMAND ${ESPEAK_RUN_CMD} --compile-phonemes | |||
WORKING_DIRECTORY "${PHONEME_SRC_DIR}" | |||
COMMENT "Compile phonemes" | |||
DEPENDS | |||
"$<TARGET_FILE:espeak-ng-bin>" | |||
${_phon_deps} | |||
) | |||
list(APPEND _dict_targets) | |||
list(APPEND _mbr_targets) | |||
foreach(_dict_name ${_dict_compile_list}) | |||
set(_dict_target "${DATA_DIST_DIR}/${_dict_name}_dict") | |||
set(_dict_deps "") | |||
list(APPEND _dict_targets ${_dict_target}) | |||
list(APPEND _dict_deps | |||
"${DICT_SRC_DIR}/${_dict_name}_rules" | |||
"${DICT_SRC_DIR}/${_dict_name}_list" | |||
) | |||
if(EXISTS "${DICT_SRC_DIR}/extra/${_dict_name}_listx") | |||
option(EXTRA_${_dict_name} "Compile extra ${_dict_name} dictionary" ON) | |||
if(EXTRA_${_dict_name}) | |||
list(APPEND _dict_deps "${DICT_SRC_DIR}/extra/${_dict_name}_listx") | |||
else() | |||
file(REMOVE "${DICT_TMP_DIR}/${_dict_name}_listx") | |||
endif() | |||
elseif(EXISTS "${DICT_SRC_DIR}/${_dict_name}_listx") | |||
list(APPEND _dict_deps "${DICT_SRC_DIR}/${_dict_name}_listx") | |||
endif() | |||
if(EXISTS "${DICT_SRC_DIR}/${_dict_name}_emoji") | |||
list(APPEND _dict_deps "${DICT_SRC_DIR}/${_dict_name}_emoji") | |||
endif() | |||
add_custom_command( | |||
OUTPUT "${_dict_target}" | |||
COMMAND ${CMAKE_COMMAND} -E copy ${_dict_deps} "${DICT_TMP_DIR}/" | |||
COMMAND ${ESPEAK_RUN_CMD} --compile=${_dict_name} | |||
WORKING_DIRECTORY "${DICT_TMP_DIR}" | |||
DEPENDS | |||
"$<TARGET_FILE:espeak-ng-bin>" | |||
"${DATA_DIST_DIR}/phondata" | |||
"${DATA_DIST_DIR}/intonations" | |||
${_dict_deps} | |||
) | |||
endforeach() | |||
if (HAVE_MBROLA AND USE_MBROLA) | |||
file(COPY "${DATA_SRC_DIR}/voices/mb" DESTINATION "${DATA_DIST_DIR}/voices") | |||
file(MAKE_DIRECTORY "${DATA_DIST_DIR}/mbrola_ph") | |||
foreach(_mbl ${_mbrola_lang_list}) | |||
set(_mbl_src "${PHONEME_SRC_DIR}/mbrola/${_mbl}") | |||
set(_mbl_out "${DATA_DIST_DIR}/mbrola_ph/${_mbl}_phtrans") | |||
list(APPEND _mbr_targets ${_mbl_out}) | |||
add_custom_command( | |||
OUTPUT "${_mbl_out}" | |||
COMMAND ${ESPEAK_RUN_CMD} --compile-mbrola="${_mbl_src}" | |||
DEPENDS "$<TARGET_FILE:espeak-ng-bin>" "${_mbl_src}" | |||
) | |||
endforeach(_mbl) | |||
endif() | |||
add_custom_target( | |||
data ALL | |||
DEPENDS | |||
"${DATA_DIST_DIR}/intonations" | |||
"${DATA_DIST_DIR}/phondata" | |||
${_dict_targets} | |||
${_mbr_targets} | |||
) | |||
install(DIRECTORY ${DATA_DIST_DIR} DESTINATION share) |
@@ -0,0 +1,33 @@ | |||
find_library(SONIC_LIB sonic) | |||
find_path(SONIC_INC "sonic.h") | |||
find_library(PCAUDIO_LIB pcaudio) | |||
find_path(PCAUDIO_INC "pcaudiolib/audio.h") | |||
find_library(PTHREAD_LIB pthread) | |||
find_program(MBROLA_BIN mbrola) | |||
include(FetchContent) | |||
if (PTHREAD_LIB) | |||
set(HAVE_PTHREAD ON) | |||
endif(PTHREAD_LIB) | |||
if (MBROLA_BIN) | |||
set(HAVE_MBROLA ON) | |||
endif(MBROLA_BIN) | |||
if (SONIC_LIB AND SONIC_INC) | |||
set(HAVE_LIBSONIC ON) | |||
else() | |||
FetchContent_Declare(sonic-git | |||
GIT_REPOSITORY https://github.com/waywardgeek/sonic.git | |||
GIT_TAG fbf75c3d6d846bad3bb3d456cbc5d07d9fd8c104 | |||
) | |||
FetchContent_MakeAvailable(sonic-git) | |||
FetchContent_GetProperties(sonic-git) | |||
add_library(sonic OBJECT ${sonic-git_SOURCE_DIR}/sonic.c) | |||
target_include_directories(sonic PUBLIC ${sonic-git_SOURCE_DIR}) | |||
set(HAVE_LIBSONIC ON) | |||
set(SONIC_LIB sonic) | |||
set(SONIC_INC ${sonic-git_SOURCE_DIR}) | |||
endif() | |||
if (PCAUDIO_LIB AND PCAUDIO_INC) | |||
set(HAVE_LIBPCAUDIO ON) | |||
endif() |
@@ -0,0 +1,20 @@ | |||
add_library(espeak-include INTERFACE) | |||
target_include_directories(espeak-include INTERFACE include include/compat) | |||
add_subdirectory(ucd-tools) | |||
add_subdirectory(speechPlayer) | |||
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 | |||
) | |||
add_custom_target( | |||
speak-ng ALL | |||
${CMAKE_COMMAND} -E create_symlink espeak-ng ${CMAKE_CURRENT_BINARY_DIR}/speak-ng | |||
COMMENT "Link espeak-ng to speak-ng" | |||
DEPENDS espeak-ng-bin | |||
) | |||
install(TARGETS espeak-ng-bin) | |||
install(DIRECTORY include/espeak include/espeak-ng TYPE INCLUDE) |
@@ -0,0 +1,97 @@ | |||
set(ESPEAK_CONFIG_DIR ${CMAKE_CURRENT_BINARY_DIR}/include) | |||
set(ESPEAK_CONFIG_H ${ESPEAK_CONFIG_DIR}/config.h) | |||
configure_file(config.h.in ${ESPEAK_CONFIG_H}) | |||
add_library(espeak-ng-config INTERFACE) | |||
target_include_directories(espeak-ng-config INTERFACE ${ESPEAK_CONFIG_DIR}) | |||
add_library(espeak-ng | |||
common.c | |||
mnemonics.c | |||
error.c | |||
ieee80.c | |||
compiledata.c | |||
compiledict.c | |||
dictionary.c | |||
encoding.c | |||
intonation.c | |||
langopts.c | |||
numbers.c | |||
phoneme.c | |||
phonemelist.c | |||
readclause.c | |||
setlengths.c | |||
soundicon.c | |||
spect.c | |||
ssml.c | |||
synthdata.c | |||
synthesize.c | |||
tr_languages.c | |||
translate.c | |||
translateword.c | |||
voices.c | |||
wavegen.c | |||
speech.c | |||
espeak_api.c | |||
) | |||
target_compile_options(espeak-ng PRIVATE | |||
"-fPIC" | |||
"-fvisibility=hidden" | |||
"-fno-exceptions" | |||
"-fwrapv" | |||
"-pedantic" | |||
"-Wunused-parameter" | |||
"-Wunused" | |||
"-Wuninitialized" | |||
"-Wreturn-type" | |||
"-Wmissing-prototypes" | |||
"-Wint-conversion" | |||
"-Wimplicit" | |||
) | |||
target_compile_definitions(espeak-ng PRIVATE "LIBESPEAK_NG_EXPORT") | |||
if (USE_ASYNC) | |||
target_sources(espeak-ng PRIVATE | |||
event.c | |||
fifo.c | |||
espeak_command.c | |||
) | |||
endif(USE_ASYNC) | |||
if (USE_MBROLA) | |||
target_sources(espeak-ng PRIVATE | |||
mbrowrap.c | |||
compilembrola.c | |||
synth_mbrola.c | |||
) | |||
endif(USE_MBROLA) | |||
if (USE_KLATT) | |||
target_sources(espeak-ng PRIVATE klatt.c) | |||
endif(USE_KLATT) | |||
if (USE_SPEECHPLAYER) | |||
target_sources(espeak-ng PRIVATE sPlayer.c) | |||
target_link_libraries(espeak-ng PRIVATE speechPlayer) | |||
endif(USE_SPEECHPLAYER) | |||
if (HAVE_LIBSONIC AND USE_LIBSONIC) | |||
target_link_libraries(espeak-ng PRIVATE ${SONIC_LIB}) | |||
target_include_directories(espeak-ng PRIVATE ${SONIC_INC}) | |||
endif() | |||
if (HAVE_LIBPCAUDIO AND USE_LIBPCAUDIO) | |||
target_link_libraries(espeak-ng PRIVATE ${PCAUDIO_LIB}) | |||
target_include_directories(espeak-ng PRIVATE ${PCAUDIO_INC}) | |||
endif() | |||
target_link_libraries(espeak-ng PRIVATE espeak-ng-config ucd m) | |||
target_link_libraries(espeak-ng PUBLIC espeak-include) | |||
install(TARGETS espeak-ng LIBRARY) |
@@ -0,0 +1,10 @@ | |||
#cmakedefine01 HAVE_MKSTEMP | |||
#cmakedefine01 USE_ASYNC | |||
#cmakedefine01 USE_KLATT | |||
#cmakedefine01 USE_LIBPCAUDIO | |||
#cmakedefine01 USE_LIBSONIC | |||
#cmakedefine01 USE_MBROLA | |||
#cmakedefine01 USE_SPEECHPLAYER | |||
#define PACKAGE_VERSION "${PROJECT_VERSION}" |
@@ -0,0 +1,8 @@ | |||
add_library(speechPlayer STATIC | |||
src/frame.cpp | |||
src/speechPlayer.cpp | |||
src/speechWaveGenerator.cpp | |||
) | |||
target_include_directories(speechPlayer PUBLIC include) | |||
target_compile_options(speechPlayer PRIVATE "-fPIC") | |||
install(TARGETS speechPlayer ARCHIVE) |
@@ -0,0 +1,10 @@ | |||
add_library(ucd STATIC | |||
src/case.c | |||
src/categories.c | |||
src/ctype.c | |||
src/proplist.c | |||
src/scripts.c | |||
src/tostring.c | |||
) | |||
target_include_directories(ucd PUBLIC src/include) | |||
install(TARGETS ucd ARCHIVE) |