diff --git a/CMakeLists.txt b/CMakeLists.txt
index 04dd613..7374d25 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -4,94 +4,134 @@
 cmake_minimum_required(VERSION 3.26)
 project(piper LANGUAGES C CXX)
 
+set(UCD_STATIC_LIB "" CACHE FILEPATH "Path to libucd.a if built with system espeak-ng")
+
 include(ExternalProject)
 
 # scikit-build-core will forward Python_* variables
 find_package(Python COMPONENTS Development.Module Development.SABIModule REQUIRED)
 
-# Install location for espeak-ng
-set(ESPEAKNG_BUILD_DIR ${CMAKE_BINARY_DIR}/espeak_ng)
-set(ESPEAKNG_INSTALL_DIR ${CMAKE_BINARY_DIR}/espeak_ng-install)
-
-if(WIN32)
-    # Special handling for Windows
-    set(ESPEAKNG_STATIC_LIB ${ESPEAKNG_INSTALL_DIR}/lib/espeak-ng.lib)
-    set(UCD_STATIC_LIB ${ESPEAKNG_BUILD_DIR}/src/espeak_ng_external-build/src/ucd-tools/ucd.lib)
-else()
-    set(ESPEAKNG_STATIC_LIB ${ESPEAKNG_INSTALL_DIR}/lib/libespeak-ng.a)
-    set(UCD_STATIC_LIB ${ESPEAKNG_BUILD_DIR}/src/espeak_ng_external-build/src/ucd-tools/libucd.a)
-endif()
-
-ExternalProject_Add(espeak_ng_external
-    GIT_REPOSITORY https://github.com/espeak-ng/espeak-ng.git
-    GIT_TAG 212928b394a96e8fd2096616bfd54e17845c48f6  # 2025-Mar-22
-    PREFIX ${ESPEAKNG_BUILD_DIR}
-    CMAKE_ARGS
-        -DCMAKE_INSTALL_PREFIX=${ESPEAKNG_INSTALL_DIR}
-        -DBUILD_SHARED_LIBS:BOOL=OFF
-        -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON
-        -DUSE_ASYNC:BOOL=OFF
-        -DUSE_MBROLA:BOOL=OFF
-        -DUSE_LIBSONIC:BOOL=OFF
-        -DUSE_LIBPCAUDIO:BOOL=OFF
-        -DUSE_KLATT:BOOL=OFF
-        -DUSE_SPEECHPLAYER:BOOL=OFF
-        -DEXTRA_cmn:BOOL=ON
-        -DEXTRA_ru:BOOL=ON
-        # Need to explicitly add ucd include directory for CI
-        "-DCMAKE_C_FLAGS=-D_FILE_OFFSET_BITS=64 -I${ESPEAKNG_BUILD_DIR}/src/espeak_ng_external/src/ucd-tools/src/include"
-        "-DCMAKE_CXX_FLAGS=-D_FILE_OFFSET_BITS=64 -I${ESPEAKNG_BUILD_DIR}/src/espeak_ng_external/src/ucd-tools/src/include"
-    BUILD_BYPRODUCTS
-        ${ESPEAKNG_STATIC_LIB}
-        ${UCD_STATIC_LIB}
-    UPDATE_DISCONNECTED TRUE
-)
-
-include_directories(
-    ${ESPEAKNG_INSTALL_DIR}/include
-)
-
 # espeak bridge
 add_library(espeakbridge MODULE
     src/piper/espeakbridge.c
 )
 
-add_dependencies(espeakbridge espeak_ng_external)
-target_link_libraries(espeakbridge
-    ${ESPEAKNG_STATIC_LIB}
-    ${UCD_STATIC_LIB}
+# scikit-build-core forwards this
+target_link_libraries(espeakbridge PRIVATE
     Python::SABIModule
 )
-target_include_directories(espeakbridge PRIVATE
-    ${ESPEAKNG_INSTALL_DIR}/include
-)
 
-if(WIN32)
-    # Fix dll thunk issue (__imp_SYMBOL not found)
-    target_compile_definitions(espeakbridge PRIVATE LIBESPEAK_NG_EXPORT)
+# Try to find espeak-ng using pkg-config, if available
+find_package(PkgConfig QUIET)
+
+if (PKG_CONFIG_FOUND)
+    pkg_check_modules(ESPEAKNG QUIET espeak-ng)
+endif()
+
+
+if (ESPEAKNG_FOUND)
+    message(STATUS "Found system espeak-ng via pkg-config")
+
+    target_include_directories(espeakbridge PRIVATE
+        ${ESPEAKNG_INCLUDE_DIRS}
+    )
+    target_link_directories(espeakbridge PRIVATE
+        ${ESPEAKNG_LIBRARY_DIRS}
+    )
+    target_link_libraries(espeakbridge PRIVATE
+        ${ESPEAKNG_LIBRARIES}
+        ${UCD_STATIC_LIB}
+    )
 
-    # Fix .dll suffix
     set_target_properties(espeakbridge PROPERTIES
         PREFIX ""
-        SUFFIX ".pyd"
     )
+
+    install(TARGETS espeakbridge
+        LIBRARY DESTINATION .
+        RUNTIME DESTINATION .
+    )
+
 else()
-    set_target_properties(espeakbridge PROPERTIES
-        PREFIX ""
+
+    # Install location for espeak-ng
+    set(ESPEAKNG_BUILD_DIR ${CMAKE_BINARY_DIR}/espeak_ng)
+    set(ESPEAKNG_INSTALL_DIR ${CMAKE_BINARY_DIR}/espeak_ng-install)
+
+    if(WIN32)
+        # Special handling for Windows
+        set(ESPEAKNG_STATIC_LIB ${ESPEAKNG_INSTALL_DIR}/lib/espeak-ng.lib)
+        set(UCD_STATIC_LIB ${ESPEAKNG_BUILD_DIR}/src/espeak_ng_external-build/src/ucd-tools/ucd.lib)
+    else()
+        set(ESPEAKNG_STATIC_LIB ${ESPEAKNG_INSTALL_DIR}/lib/libespeak-ng.a)
+        set(UCD_STATIC_LIB ${ESPEAKNG_BUILD_DIR}/src/espeak_ng_external-build/src/ucd-tools/libucd.a)
+    endif()
+
+    ExternalProject_Add(espeak_ng_external
+        GIT_REPOSITORY https://github.com/espeak-ng/espeak-ng.git
+        GIT_TAG 212928b394a96e8fd2096616bfd54e17845c48f6  # 2025-Mar-22
+        PREFIX ${ESPEAKNG_BUILD_DIR}
+        CMAKE_ARGS
+            -DCMAKE_INSTALL_PREFIX=${ESPEAKNG_INSTALL_DIR}
+            -DBUILD_SHARED_LIBS:BOOL=OFF
+            -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON
+            -DUSE_ASYNC:BOOL=OFF
+            -DUSE_MBROLA:BOOL=OFF
+            -DUSE_LIBSONIC:BOOL=OFF
+            -DUSE_LIBPCAUDIO:BOOL=OFF
+            -DUSE_KLATT:BOOL=OFF
+            -DUSE_SPEECHPLAYER:BOOL=OFF
+            -DEXTRA_cmn:BOOL=ON
+            -DEXTRA_ru:BOOL=ON
+            # Need to explicitly add ucd include directory for CI
+            "-DCMAKE_C_FLAGS=-D_FILE_OFFSET_BITS=64 -I${ESPEAKNG_BUILD_DIR}/src/espeak_ng_external/src/ucd-tools/src/include"
+            "-DCMAKE_CXX_FLAGS=-D_FILE_OFFSET_BITS=64 -I${ESPEAKNG_BUILD_DIR}/src/espeak_ng_external/src/ucd-tools/src/include"
+        BUILD_BYPRODUCTS
+            ${ESPEAKNG_STATIC_LIB}
+            ${UCD_STATIC_LIB}
+        UPDATE_DISCONNECTED TRUE
     )
-endif()
 
-install(TARGETS espeakbridge
-    LIBRARY DESTINATION .
-    RUNTIME DESTINATION .
-)
+    include_directories(
+        ${ESPEAKNG_INSTALL_DIR}/include
+    )
+
+    add_dependencies(espeakbridge espeak_ng_external)
+    target_link_libraries(espeakbridge PRIVATE
+        ${ESPEAKNG_STATIC_LIB}
+        ${UCD_STATIC_LIB}
+    )
+    target_include_directories(espeakbridge PRIVATE
+        ${ESPEAKNG_INSTALL_DIR}/include
+    )
 
-# Copy espeak-ng-data
-set(DATA_SRC ${CMAKE_BINARY_DIR}/espeak_ng-install/share/espeak-ng-data)
-set(DATA_DST ${CMAKE_CURRENT_SOURCE_DIR}/src/piper/espeak-ng-data)
+    if(WIN32)
+        # Fix dll thunk issue (__imp_SYMBOL not found)
+        target_compile_definitions(espeakbridge PRIVATE LIBESPEAK_NG_EXPORT)
 
-add_custom_target(copy_espeak_ng_data ALL
-    COMMAND ${CMAKE_COMMAND} -E copy_directory ${DATA_SRC} ${DATA_DST}
-    DEPENDS espeak_ng_external
-    COMMENT "Copying espeak-ng-data after espeak-ng external project builds"
-)
+        # Fix .dll suffix
+        set_target_properties(espeakbridge PROPERTIES
+            PREFIX ""
+            SUFFIX ".pyd"
+        )
+    else()
+        set_target_properties(espeakbridge PROPERTIES
+            PREFIX ""
+        )
+    endif()
+
+    install(TARGETS espeakbridge
+        LIBRARY DESTINATION .
+        RUNTIME DESTINATION .
+    )
+
+    # Copy espeak-ng-data
+    set(DATA_SRC ${CMAKE_BINARY_DIR}/espeak_ng-install/share/espeak-ng-data)
+    set(DATA_DST ${CMAKE_CURRENT_SOURCE_DIR}/src/piper/espeak-ng-data)
+
+    add_custom_target(copy_espeak_ng_data ALL
+        COMMAND ${CMAKE_COMMAND} -E copy_directory ${DATA_SRC} ${DATA_DST}
+        DEPENDS espeak_ng_external
+        COMMENT "Copying espeak-ng-data after espeak-ng external project builds"
+    )
+endif()
