| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| """Script to build and install decoder package. |
| |
| It is used by scripts/asr_language_modeling/ngram_lm/install_beamsearch_decoders.sh to install |
| KenLM and OpenSeq2Seq decoder. |
| |
| You can set the order of KenLM model by changing -DKENLM_MAX_ORDER=10 argument. |
| """ |
| from __future__ import absolute_import, division, print_function |
|
|
| import argparse |
| import distutils.ccompiler |
| import glob |
| import multiprocessing.pool |
| import os |
| import platform |
| import sys |
|
|
| from setuptools import Extension, distutils, setup |
|
|
| parser = argparse.ArgumentParser(description=__doc__) |
| parser.add_argument( |
| "--num_processes", default=1, type=int, help="Number of cpu processes to build package. (default: %(default)d)" |
| ) |
| args = parser.parse_known_args() |
|
|
| |
| sys.argv = [sys.argv[0]] + args[1] |
|
|
|
|
| |
| |
| def parallelCCompile( |
| self, |
| sources, |
| output_dir=None, |
| macros=None, |
| include_dirs=None, |
| debug=0, |
| extra_preargs=None, |
| extra_postargs=None, |
| depends=None, |
| ): |
| |
| macros, objects, extra_postargs, pp_opts, build = self._setup_compile( |
| output_dir, macros, include_dirs, sources, depends, extra_postargs |
| ) |
| cc_args = self._get_cc_args(pp_opts, debug, extra_preargs) |
|
|
| |
| def _single_compile(obj): |
| try: |
| src, ext = build[obj] |
| except KeyError: |
| return |
| self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts) |
|
|
| |
| thread_pool = multiprocessing.pool.ThreadPool(args[0].num_processes) |
| list(thread_pool.imap(_single_compile, objects)) |
| return objects |
|
|
|
|
| def compile_test(header, library): |
| dummy_path = os.path.join(os.path.dirname(__file__), "dummy") |
| command = ( |
| "bash -c \"g++ -include " |
| + header |
| + " -l" |
| + library |
| + " -x c++ - <<<'int main() {}' -o " |
| + dummy_path |
| + " >/dev/null 2>/dev/null && rm " |
| + dummy_path |
| + " 2>/dev/null\"" |
| ) |
| return os.system(command) == 0 |
|
|
|
|
| |
| distutils.ccompiler.CCompiler.compile = parallelCCompile |
|
|
| FILES = glob.glob('kenlm/util/*.cc') + glob.glob('kenlm/lm/*.cc') + glob.glob('kenlm/util/double-conversion/*.cc') |
|
|
| FILES += glob.glob('openfst-1.6.3/src/lib/*.cc') |
|
|
| FILES = [fn for fn in FILES if not (fn.endswith('main.cc') or fn.endswith('test.cc') or fn.endswith('unittest.cc'))] |
|
|
| LIBS = ['stdc++'] |
| if platform.system() != 'Darwin': |
| LIBS.append('rt') |
|
|
| ARGS = ['-O3', '-DNDEBUG', '-DKENLM_MAX_ORDER=10', '-std=c++11'] |
|
|
| if compile_test('zlib.h', 'z'): |
| ARGS.append('-DHAVE_ZLIB') |
| LIBS.append('z') |
|
|
| if compile_test('bzlib.h', 'bz2'): |
| ARGS.append('-DHAVE_BZLIB') |
| LIBS.append('bz2') |
|
|
| if compile_test('lzma.h', 'lzma'): |
| ARGS.append('-DHAVE_XZLIB') |
| LIBS.append('lzma') |
|
|
| os.system('swig -python -c++ ./decoders.i') |
|
|
| decoders_module = [ |
| Extension( |
| name='_swig_decoders', |
| sources=FILES + glob.glob('*.cxx') + glob.glob('*.cpp'), |
| language='c++', |
| include_dirs=['.', 'kenlm', 'openfst-1.6.3/src/include', 'ThreadPool',], |
| libraries=LIBS, |
| extra_compile_args=ARGS, |
| ) |
| ] |
|
|
| setup( |
| name='ctc_decoders', |
| version='1.1', |
| description="""CTC decoders""", |
| ext_modules=decoders_module, |
| py_modules=['ctc_decoders', 'swig_decoders'], |
| ) |
|
|