diff --git a/patches/piper_CMakeLists.txt b/patches/piper_CMakeLists.txt new file mode 100644 index 0000000..6323d2e --- /dev/null +++ b/patches/piper_CMakeLists.txt @@ -0,0 +1,173 @@ +cmake_minimum_required(VERSION 3.13) + +project(piper C CXX) + +file(READ "${CMAKE_CURRENT_LIST_DIR}/VERSION" piper_version) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +if(MSVC) + # Force compiler to use UTF-8 for IPA constants + add_compile_options("$<$:/utf-8>") + add_compile_options("$<$:/utf-8>") +elseif(NOT APPLE) + # Linux flags + string(APPEND CMAKE_CXX_FLAGS " -Wall -Wextra -Wl,-rpath,'$ORIGIN'") + string(APPEND CMAKE_C_FLAGS " -Wall -Wextra") +endif() + +add_executable(piper src/cpp/main.cpp src/cpp/piper.cpp) +add_executable(test_piper src/cpp/test.cpp src/cpp/piper.cpp) + +# NOTE: external project prefix are shortened because of path length restrictions on Windows +# NOTE: onnxruntime is pulled from piper-phonemize + +# ---- fmt --- + +if(NOT DEFINED FMT_DIR) + set(FMT_VERSION "10.0.0") + set(FMT_DIR "${CMAKE_CURRENT_BINARY_DIR}/fi") + + include(ExternalProject) + ExternalProject_Add( + fmt_external + PREFIX "${CMAKE_CURRENT_BINARY_DIR}/f" + URL "https://github.com/fmtlib/fmt/archive/refs/tags/${FMT_VERSION}.zip" + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=${FMT_DIR} + CMAKE_ARGS -DFMT_TEST:BOOL=OFF # Don't build all the tests + ) + add_dependencies(piper fmt_external) + add_dependencies(test_piper fmt_external) +endif() + +# ---- spdlog --- + +if(NOT DEFINED SPDLOG_DIR) + set(SPDLOG_DIR "${CMAKE_CURRENT_BINARY_DIR}/si") + set(SPDLOG_VERSION "1.12.0") + ExternalProject_Add( + spdlog_external + PREFIX "${CMAKE_CURRENT_BINARY_DIR}/s" + URL "https://github.com/gabime/spdlog/archive/refs/tags/v${SPDLOG_VERSION}.zip" + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=${SPDLOG_DIR} + ) + add_dependencies(piper spdlog_external) + add_dependencies(test_piper spdlog_external) +endif() + +# ---- piper-phonemize --- + +if(NOT DEFINED PIPER_PHONEMIZE_DIR) + set(PIPER_PHONEMIZE_DIR "${CMAKE_CURRENT_BINARY_DIR}/pi") + set(ONNXRUNTIME_VERSION "${ONNXRUNTIME_VERSION}") + ExternalProject_Add( + piper_phonemize_external + PREFIX "${CMAKE_CURRENT_BINARY_DIR}/p" + URL "https://github.com/rhasspy/piper-phonemize/archive/refs/heads/master.zip" + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=${PIPER_PHONEMIZE_DIR} + ) + add_dependencies(piper piper_phonemize_external) + add_dependencies(test_piper piper_phonemize_external) +endif() + +# ---- Declare executable ---- + +if((NOT MSVC) AND (NOT APPLE)) + # Linux flags + string(APPEND CMAKE_CXX_FLAGS " -Wall -Wextra -Wl,-rpath,'$ORIGIN'") + string(APPEND CMAKE_C_FLAGS " -Wall -Wextra") + target_link_libraries(piper -static-libgcc -static-libstdc++) + + set(PIPER_EXTRA_LIBRARIES "pthread") +endif() + +target_link_libraries(piper + fmt + spdlog + espeak-ng + piper_phonemize + onnxruntime + ${PIPER_EXTRA_LIBRARIES} +) + +target_link_directories(piper PUBLIC + ${FMT_DIR}/lib + ${SPDLOG_DIR}/lib + ${PIPER_PHONEMIZE_DIR}/lib +) + +target_include_directories(piper PUBLIC + ${FMT_DIR}/include + ${SPDLOG_DIR}/include + ${PIPER_PHONEMIZE_DIR}/include +) + +target_compile_definitions(piper PUBLIC _PIPER_VERSION=${piper_version}) + +# ---- Declare test ---- +include(CTest) +enable_testing() +add_test( + NAME test_piper + COMMAND test_piper "${CMAKE_SOURCE_DIR}/etc/test_voice.onnx" "${PIPER_PHONEMIZE_DIR}/share/espeak-ng-data" "${CMAKE_CURRENT_BINARY_DIR}/test.wav" +) + +target_compile_features(test_piper PUBLIC cxx_std_17) + +target_include_directories( + test_piper PUBLIC + ${FMT_DIR}/include + ${SPDLOG_DIR}/include + ${PIPER_PHONEMIZE_DIR}/include +) + +target_link_directories( + test_piper PUBLIC + ${FMT_DIR}/lib + ${SPDLOG_DIR}/lib + ${PIPER_PHONEMIZE_DIR}/lib +) + +target_link_libraries(test_piper PUBLIC + fmt + spdlog + espeak-ng + piper_phonemize + onnxruntime +) + +# ---- Declare install targets ---- + +install( + TARGETS piper + DESTINATION ${CMAKE_INSTALL_PREFIX}) + +# Dependencies +install( + DIRECTORY ${PIPER_PHONEMIZE_DIR}/bin/ + DESTINATION ${CMAKE_INSTALL_PREFIX} + USE_SOURCE_PERMISSIONS # keep +x + FILES_MATCHING + PATTERN "piper_phonemize" + PATTERN "espeak-ng" + PATTERN "*.dll" +) + +install( + DIRECTORY ${PIPER_PHONEMIZE_DIR}/lib/ + DESTINATION ${CMAKE_INSTALL_PREFIX} + FILES_MATCHING + PATTERN "*.dll" + PATTERN "*.so*" +) + +install( + DIRECTORY ${PIPER_PHONEMIZE_DIR}/share/espeak-ng-data + DESTINATION ${CMAKE_INSTALL_PREFIX} +) + +install( + FILES ${PIPER_PHONEMIZE_DIR}/share/libtashkeel_model.ort + DESTINATION ${CMAKE_INSTALL_PREFIX} +) \ No newline at end of file