Commit 67cb420d authored by moto's avatar moto Committed by Facebook GitHub Bot
Browse files

Enable CTC decoder in Windows (#2587)

Summary:
This commit enables CTC decoder on Windows.

The functionality seems to work fine.
The tests are passing, the decoding tutorial runs fine.

The only difference to the Linux/macOS version is that
loading model in XZ compression format is not supported.

![289961785_399620772041679_7768117002438616376_n](https://user-images.githubusercontent.com/855818/181420923-cfbd8402-20de-4e63-b9e4-e39f9aa9fc50.png)

Pull Request resolved: https://github.com/pytorch/audio/pull/2587

Reviewed By: carolineechen, nateanl

Differential Revision: D38276490

Pulled By: mthrok

fbshipit-source-id: f2203b2235c5bbb0220fe560aaaf0e1d5530347a
parent f234e51f
...@@ -703,7 +703,6 @@ jobs: ...@@ -703,7 +703,6 @@ jobs:
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CMD_COMPUTE_MFCC_FEATS: true TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CMD_COMPUTE_MFCC_FEATS: true
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CMD_COMPUTE_SPECTROGRAM_FEATS: true TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CMD_COMPUTE_SPECTROGRAM_FEATS: true
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CMD_SOX: true TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CMD_SOX: true
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CTC_DECODER: true
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CUDA: true TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CUDA: true
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_KALDI: true TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_KALDI: true
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_SOX: true TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_SOX: true
...@@ -749,7 +748,6 @@ jobs: ...@@ -749,7 +748,6 @@ jobs:
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CMD_COMPUTE_MFCC_FEATS: true TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CMD_COMPUTE_MFCC_FEATS: true
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CMD_COMPUTE_SPECTROGRAM_FEATS: true TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CMD_COMPUTE_SPECTROGRAM_FEATS: true
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CMD_SOX: true TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CMD_SOX: true
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CTC_DECODER: true
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_KALDI: true TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_KALDI: true
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_SOX: true TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_SOX: true
TORCHAUDIO_TEST_ALLOW_SKIP_IF_ON_PYTHON_310: true TORCHAUDIO_TEST_ALLOW_SKIP_IF_ON_PYTHON_310: true
......
...@@ -703,7 +703,6 @@ jobs: ...@@ -703,7 +703,6 @@ jobs:
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CMD_COMPUTE_MFCC_FEATS: true TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CMD_COMPUTE_MFCC_FEATS: true
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CMD_COMPUTE_SPECTROGRAM_FEATS: true TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CMD_COMPUTE_SPECTROGRAM_FEATS: true
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CMD_SOX: true TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CMD_SOX: true
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CTC_DECODER: true
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CUDA: true TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CUDA: true
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_KALDI: true TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_KALDI: true
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_SOX: true TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_SOX: true
...@@ -749,7 +748,6 @@ jobs: ...@@ -749,7 +748,6 @@ jobs:
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CMD_COMPUTE_MFCC_FEATS: true TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CMD_COMPUTE_MFCC_FEATS: true
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CMD_COMPUTE_SPECTROGRAM_FEATS: true TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CMD_COMPUTE_SPECTROGRAM_FEATS: true
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CMD_SOX: true TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CMD_SOX: true
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_CTC_DECODER: true
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_KALDI: true TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_KALDI: true
TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_SOX: true TORCHAUDIO_TEST_ALLOW_SKIP_IF_NO_SOX: true
TORCHAUDIO_TEST_ALLOW_SKIP_IF_ON_PYTHON_310: true TORCHAUDIO_TEST_ALLOW_SKIP_IF_ON_PYTHON_310: true
......
...@@ -131,7 +131,12 @@ if(USE_OPENMP) ...@@ -131,7 +131,12 @@ if(USE_OPENMP)
endif() endif()
# TORCH_CXX_FLAGS contains the same -D_GLIBCXX_USE_CXX11_ABI value as PyTorch # TORCH_CXX_FLAGS contains the same -D_GLIBCXX_USE_CXX11_ABI value as PyTorch
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall ${TORCH_CXX_FLAGS}") if (MSVC)
set(warning_flags /W4)
else()
set(warning_flags -Wall)
endif()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${warning_flags} ${TORCH_CXX_FLAGS}")
add_subdirectory(third_party) add_subdirectory(third_party)
add_subdirectory(torchaudio/csrc) add_subdirectory(torchaudio/csrc)
set(CMAKE_CXX_VISIBILITY_PRESET hidden) set(CMAKE_CXX_VISIBILITY_PRESET hidden)
file(MAKE_DIRECTORY install/include)
file(MAKE_DIRECTORY install/lib)
################################################################################ ################################################################################
# sox # sox
################################################################################ ################################################################################
...@@ -15,12 +18,14 @@ if (BUILD_KALDI) ...@@ -15,12 +18,14 @@ if (BUILD_KALDI)
endif() endif()
################################################################################ ################################################################################
# KenLM # Decoder
################################################################################ ################################################################################
if (BUILD_CTC_DECODER) if (BUILD_CTC_DECODER)
add_subdirectory(zlib) add_subdirectory(zlib)
add_subdirectory(bzip2) add_subdirectory(bzip2)
add_subdirectory(lzma) if (NOT MSVC)
add_subdirectory(lzma)
endif()
add_subdirectory(kenlm) add_subdirectory(kenlm)
add_subdirectory(flashlight-text) add_subdirectory(flashlight-text)
endif() endif()
...@@ -3,30 +3,55 @@ include(ExternalProject) ...@@ -3,30 +3,55 @@ include(ExternalProject)
set(INSTALL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../install) set(INSTALL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../install)
set(ARCHIVE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../archives) set(ARCHIVE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../archives)
set( if (MSVC)
BZIP_LIBRARIES set(
${INSTALL_DIR}/lib/libbz2.a BZIP_LIBRARIES
${INSTALL_DIR}/lib/libbz2.lib
) )
ExternalProject_Add(bzip2-
ExternalProject_Add(bzip2- PREFIX ${CMAKE_CURRENT_BINARY_DIR}
PREFIX ${CMAKE_CURRENT_BINARY_DIR} DOWNLOAD_DIR ${ARCHIVE_DIR}
DOWNLOAD_DIR ${ARCHIVE_DIR} URL https://sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz
URL https://sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz URL_HASH SHA256=ab5a03176ee106d3f0fa90e381da478ddae405918153cca248e682cd0c4a2269
URL_HASH SHA256=ab5a03176ee106d3f0fa90e381da478ddae405918153cca248e682cd0c4a2269 BUILD_BYPRODUCTS ${BZIP_LIBRARIES}
BUILD_BYPRODUCTS ${BZIP_LIBRARIES} BUILD_IN_SOURCE 1
BUILD_IN_SOURCE 1 CONFIGURE_COMMAND nmake -f makefile.msc
CONFIGURE_COMMAND "" BUILD_COMMAND cp bzlib.h ${INSTALL_DIR}/include
BUILD_COMMAND make VERBOSE=1 "CFLAGS=-fPIC -fvisibility=hidden -Wall -Winline -O2 -g -D_FILE_OFFSET_BITS=64" INSTALL_COMMAND cp libbz2.* ${INSTALL_DIR}/lib
INSTALL_COMMAND make install PREFIX=${INSTALL_DIR} DOWNLOAD_NO_PROGRESS ON
DOWNLOAD_NO_PROGRESS ON LOG_DOWNLOAD ON
LOG_DOWNLOAD ON LOG_UPDATE ON
LOG_UPDATE ON LOG_CONFIGURE ON
LOG_CONFIGURE ON LOG_BUILD ON
LOG_BUILD ON LOG_INSTALL ON
LOG_INSTALL ON LOG_MERGED_STDOUTERR ON
LOG_MERGED_STDOUTERR ON LOG_OUTPUT_ON_FAILURE ON
LOG_OUTPUT_ON_FAILURE ON )
) else()
set(
BZIP_LIBRARIES
${INSTALL_DIR}/lib/libbz2.a
)
ExternalProject_Add(bzip2-
PREFIX ${CMAKE_CURRENT_BINARY_DIR}
DOWNLOAD_DIR ${ARCHIVE_DIR}
URL https://sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz
URL_HASH SHA256=ab5a03176ee106d3f0fa90e381da478ddae405918153cca248e682cd0c4a2269
BUILD_BYPRODUCTS ${BZIP_LIBRARIES}
BUILD_IN_SOURCE 1
CONFIGURE_COMMAND ""
BUILD_COMMAND make VERBOSE=1 "CFLAGS=-fPIC -fvisibility=hidden -Wall -Winline -O2 -g -D_FILE_OFFSET_BITS=64"
INSTALL_COMMAND make install PREFIX=${INSTALL_DIR}
DOWNLOAD_NO_PROGRESS ON
LOG_DOWNLOAD ON
LOG_UPDATE ON
LOG_CONFIGURE ON
LOG_BUILD ON
LOG_INSTALL ON
LOG_MERGED_STDOUTERR ON
LOG_OUTPUT_ON_FAILURE ON
)
endif(MSVC)
add_library(bzip2 INTERFACE) add_library(bzip2 INTERFACE)
add_dependencies(bzip2 bzip2-) add_dependencies(bzip2 bzip2-)
......
...@@ -11,6 +11,12 @@ ...@@ -11,6 +11,12 @@
set(CMAKE_CXX_VISIBILITY_PRESET default) set(CMAKE_CXX_VISIBILITY_PRESET default)
# the following line is added in order to export symbols when building on Windows
# this approach has some limitations as documented in https://github.com/pytorch/pytorch/pull/3650
if (MSVC)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
endif()
set( set(
libflashlight_src libflashlight_src
submodule/flashlight/lib/text/decoder/Utils.cpp submodule/flashlight/lib/text/decoder/Utils.cpp
......
# kenlm uses std::binary_function, which had BC breaking change in C++17.
# On Windows + GPU, torchaudio is compiled with C++ 17 globally.
# We use C++ 14 for KenLM
set(CMAKE_CXX_STANDARD 14)
set( set(
KENLM_UTIL_SOURCES KENLM_UTIL_SOURCES
kenlm/util/bit_packing.cc kenlm/util/bit_packing.cc
...@@ -54,18 +59,45 @@ target_include_directories( ...@@ -54,18 +59,45 @@ target_include_directories(
PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}" PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}"
) )
target_compile_definitions( set(
kenlm kenlm_deps
PUBLIC KENLM_MAX_ORDER=6 zlib
bzip2
)
set(
kenlm_compiler_definitions
KENLM_MAX_ORDER=6
HAVE_ZLIB HAVE_ZLIB
HAVE_BZLIB HAVE_BZLIB
HAVE_XZLIB )
if (MSVC)
list(
APPEND
kenlm_compiler_definitions
# To avoid warning C4003: not enough arguments for function-like macro invocation 'max'
NOMINMAX
)
endif()
if(TARGET lzma)
list(APPEND kenlm_deps lzma)
list(
APPEND
kenlm_compiler_definitions
HAVE_XZLIB
)
endif()
target_compile_definitions(
kenlm
PUBLIC
${kenlm_compiler_definitions}
) )
target_link_libraries( target_link_libraries(
kenlm kenlm
PRIVATE PRIVATE
zlib ${kenlm_deps}
bzip2
lzma
) )
...@@ -3,38 +3,64 @@ include(ExternalProject) ...@@ -3,38 +3,64 @@ include(ExternalProject)
set(INSTALL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../install) set(INSTALL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../install)
set(ARCHIVE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../archives) set(ARCHIVE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../archives)
# To pass custom environment variables to ExternalProject_Add command, if (MSVC)
# we need to do `${CMAKE_COMMAND} -E env ${envs} <COMMANAD>`. set(
# https://stackoverflow.com/a/62437353 ZLIB_LIBRARIES
# We constrcut the custom environment variables here ${INSTALL_DIR}/lib/zlib.lib
set(envs )
"PKG_CONFIG_PATH=${INSTALL_DIR}/lib/pkgconfig"
"LDFLAGS=-L${INSTALL_DIR}/lib $ENV{LDFLAGS}"
"CFLAGS=-I${INSTALL_DIR}/include -fvisibility=hidden -fPIC $ENV{CFLAGS}"
"prefix=${INSTALL_DIR}"
)
set( ExternalProject_Add(zlib-
ZLIB_LIBRARIES PREFIX ${CMAKE_CURRENT_BINARY_DIR}
${INSTALL_DIR}/lib/libz.a DOWNLOAD_DIR ${ARCHIVE_DIR}
URL https://github.com/madler/zlib/archive/refs/tags/v1.2.12.tar.gz
URL_HASH SHA256=d8688496ea40fb61787500e863cc63c9afcbc524468cedeb478068924eb54932
BUILD_BYPRODUCTS ${ZLIB_LIBRARIES}
BUILD_IN_SOURCE 1
CONFIGURE_COMMAND nmake -f win32/Makefile.msc zlib.lib
BUILD_COMMAND cp zlib.lib ${INSTALL_DIR}/lib/
INSTALL_COMMAND cp zlib.h zconf.h ${INSTALL_DIR}/include/
LOG_DOWNLOAD ON
LOG_UPDATE ON
LOG_CONFIGURE ON
LOG_BUILD ON
LOG_INSTALL ON
LOG_MERGED_STDOUTERR ON
LOG_OUTPUT_ON_FAILURE ON
)
else()
# To pass custom environment variables to ExternalProject_Add command,
# we need to do `${CMAKE_COMMAND} -E env ${envs} <COMMANAD>`.
# https://stackoverflow.com/a/62437353
# We constrcut the custom environment variables here
set(envs
"PKG_CONFIG_PATH=${INSTALL_DIR}/lib/pkgconfig"
"LDFLAGS=-L${INSTALL_DIR}/lib $ENV{LDFLAGS}"
"CFLAGS=-I${INSTALL_DIR}/include -fvisibility=hidden -fPIC $ENV{CFLAGS}"
"prefix=${INSTALL_DIR}"
) )
ExternalProject_Add(zlib- set(
PREFIX ${CMAKE_CURRENT_BINARY_DIR} ZLIB_LIBRARIES
DOWNLOAD_DIR ${ARCHIVE_DIR} ${INSTALL_DIR}/lib/libz.a
URL https://github.com/madler/zlib/archive/refs/tags/v1.2.12.tar.gz )
URL_HASH SHA256=d8688496ea40fb61787500e863cc63c9afcbc524468cedeb478068924eb54932
BUILD_BYPRODUCTS ${ZLIB_LIBRARIES} ExternalProject_Add(zlib-
CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env ${envs} ${CMAKE_CURRENT_BINARY_DIR}/src/zlib-/configure --static PREFIX ${CMAKE_CURRENT_BINARY_DIR}
BUILD_COMMAND ${CMAKE_COMMAND} -E env ${envs} make VERBOSE=1 DOWNLOAD_DIR ${ARCHIVE_DIR}
LOG_DOWNLOAD ON URL https://github.com/madler/zlib/archive/refs/tags/v1.2.12.tar.gz
LOG_UPDATE ON URL_HASH SHA256=d8688496ea40fb61787500e863cc63c9afcbc524468cedeb478068924eb54932
LOG_CONFIGURE ON BUILD_BYPRODUCTS ${ZLIB_LIBRARIES}
LOG_BUILD ON CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env ${envs} ${CMAKE_CURRENT_BINARY_DIR}/src/zlib-/configure --static
LOG_INSTALL ON BUILD_COMMAND ${CMAKE_COMMAND} -E env ${envs} make VERBOSE=1
LOG_MERGED_STDOUTERR ON LOG_DOWNLOAD ON
LOG_OUTPUT_ON_FAILURE ON LOG_UPDATE ON
) LOG_CONFIGURE ON
LOG_BUILD ON
LOG_INSTALL ON
LOG_MERGED_STDOUTERR ON
LOG_OUTPUT_ON_FAILURE ON
)
endif()
add_library(zlib INTERFACE) add_library(zlib INTERFACE)
add_dependencies(zlib zlib-) add_dependencies(zlib zlib-)
......
...@@ -35,7 +35,7 @@ def _get_build(var, default=False): ...@@ -35,7 +35,7 @@ def _get_build(var, default=False):
_BUILD_SOX = False if platform.system() == "Windows" else _get_build("BUILD_SOX", True) _BUILD_SOX = False if platform.system() == "Windows" else _get_build("BUILD_SOX", True)
_BUILD_KALDI = False if platform.system() == "Windows" else _get_build("BUILD_KALDI", True) _BUILD_KALDI = False if platform.system() == "Windows" else _get_build("BUILD_KALDI", True)
_BUILD_RNNT = _get_build("BUILD_RNNT", True) _BUILD_RNNT = _get_build("BUILD_RNNT", True)
_BUILD_CTC_DECODER = False if platform.system() == "Windows" else _get_build("BUILD_CTC_DECODER", True) _BUILD_CTC_DECODER = _get_build("BUILD_CTC_DECODER", True)
_USE_FFMPEG = _get_build("USE_FFMPEG", False) _USE_FFMPEG = _get_build("USE_FFMPEG", False)
_USE_ROCM = _get_build("USE_ROCM", torch.cuda.is_available() and torch.version.hip is not None) _USE_ROCM = _get_build("USE_ROCM", torch.cuda.is_available() and torch.version.hip is not None)
_USE_CUDA = _get_build("USE_CUDA", torch.cuda.is_available() and torch.version.hip is None) _USE_CUDA = _get_build("USE_CUDA", torch.cuda.is_available() and torch.version.hip is None)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment