voice_audio_multi/tools/cmake/espeak_static.cmake
Fabio c36510c21e
Some checks failed
Linux Build / Linux cpu (push) Has been cancelled
Linux Build / Linux cpu-clang (push) Has been cancelled
Linux Build / Linux vulkan (push) Has been cancelled
mac-build / macOS CPU (push) Has been cancelled
Nix Build / Nix (cpu) (push) Has been cancelled
Nix Build / Nix (vulkan) (push) Has been cancelled
windows-build / Windows CPU (push) Has been cancelled
Initial import: audio.cpp with Orange Pi documentation
2026-11-04 19:05:22 +01:00

109 lines
5.6 KiB
CMake

# Keep upstream options and target names out of audio.cpp's CMake scope.
include(ExternalProject)
if(POLICY CMP0135)
cmake_policy(SET CMP0135 NEW)
endif()
if(CMAKE_CROSSCOMPILING AND NOT EMSCRIPTEN)
message(FATAL_ERROR "Static eSpeak data compilation currently requires a native build")
endif()
set(_espeak_config Release)
set(_espeak_target data)
set(_espeak_cross_args)
set(_espeak_parallel_args)
if(EMSCRIPTEN)
# Data compilation runs native tools. Reuse their packaged output while
# compiling the same phonemizer library for the browser.
set(AUDIOCPP_ESPEAK_DATA_PACKAGE "" CACHE FILEPATH "Native-generated eSpeak data package for the browser build")
if(NOT EXISTS "${AUDIOCPP_ESPEAK_DATA_PACKAGE}")
message(FATAL_ERROR "Browser static eSpeak requires AUDIOCPP_ESPEAK_DATA_PACKAGE from a native build")
endif()
set(_espeak_config Debug)
set(_espeak_target espeak-ng)
set(_espeak_parallel_args --parallel 8)
list(APPEND _espeak_cross_args
"-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}"
"-DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}"
"-DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}"
"-DCMAKE_C_FLAGS_DEBUG:STRING=${CMAKE_C_FLAGS_DEBUG}"
"-DCMAKE_CXX_FLAGS_DEBUG:STRING=${CMAKE_CXX_FLAGS_DEBUG}")
endif()
set(_espeak_root "${CMAKE_BINARY_DIR}/_deps/espeak-static")
set(_espeak_source "${_espeak_root}/source")
set(_espeak_build "${_espeak_root}/build")
set(_espeak_lib "${_espeak_build}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}espeak-ng${CMAKE_STATIC_LIBRARY_SUFFIX}")
set(_espeak_ucd "${_espeak_build}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}ucd${CMAKE_STATIC_LIBRARY_SUFFIX}")
ExternalProject_Add(audiocpp_espeak_source
URL https://codeload.github.com/espeak-ng/espeak-ng/tar.gz/refs/tags/1.52.0
URL_HASH SHA256=bb4338102ff3b49a81423da8a1a158b420124b055b60fa76cfb4b18677130a23
DOWNLOAD_DIR "${_espeak_root}/download"
DOWNLOAD_NAME espeak-ng-1.52.0.tar.gz
SOURCE_DIR "${_espeak_source}"
BINARY_DIR "${_espeak_build}"
PATCH_COMMAND ${CMAKE_COMMAND} -DSOURCE_DIR=<SOURCE_DIR> -DBROWSER_BUILD=${EMSCRIPTEN}
-P "${CMAKE_CURRENT_LIST_DIR}/espeak_patch.cmake"
CMAKE_ARGS
-DCMAKE_BUILD_TYPE=${_espeak_config}
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
-DCMAKE_POLICY_VERSION_MINIMUM=3.5
-DCMAKE_INSTALL_PREFIX=<BINARY_DIR>/install
-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY=<BINARY_DIR>/lib
-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE=<BINARY_DIR>/lib
-DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=OFF
-DUSE_ASYNC=OFF -DUSE_LIBSONIC=OFF -DUSE_LIBPCAUDIO=OFF
-DUSE_MBROLA=OFF -DUSE_SPEECHPLAYER=OFF -DESPEAK_BUILD_MANPAGES=OFF
${_espeak_cross_args}
BUILD_COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --config ${_espeak_config} --target ${_espeak_target} ${_espeak_parallel_args}
INSTALL_COMMAND ""
LOG_BUILD ON
BUILD_BYPRODUCTS "${_espeak_lib}" "${_espeak_ucd}")
ExternalProject_Add_StepDependencies(audiocpp_espeak_source patch "${CMAKE_CURRENT_LIST_DIR}/espeak_patch.cmake")
add_library(audiocpp_espeak_static STATIC IMPORTED)
set_target_properties(audiocpp_espeak_static PROPERTIES IMPORTED_LOCATION "${_espeak_lib}")
add_library(audiocpp_espeak_ucd STATIC IMPORTED)
set_target_properties(audiocpp_espeak_ucd PROPERTIES IMPORTED_LOCATION "${_espeak_ucd}")
add_dependencies(audiocpp_espeak_static audiocpp_espeak_source)
add_dependencies(engine_core audiocpp_espeak_source)
target_include_directories(engine_core PRIVATE "${_espeak_source}/src/include")
target_compile_definitions(engine_core PRIVATE AUDIOCPP_STATIC_ESPEAK=1 LIBESPEAK_NG_EXPORT=1)
target_link_libraries(engine_runtime PRIVATE audiocpp_espeak_static audiocpp_espeak_ucd)
if(UNIX)
target_link_libraries(engine_runtime PRIVATE m)
endif()
# Data stays separate and relocatable. These are not executable model weights.
if(EMSCRIPTEN)
set(_espeak_package "${AUDIOCPP_ESPEAK_DATA_PACKAGE}")
else()
add_executable(audiocpp_espeak_pack tools/espeak_data_pack.cpp src/framework/text/espeak_data.cpp)
target_include_directories(audiocpp_espeak_pack PRIVATE "${PROJECT_SOURCE_DIR}/include")
target_link_libraries(audiocpp_espeak_pack PRIVATE ggml-base)
set(_espeak_package "${_espeak_root}/espeak-ng-data.bin")
add_custom_command(OUTPUT "${_espeak_package}"
COMMAND $<TARGET_FILE:audiocpp_espeak_pack> "${_espeak_build}/espeak-ng-data" "${_espeak_package}"
DEPENDS audiocpp_espeak_pack audiocpp_espeak_source
VERBATIM)
endif()
add_custom_target(audiocpp_espeak_package DEPENDS "${_espeak_package}")
if(EMSCRIPTEN)
add_dependencies(audiocpp_espeak_package audiocpp_espeak_source)
endif()
# One staging target shared by CLI/server/probes. Run on every requested build,
# even when only the data package changed and executables do not need relinking.
set(_espeak_bin "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
if(CMAKE_CONFIGURATION_TYPES)
string(APPEND _espeak_bin "/$<CONFIG>")
endif()
add_custom_target(audiocpp_espeak_stage
COMMAND ${CMAKE_COMMAND} -E make_directory "${_espeak_bin}/licenses/espeak-ng"
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${_espeak_package}" "${_espeak_bin}/espeak-ng-data.bin"
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${_espeak_source}/COPYING"
"${_espeak_root}/download/espeak-ng-1.52.0.tar.gz"
"${PROJECT_SOURCE_DIR}/tools/cmake/espeak_patch.cmake"
"${PROJECT_SOURCE_DIR}/tools/cmake/espeak_static.cmake"
"${PROJECT_SOURCE_DIR}/docs/espeak_phonemizer.md"
"${_espeak_bin}/licenses/espeak-ng/"
DEPENDS audiocpp_espeak_package
VERBATIM)
function(audiocpp_stage_espeak target)
add_dependencies(${target} audiocpp_espeak_stage)
endfunction()