Merge remote-tracking branch 'upstream/master' into update-r0.8
This commit is contained in:
commit
39ef96b533
@ -1,92 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
"""
|
|
||||||
Tool for building Sample Databases (SDB files) from DeepSpeech CSV files and other SDB files
|
|
||||||
Use "python3 build_sdb.py -h" for help
|
|
||||||
"""
|
|
||||||
import argparse
|
|
||||||
|
|
||||||
import progressbar
|
|
||||||
|
|
||||||
from deepspeech_training.util.audio import (
|
|
||||||
AUDIO_TYPE_PCM,
|
|
||||||
AUDIO_TYPE_OPUS,
|
|
||||||
AUDIO_TYPE_WAV,
|
|
||||||
change_audio_types,
|
|
||||||
)
|
|
||||||
from deepspeech_training.util.downloader import SIMPLE_BAR
|
|
||||||
from deepspeech_training.util.sample_collections import (
|
|
||||||
DirectSDBWriter,
|
|
||||||
samples_from_sources,
|
|
||||||
)
|
|
||||||
from deepspeech_training.util.augmentations import (
|
|
||||||
parse_augmentations,
|
|
||||||
apply_sample_augmentations,
|
|
||||||
SampleAugmentation
|
|
||||||
)
|
|
||||||
|
|
||||||
AUDIO_TYPE_LOOKUP = {"wav": AUDIO_TYPE_WAV, "opus": AUDIO_TYPE_OPUS}
|
|
||||||
|
|
||||||
|
|
||||||
def build_sdb():
|
|
||||||
audio_type = AUDIO_TYPE_LOOKUP[CLI_ARGS.audio_type]
|
|
||||||
augmentations = parse_augmentations(CLI_ARGS.augment)
|
|
||||||
if any(not isinstance(a, SampleAugmentation) for a in augmentations):
|
|
||||||
print("Warning: Some of the augmentations cannot be applied by this command.")
|
|
||||||
with DirectSDBWriter(
|
|
||||||
CLI_ARGS.target, audio_type=audio_type, labeled=not CLI_ARGS.unlabeled
|
|
||||||
) as sdb_writer:
|
|
||||||
samples = samples_from_sources(CLI_ARGS.sources, labeled=not CLI_ARGS.unlabeled)
|
|
||||||
num_samples = len(samples)
|
|
||||||
if augmentations:
|
|
||||||
samples = apply_sample_augmentations(samples, audio_type=AUDIO_TYPE_PCM, augmentations=augmentations)
|
|
||||||
bar = progressbar.ProgressBar(max_value=num_samples, widgets=SIMPLE_BAR)
|
|
||||||
for sample in bar(
|
|
||||||
change_audio_types(samples, audio_type=audio_type, bitrate=CLI_ARGS.bitrate, processes=CLI_ARGS.workers)
|
|
||||||
):
|
|
||||||
sdb_writer.add(sample)
|
|
||||||
|
|
||||||
|
|
||||||
def handle_args():
|
|
||||||
parser = argparse.ArgumentParser(
|
|
||||||
description="Tool for building Sample Databases (SDB files) "
|
|
||||||
"from DeepSpeech CSV files and other SDB files"
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
"sources",
|
|
||||||
nargs="+",
|
|
||||||
help="Source CSV and/or SDB files - "
|
|
||||||
"Note: For getting a correctly ordered target SDB, source SDBs have to have their samples "
|
|
||||||
"already ordered from shortest to longest.",
|
|
||||||
)
|
|
||||||
parser.add_argument("target", help="SDB file to create")
|
|
||||||
parser.add_argument(
|
|
||||||
"--audio-type",
|
|
||||||
default="opus",
|
|
||||||
choices=AUDIO_TYPE_LOOKUP.keys(),
|
|
||||||
help="Audio representation inside target SDB",
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
"--bitrate",
|
|
||||||
type=int,
|
|
||||||
help="Bitrate for lossy compressed SDB samples like in case of --audio-type opus",
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
"--workers", type=int, default=None, help="Number of encoding SDB workers"
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
"--unlabeled",
|
|
||||||
action="store_true",
|
|
||||||
help="If to build an SDB with unlabeled (audio only) samples - "
|
|
||||||
"typically used for building noise augmentation corpora",
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
"--augment",
|
|
||||||
action='append',
|
|
||||||
help="Add an augmentation operation",
|
|
||||||
)
|
|
||||||
return parser.parse_args()
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
CLI_ARGS = handle_args()
|
|
||||||
build_sdb()
|
|
111
bin/data_set_tool.py
Executable file
111
bin/data_set_tool.py
Executable file
@ -0,0 +1,111 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
'''
|
||||||
|
Tool for building a combined SDB or CSV sample-set from other sets
|
||||||
|
Use 'python3 data_set_tool.py -h' for help
|
||||||
|
'''
|
||||||
|
import sys
|
||||||
|
import argparse
|
||||||
|
import progressbar
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from deepspeech_training.util.audio import (
|
||||||
|
AUDIO_TYPE_PCM,
|
||||||
|
AUDIO_TYPE_OPUS,
|
||||||
|
AUDIO_TYPE_WAV,
|
||||||
|
change_audio_types,
|
||||||
|
)
|
||||||
|
from deepspeech_training.util.downloader import SIMPLE_BAR
|
||||||
|
from deepspeech_training.util.sample_collections import (
|
||||||
|
CSVWriter,
|
||||||
|
DirectSDBWriter,
|
||||||
|
samples_from_sources,
|
||||||
|
)
|
||||||
|
from deepspeech_training.util.augmentations import (
|
||||||
|
parse_augmentations,
|
||||||
|
apply_sample_augmentations,
|
||||||
|
SampleAugmentation
|
||||||
|
)
|
||||||
|
|
||||||
|
AUDIO_TYPE_LOOKUP = {'wav': AUDIO_TYPE_WAV, 'opus': AUDIO_TYPE_OPUS}
|
||||||
|
|
||||||
|
|
||||||
|
def build_data_set():
|
||||||
|
audio_type = AUDIO_TYPE_LOOKUP[CLI_ARGS.audio_type]
|
||||||
|
augmentations = parse_augmentations(CLI_ARGS.augment)
|
||||||
|
if any(not isinstance(a, SampleAugmentation) for a in augmentations):
|
||||||
|
print('Warning: Some of the specified augmentations will not get applied, as this tool only supports '
|
||||||
|
'overlay, codec, reverb, resample and volume.')
|
||||||
|
extension = Path(CLI_ARGS.target).suffix.lower()
|
||||||
|
labeled = not CLI_ARGS.unlabeled
|
||||||
|
if extension == '.csv':
|
||||||
|
writer = CSVWriter(CLI_ARGS.target, absolute_paths=CLI_ARGS.absolute_paths, labeled=labeled)
|
||||||
|
elif extension == '.sdb':
|
||||||
|
writer = DirectSDBWriter(CLI_ARGS.target, audio_type=audio_type, labeled=labeled)
|
||||||
|
else:
|
||||||
|
print('Unknown extension of target file - has to be either .csv or .sdb')
|
||||||
|
sys.exit(1)
|
||||||
|
with writer:
|
||||||
|
samples = samples_from_sources(CLI_ARGS.sources, labeled=not CLI_ARGS.unlabeled)
|
||||||
|
num_samples = len(samples)
|
||||||
|
if augmentations:
|
||||||
|
samples = apply_sample_augmentations(samples, audio_type=AUDIO_TYPE_PCM, augmentations=augmentations)
|
||||||
|
bar = progressbar.ProgressBar(max_value=num_samples, widgets=SIMPLE_BAR)
|
||||||
|
for sample in bar(change_audio_types(
|
||||||
|
samples,
|
||||||
|
audio_type=audio_type,
|
||||||
|
bitrate=CLI_ARGS.bitrate,
|
||||||
|
processes=CLI_ARGS.workers)):
|
||||||
|
writer.add(sample)
|
||||||
|
|
||||||
|
|
||||||
|
def handle_args():
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
description='Tool for building a combined SDB or CSV sample-set from other sets'
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'sources',
|
||||||
|
nargs='+',
|
||||||
|
help='Source CSV and/or SDB files - '
|
||||||
|
'Note: For getting a correctly ordered target set, source SDBs have to have their samples '
|
||||||
|
'already ordered from shortest to longest.',
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'target',
|
||||||
|
help='SDB or CSV file to create'
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--audio-type',
|
||||||
|
default='opus',
|
||||||
|
choices=AUDIO_TYPE_LOOKUP.keys(),
|
||||||
|
help='Audio representation inside target SDB',
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--bitrate',
|
||||||
|
type=int,
|
||||||
|
help='Bitrate for lossy compressed SDB samples like in case of --audio-type opus',
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--workers', type=int, default=None, help='Number of encoding SDB workers'
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--unlabeled',
|
||||||
|
action='store_true',
|
||||||
|
help='If to build an SDB with unlabeled (audio only) samples - '
|
||||||
|
'typically used for building noise augmentation corpora',
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--absolute-paths',
|
||||||
|
action='store_true',
|
||||||
|
help='If to reference samples by their absolute paths when writing CSV files',
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--augment',
|
||||||
|
action='append',
|
||||||
|
help='Add an augmentation operation',
|
||||||
|
)
|
||||||
|
return parser.parse_args()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
CLI_ARGS = handle_args()
|
||||||
|
build_data_set()
|
@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
"""
|
"""
|
||||||
Tool for playing (and augmenting) single samples or samples from Sample Databases (SDB files) and DeepSpeech CSV files
|
Tool for playing (and augmenting) single samples or samples from Sample Databases (SDB files) and DeepSpeech CSV files
|
||||||
Use "python3 build_sdb.py -h" for help
|
Use "python3 play.py -h" for help
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
@ -13,7 +13,7 @@ fi;
|
|||||||
|
|
||||||
if [ ! -f "${ldc93s1_dir}/ldc93s1.sdb" ]; then
|
if [ ! -f "${ldc93s1_dir}/ldc93s1.sdb" ]; then
|
||||||
echo "Converting LDC93S1 example data, saving to ${ldc93s1_sdb}."
|
echo "Converting LDC93S1 example data, saving to ${ldc93s1_sdb}."
|
||||||
python -u bin/build_sdb.py ${ldc93s1_csv} ${ldc93s1_sdb}
|
python -u bin/data_set_tool.py ${ldc93s1_csv} ${ldc93s1_sdb}
|
||||||
fi;
|
fi;
|
||||||
|
|
||||||
# Force only one visible device because we have a single-sample dataset
|
# Force only one visible device because we have a single-sample dataset
|
||||||
|
@ -16,7 +16,7 @@ fi;
|
|||||||
|
|
||||||
if [ ! -f "${ldc93s1_dir}/ldc93s1.sdb" ]; then
|
if [ ! -f "${ldc93s1_dir}/ldc93s1.sdb" ]; then
|
||||||
echo "Converting LDC93S1 example data, saving to ${ldc93s1_sdb}."
|
echo "Converting LDC93S1 example data, saving to ${ldc93s1_sdb}."
|
||||||
python -u bin/build_sdb.py ${ldc93s1_csv} ${ldc93s1_sdb}
|
python -u bin/data_set_tool.py ${ldc93s1_csv} ${ldc93s1_sdb}
|
||||||
fi;
|
fi;
|
||||||
|
|
||||||
# Force only one visible device because we have a single-sample dataset
|
# Force only one visible device because we have a single-sample dataset
|
||||||
|
@ -16,7 +16,7 @@ fi;
|
|||||||
|
|
||||||
if [ ! -f "${ldc93s1_dir}/ldc93s1.sdb" ]; then
|
if [ ! -f "${ldc93s1_dir}/ldc93s1.sdb" ]; then
|
||||||
echo "Converting LDC93S1 example data, saving to ${ldc93s1_sdb}."
|
echo "Converting LDC93S1 example data, saving to ${ldc93s1_sdb}."
|
||||||
python -u bin/build_sdb.py ${ldc93s1_csv} ${ldc93s1_sdb}
|
python -u bin/data_set_tool.py ${ldc93s1_csv} ${ldc93s1_sdb}
|
||||||
fi;
|
fi;
|
||||||
|
|
||||||
# Force only one visible device because we have a single-sample dataset
|
# Force only one visible device because we have a single-sample dataset
|
||||||
|
@ -77,6 +77,20 @@ You can now use Bazel to build the main DeepSpeech library, ``libdeepspeech.so``
|
|||||||
|
|
||||||
The generated binaries will be saved to ``bazel-bin/native_client/``.
|
The generated binaries will be saved to ``bazel-bin/native_client/``.
|
||||||
|
|
||||||
|
.. _build-generate-scorer-package:
|
||||||
|
|
||||||
|
Compile ``generate_scorer_package``
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
Following the same setup as for ``libdeepspeech.so`` above, you can rebuild the ``generate_scorer_package`` binary by adding its target to the command line: ``//native_client:generate_scorer_package``.
|
||||||
|
Using the example from above you can build the library and that binary at the same time:
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
|
||||||
|
bazel build --workspace_status_command="bash native_client/bazel_workspace_status_cmd.sh" --config=monolithic -c opt --copt=-O3 --copt="-D_GLIBCXX_USE_CXX11_ABI=0" --copt=-fvisibility=hidden //native_client:libdeepspeech.so //native_client:generate_scorer_package
|
||||||
|
|
||||||
|
The generated binaries will be saved to ``bazel-bin/native_client/``.
|
||||||
|
|
||||||
Compile Language Bindings
|
Compile Language Bindings
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
@ -49,6 +49,9 @@ Afterwards you can use ``generate_scorer_package`` to generate the scorer packag
|
|||||||
./generate_scorer_package --alphabet ../alphabet.txt --lm lm.binary --vocab vocab-500000.txt \
|
./generate_scorer_package --alphabet ../alphabet.txt --lm lm.binary --vocab vocab-500000.txt \
|
||||||
--package kenlm.scorer --default_alpha 0.931289039105002 --default_beta 1.1834137581510284
|
--package kenlm.scorer --default_alpha 0.931289039105002 --default_beta 1.1834137581510284
|
||||||
|
|
||||||
|
The ``generate_scorer_package`` binary is part of the released ``native_client.tar.xz``. If for some reason you need to rebuild it,
|
||||||
|
please refer to how to :ref:`build-generate-scorer-package`.
|
||||||
|
|
||||||
Building your own scorer
|
Building your own scorer
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
|
@ -124,7 +124,7 @@ It will also add the following ``.csv`` files:
|
|||||||
* ``clips/dev.csv``
|
* ``clips/dev.csv``
|
||||||
* ``clips/test.csv``
|
* ``clips/test.csv``
|
||||||
|
|
||||||
All entries in these CSV files refer to their samples by absolute paths. So moving this sub-directory would require another import or tweaking the CSV files accordingly.
|
Entries in CSV files can refer to samples by their absolute or relative paths. Here, the importer produces relative paths.
|
||||||
|
|
||||||
To use Common Voice data during training, validation and testing, you pass (comma separated combinations of) their filenames into ``--train_files``\ , ``--dev_files``\ , ``--test_files`` parameters of ``DeepSpeech.py``.
|
To use Common Voice data during training, validation and testing, you pass (comma separated combinations of) their filenames into ``--train_files``\ , ``--dev_files``\ , ``--test_files`` parameters of ``DeepSpeech.py``.
|
||||||
|
|
||||||
@ -287,6 +287,8 @@ UTF-8 mode
|
|||||||
DeepSpeech includes a UTF-8 operating mode which can be useful to model languages with very large alphabets, such as Chinese Mandarin. For details on how it works and how to use it, see :ref:`decoder-docs`.
|
DeepSpeech includes a UTF-8 operating mode which can be useful to model languages with very large alphabets, such as Chinese Mandarin. For details on how it works and how to use it, see :ref:`decoder-docs`.
|
||||||
|
|
||||||
|
|
||||||
|
.. _training-data-augmentation:
|
||||||
|
|
||||||
Augmentation
|
Augmentation
|
||||||
^^^^^^^^^^^^
|
^^^^^^^^^^^^
|
||||||
|
|
||||||
@ -496,7 +498,7 @@ Example training with all augmentations:
|
|||||||
[...]
|
[...]
|
||||||
|
|
||||||
|
|
||||||
The ``bin/play.py`` tool also supports ``--augment`` parameters (for sample domain augmentations) and can be used for experimenting with different configurations.
|
The ``bin/play.py`` and ``bin/data_set_tool.py`` tools also support ``--augment`` parameters (for sample domain augmentations) and can be used for experimenting with different configurations or creating augmented data sets.
|
||||||
|
|
||||||
Example of playing all samples with reverberation and maximized volume:
|
Example of playing all samples with reverberation and maximized volume:
|
||||||
|
|
||||||
@ -510,3 +512,12 @@ Example simulation of the codec augmentation of a wav-file first at the beginnin
|
|||||||
|
|
||||||
bin/play.py --augment codec[p=0.1,bitrate=48000:16000] --clock 0.0 test.wav
|
bin/play.py --augment codec[p=0.1,bitrate=48000:16000] --clock 0.0 test.wav
|
||||||
bin/play.py --augment codec[p=0.1,bitrate=48000:16000] --clock 1.0 test.wav
|
bin/play.py --augment codec[p=0.1,bitrate=48000:16000] --clock 1.0 test.wav
|
||||||
|
|
||||||
|
Example of creating a pre-augmented test set:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
bin/data_set_tool.py \
|
||||||
|
--augment overlay[source=noise.sdb,layers=1,snr=20~10] \
|
||||||
|
--augment resample[rate=12000:8000~4000] \
|
||||||
|
test.sdb test-augmented.sdb
|
||||||
|
@ -130,6 +130,7 @@ tf_cc_shared_object(
|
|||||||
}) + tflite_copts(),
|
}) + tflite_copts(),
|
||||||
linkopts = select({
|
linkopts = select({
|
||||||
"//tensorflow:macos": [],
|
"//tensorflow:macos": [],
|
||||||
|
"//tensorflow:ios": ["-fembed-bitcode"],
|
||||||
"//tensorflow:linux_x86_64": LINUX_LINKOPTS,
|
"//tensorflow:linux_x86_64": LINUX_LINKOPTS,
|
||||||
"//tensorflow:rpi3": LINUX_LINKOPTS,
|
"//tensorflow:rpi3": LINUX_LINKOPTS,
|
||||||
"//tensorflow:rpi3-armv8": LINUX_LINKOPTS,
|
"//tensorflow:rpi3-armv8": LINUX_LINKOPTS,
|
||||||
|
@ -12,7 +12,11 @@
|
|||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#if defined(__ANDROID__) || defined(_MSC_VER)
|
#ifdef __APPLE__
|
||||||
|
#include <TargetConditionals.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__ANDROID__) || defined(_MSC_VER) || TARGET_OS_IPHONE
|
||||||
#define NO_SOX
|
#define NO_SOX
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -244,7 +248,7 @@ GetAudioBuffer(const char* path, int desired_sample_rate)
|
|||||||
sox_false // Reverse endianness
|
sox_false // Reverse endianness
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#if TARGET_OS_OSX
|
||||||
// It would be preferable to use sox_open_memstream_write here, but OS-X
|
// It would be preferable to use sox_open_memstream_write here, but OS-X
|
||||||
// doesn't support POSIX 2008, which it requires. See Issue #461.
|
// doesn't support POSIX 2008, which it requires. See Issue #461.
|
||||||
// Instead, we write to a temporary file.
|
// Instead, we write to a temporary file.
|
||||||
@ -348,7 +352,7 @@ GetAudioBuffer(const char* path, int desired_sample_rate)
|
|||||||
fclose(wave);
|
fclose(wave);
|
||||||
#endif // NO_SOX
|
#endif // NO_SOX
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#if TARGET_OS_OSX
|
||||||
res.buffer_size = (size_t)(output->olength * 2);
|
res.buffer_size = (size_t)(output->olength * 2);
|
||||||
res.buffer = (char*)malloc(sizeof(char) * res.buffer_size);
|
res.buffer = (char*)malloc(sizeof(char) * res.buffer_size);
|
||||||
FILE* output_file = fopen(output_name, "rb");
|
FILE* output_file = fopen(output_name, "rb");
|
||||||
|
@ -48,15 +48,33 @@ class Alphabet(swigwrapper.Alphabet):
|
|||||||
raise ValueError('Alphabet initialization failed with error code 0x{:X}'.format(err))
|
raise ValueError('Alphabet initialization failed with error code 0x{:X}'.format(err))
|
||||||
|
|
||||||
def CanEncodeSingle(self, input):
|
def CanEncodeSingle(self, input):
|
||||||
|
'''
|
||||||
|
Returns true if the single character/output class has a corresponding label
|
||||||
|
in the alphabet.
|
||||||
|
'''
|
||||||
return super(Alphabet, self).CanEncodeSingle(input.encode('utf-8'))
|
return super(Alphabet, self).CanEncodeSingle(input.encode('utf-8'))
|
||||||
|
|
||||||
def CanEncode(self, input):
|
def CanEncode(self, input):
|
||||||
|
'''
|
||||||
|
Returns true if the entire string can be encoded into labels in this
|
||||||
|
alphabet.
|
||||||
|
'''
|
||||||
return super(Alphabet, self).CanEncode(input.encode('utf-8'))
|
return super(Alphabet, self).CanEncode(input.encode('utf-8'))
|
||||||
|
|
||||||
def EncodeSingle(self, input):
|
def EncodeSingle(self, input):
|
||||||
|
'''
|
||||||
|
Encode a single character/output class into a label. Character must be in
|
||||||
|
the alphabet, this method will assert that. Use `CanEncodeSingle` to test.
|
||||||
|
'''
|
||||||
return super(Alphabet, self).EncodeSingle(input.encode('utf-8'))
|
return super(Alphabet, self).EncodeSingle(input.encode('utf-8'))
|
||||||
|
|
||||||
def Encode(self, input):
|
def Encode(self, input):
|
||||||
|
'''
|
||||||
|
Encode a sequence of character/output classes into a sequence of labels.
|
||||||
|
Characters are assumed to always take a single Unicode codepoint.
|
||||||
|
Characters must be in the alphabet, this method will assert that. Use
|
||||||
|
`CanEncode` and `CanEncodeSingle` to test.
|
||||||
|
'''
|
||||||
# Convert SWIG's UnsignedIntVec to a Python list
|
# Convert SWIG's UnsignedIntVec to a Python list
|
||||||
res = super(Alphabet, self).Encode(input.encode('utf-8'))
|
res = super(Alphabet, self).Encode(input.encode('utf-8'))
|
||||||
return [el for el in res]
|
return [el for el in res]
|
||||||
@ -66,6 +84,7 @@ class Alphabet(swigwrapper.Alphabet):
|
|||||||
return res.decode('utf-8')
|
return res.decode('utf-8')
|
||||||
|
|
||||||
def Decode(self, input):
|
def Decode(self, input):
|
||||||
|
'''Decode a sequence of labels into a string.'''
|
||||||
res = super(Alphabet, self).Decode(input)
|
res = super(Alphabet, self).Decode(input)
|
||||||
return res.decode('utf-8')
|
return res.decode('utf-8')
|
||||||
|
|
||||||
|
@ -101,6 +101,20 @@ NODE_PLATFORM_TARGET := --target_arch=arm64 --target_platform=linux
|
|||||||
TOOLCHAIN_LDD_OPTS := --root $(RASPBIAN)/
|
TOOLCHAIN_LDD_OPTS := --root $(RASPBIAN)/
|
||||||
endif # ($(TARGET),rpi3-armv8)
|
endif # ($(TARGET),rpi3-armv8)
|
||||||
|
|
||||||
|
ifeq ($(TARGET),ios-simulator)
|
||||||
|
CFLAGS := -isysroot $(shell xcrun -sdk iphonesimulator13.5 -show-sdk-path)
|
||||||
|
SOX_CFLAGS :=
|
||||||
|
SOX_LDFLAGS :=
|
||||||
|
LDFLAGS :=
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(TARGET),ios-arm64)
|
||||||
|
CFLAGS := -target arm64-apple-ios -isysroot $(shell xcrun -sdk iphoneos13.5 -show-sdk-path)
|
||||||
|
SOX_CFLAGS :=
|
||||||
|
SOX_LDFLAGS :=
|
||||||
|
LDFLAGS :=
|
||||||
|
endif
|
||||||
|
|
||||||
# -Wl,--no-as-needed is required to force linker not to evict libs it thinks we
|
# -Wl,--no-as-needed is required to force linker not to evict libs it thinks we
|
||||||
# dont need ; will fail the build on OSX because that option does not exists
|
# dont need ; will fail the build on OSX because that option does not exists
|
||||||
ifeq ($(OS),Linux)
|
ifeq ($(OS),Linux)
|
||||||
@ -108,9 +122,13 @@ LDFLAGS_NEEDED := -Wl,--no-as-needed
|
|||||||
LDFLAGS_RPATH := -Wl,-rpath,\$$ORIGIN
|
LDFLAGS_RPATH := -Wl,-rpath,\$$ORIGIN
|
||||||
endif
|
endif
|
||||||
ifeq ($(OS),Darwin)
|
ifeq ($(OS),Darwin)
|
||||||
CXXFLAGS += -stdlib=libc++ -mmacosx-version-min=10.10
|
CXXFLAGS += -stdlib=libc++
|
||||||
LDFLAGS_NEEDED := -stdlib=libc++ -mmacosx-version-min=10.10
|
LDFLAGS_NEEDED := -stdlib=libc++
|
||||||
LDFLAGS_RPATH := -Wl,-rpath,@executable_path
|
LDFLAGS_RPATH := -Wl,-rpath,@executable_path
|
||||||
|
ifeq ($(TARGET),host)
|
||||||
|
CXXFLAGS += -mmacosx-version-min=10.10
|
||||||
|
LDFLAGS_NEEDED += -mmacosx-version-min=10.10
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CFLAGS += $(EXTRA_CFLAGS)
|
CFLAGS += $(EXTRA_CFLAGS)
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio 15
|
# Visual Studio Version 16
|
||||||
VisualStudioVersion = 15.0.28307.136
|
VisualStudioVersion = 16.0.30204.135
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DeepSpeechClient", "DeepSpeechClient\DeepSpeechClient.csproj", "{56DE4091-BBBE-47E4-852D-7268B33B971F}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DeepSpeechClient", "DeepSpeechClient\DeepSpeechClient.csproj", "{56DE4091-BBBE-47E4-852D-7268B33B971F}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DeepSpeechConsole", "DeepSpeechConsole\DeepSpeechConsole.csproj", "{312965E5-C4F6-4D95-BA64-79906B8BC7AC}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DeepSpeechConsole", "DeepSpeechConsole\DeepSpeechConsole.csproj", "{312965E5-C4F6-4D95-BA64-79906B8BC7AC}"
|
||||||
EndProject
|
EndProject
|
||||||
|
@ -1,63 +1,42 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
<OutputType>Library</OutputType>
|
||||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
<TargetFrameworks>net452;net46;net47;uap10.0</TargetFrameworks>
|
||||||
<ProjectGuid>{56DE4091-BBBE-47E4-852D-7268B33B971F}</ProjectGuid>
|
<Platforms>x64</Platforms>
|
||||||
<OutputType>Library</OutputType>
|
|
||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
|
||||||
<RootNamespace>DeepSpeechClient</RootNamespace>
|
|
||||||
<AssemblyName>DeepSpeechClient</AssemblyName>
|
|
||||||
<TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
|
|
||||||
<FileAlignment>512</FileAlignment>
|
|
||||||
<Deterministic>true</Deterministic>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x86'">
|
||||||
<DebugSymbols>true</DebugSymbols>
|
|
||||||
<OutputPath>bin\x64\Debug\</OutputPath>
|
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
|
||||||
<DebugType>full</DebugType>
|
|
||||||
<PlatformTarget>x64</PlatformTarget>
|
<PlatformTarget>x64</PlatformTarget>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<OutputPath>bin\x64\Release\</OutputPath>
|
|
||||||
<DefineConstants>TRACE</DefineConstants>
|
|
||||||
<Optimize>true</Optimize>
|
|
||||||
<DebugType>pdbonly</DebugType>
|
|
||||||
<PlatformTarget>x64</PlatformTarget>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<Reference Include="System" />
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
<Reference Include="System.Core" />
|
<PlatformTarget>x64</PlatformTarget>
|
||||||
<Reference Include="System.Xml.Linq" />
|
</PropertyGroup>
|
||||||
<Reference Include="System.Data.DataSetExtensions" />
|
|
||||||
<Reference Include="Microsoft.CSharp" />
|
<PropertyGroup Condition="'$(TargetFramework)' == 'uap10.0'">
|
||||||
<Reference Include="System.Data" />
|
<CopyLocalLockFileAssemblies>false</CopyLocalLockFileAssemblies>
|
||||||
<Reference Include="System.Net.Http" />
|
<NugetTargetMoniker>UAP,Version=v10.0</NugetTargetMoniker>
|
||||||
<Reference Include="System.Xml" />
|
<TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>
|
||||||
|
<TargetPlatformVersion>10.0.19041.0</TargetPlatformVersion>
|
||||||
|
<TargetPlatformMinVersion>10.0.10240.0</TargetPlatformMinVersion>
|
||||||
|
<TargetFrameworkIdentifier>.NETCore</TargetFrameworkIdentifier>
|
||||||
|
<TargetFrameworkVersion>v5.0</TargetFrameworkVersion>
|
||||||
|
<DefineConstants>$(DefineConstants);WINDOWS_UWP</DefineConstants>
|
||||||
|
<LanguageTargets>$(MSBuildExtensionsPath)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.CSharp.targets</LanguageTargets>
|
||||||
|
<ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>None</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup Condition=" '$(TargetFramework)' == 'uap10.0' ">
|
||||||
|
<PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform " Version="5.2.2" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="DeepSpeech.cs" />
|
<Folder Include="Properties\" />
|
||||||
<Compile Include="Enums\ErrorCodes.cs" />
|
|
||||||
<Compile Include="Interfaces\IDeepSpeech.cs" />
|
|
||||||
<Compile Include="Extensions\NativeExtensions.cs" />
|
|
||||||
<Compile Include="Models\DeepSpeechStream.cs" />
|
|
||||||
<Compile Include="Models\Metadata.cs" />
|
|
||||||
<Compile Include="Models\CandidateTranscript.cs" />
|
|
||||||
<Compile Include="Models\TokenMetadata.cs" />
|
|
||||||
<Compile Include="NativeImp.cs" />
|
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
|
||||||
<Compile Include="Structs\Metadata.cs" />
|
|
||||||
<Compile Include="Structs\CandidateTranscript.cs" />
|
|
||||||
<Compile Include="Structs\TokenMetadata.cs" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup />
|
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
|
||||||
|
<PropertyGroup Condition=" '$(TargetFramework)' == 'uap10.0' ">
|
||||||
|
<DefineConstants>$(DefineConstants);NO_HTTPS</DefineConstants>
|
||||||
|
</PropertyGroup>
|
||||||
</Project>
|
</Project>
|
@ -1,36 +0,0 @@
|
|||||||
using System.Reflection;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
|
|
||||||
// General Information about an assembly is controlled through the following
|
|
||||||
// set of attributes. Change these attribute values to modify the information
|
|
||||||
// associated with an assembly.
|
|
||||||
[assembly: AssemblyTitle("DeepSpeechClient")]
|
|
||||||
[assembly: AssemblyDescription("")]
|
|
||||||
[assembly: AssemblyConfiguration("")]
|
|
||||||
[assembly: AssemblyCompany("")]
|
|
||||||
[assembly: AssemblyProduct("DeepSpeechClient")]
|
|
||||||
[assembly: AssemblyCopyright("Copyright © 2018")]
|
|
||||||
[assembly: AssemblyTrademark("")]
|
|
||||||
[assembly: AssemblyCulture("")]
|
|
||||||
|
|
||||||
// Setting ComVisible to false makes the types in this assembly not visible
|
|
||||||
// to COM components. If you need to access a type in this assembly from
|
|
||||||
// COM, set the ComVisible attribute to true on that type.
|
|
||||||
[assembly: ComVisible(false)]
|
|
||||||
|
|
||||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
|
||||||
[assembly: Guid("56de4091-bbbe-47e4-852d-7268b33b971f")]
|
|
||||||
|
|
||||||
// Version information for an assembly consists of the following four values:
|
|
||||||
//
|
|
||||||
// Major Version
|
|
||||||
// Minor Version
|
|
||||||
// Build Number
|
|
||||||
// Revision
|
|
||||||
//
|
|
||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
|
||||||
// by using the '*' as shown below:
|
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
|
||||||
[assembly: AssemblyVersion("1.0.0.0")]
|
|
||||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
|
4
native_client/swift/.gitignore
vendored
Normal file
4
native_client/swift/.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
.DS_Store
|
||||||
|
build/
|
||||||
|
xcuserdata/
|
||||||
|
/deepspeech_ios/libdeepspeech.dylib
|
499
native_client/swift/deepspeech_ios.xcodeproj/project.pbxproj
Normal file
499
native_client/swift/deepspeech_ios.xcodeproj/project.pbxproj
Normal file
@ -0,0 +1,499 @@
|
|||||||
|
// !$*UTF8*$!
|
||||||
|
{
|
||||||
|
archiveVersion = 1;
|
||||||
|
classes = {
|
||||||
|
};
|
||||||
|
objectVersion = 50;
|
||||||
|
objects = {
|
||||||
|
|
||||||
|
/* Begin PBXBuildFile section */
|
||||||
|
505B136B24960D550007DADA /* deepspeech_ios.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 505B136124960D550007DADA /* deepspeech_ios.framework */; };
|
||||||
|
505B137224960D550007DADA /* deepspeech_ios.h in Headers */ = {isa = PBXBuildFile; fileRef = 505B136424960D550007DADA /* deepspeech_ios.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
|
505B137D24961AF20007DADA /* deepspeech.h in Headers */ = {isa = PBXBuildFile; fileRef = 505B137C24961AF20007DADA /* deepspeech.h */; settings = {ATTRIBUTES = (Private, ); }; };
|
||||||
|
505B137F24961BA70007DADA /* DeepSpeech.swift in Sources */ = {isa = PBXBuildFile; fileRef = 505B137E24961BA70007DADA /* DeepSpeech.swift */; };
|
||||||
|
507CD39B24B61FA100409BBB /* libdeepspeech.so in Frameworks */ = {isa = PBXBuildFile; fileRef = 507CD39A24B61FA100409BBB /* libdeepspeech.so */; };
|
||||||
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
|
/* Begin PBXContainerItemProxy section */
|
||||||
|
505B136C24960D550007DADA /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = 505B135824960D550007DADA /* Project object */;
|
||||||
|
proxyType = 1;
|
||||||
|
remoteGlobalIDString = 505B136024960D550007DADA;
|
||||||
|
remoteInfo = deepspeech_ios;
|
||||||
|
};
|
||||||
|
/* End PBXContainerItemProxy section */
|
||||||
|
|
||||||
|
/* Begin PBXCopyFilesBuildPhase section */
|
||||||
|
505B138A249628290007DADA /* Embed Libraries */ = {
|
||||||
|
isa = PBXCopyFilesBuildPhase;
|
||||||
|
buildActionMask = 12;
|
||||||
|
dstPath = "";
|
||||||
|
dstSubfolderSpec = 10;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
name = "Embed Libraries";
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXCopyFilesBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXFileReference section */
|
||||||
|
505B136124960D550007DADA /* deepspeech_ios.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = deepspeech_ios.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
505B136424960D550007DADA /* deepspeech_ios.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = deepspeech_ios.h; sourceTree = "<group>"; };
|
||||||
|
505B136524960D550007DADA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
|
505B136A24960D550007DADA /* deepspeech_iosTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = deepspeech_iosTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
505B137B249619C90007DADA /* deepspeech_ios.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = deepspeech_ios.modulemap; sourceTree = "<group>"; };
|
||||||
|
505B137C24961AF20007DADA /* deepspeech.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = deepspeech.h; path = ../../deepspeech.h; sourceTree = "<group>"; };
|
||||||
|
505B137E24961BA70007DADA /* DeepSpeech.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeepSpeech.swift; sourceTree = "<group>"; };
|
||||||
|
507CD39A24B61FA100409BBB /* libdeepspeech.so */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libdeepspeech.so; sourceTree = "<group>"; };
|
||||||
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
|
505B135E24960D550007DADA /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
507CD39B24B61FA100409BBB /* libdeepspeech.so in Frameworks */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
505B136724960D550007DADA /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
505B136B24960D550007DADA /* deepspeech_ios.framework in Frameworks */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXFrameworksBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXGroup section */
|
||||||
|
505B135724960D550007DADA = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
505B136324960D550007DADA /* deepspeech_ios */,
|
||||||
|
505B136224960D550007DADA /* Products */,
|
||||||
|
505B1380249620C60007DADA /* Frameworks */,
|
||||||
|
);
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
505B136224960D550007DADA /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
505B136124960D550007DADA /* deepspeech_ios.framework */,
|
||||||
|
505B136A24960D550007DADA /* deepspeech_iosTests.xctest */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
505B136324960D550007DADA /* deepspeech_ios */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
505B137C24961AF20007DADA /* deepspeech.h */,
|
||||||
|
505B136424960D550007DADA /* deepspeech_ios.h */,
|
||||||
|
505B137E24961BA70007DADA /* DeepSpeech.swift */,
|
||||||
|
505B137B249619C90007DADA /* deepspeech_ios.modulemap */,
|
||||||
|
505B136524960D550007DADA /* Info.plist */,
|
||||||
|
);
|
||||||
|
path = deepspeech_ios;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
505B1380249620C60007DADA /* Frameworks */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
507CD39A24B61FA100409BBB /* libdeepspeech.so */,
|
||||||
|
);
|
||||||
|
name = Frameworks;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
/* End PBXGroup section */
|
||||||
|
|
||||||
|
/* Begin PBXHeadersBuildPhase section */
|
||||||
|
505B135C24960D550007DADA /* Headers */ = {
|
||||||
|
isa = PBXHeadersBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
505B137224960D550007DADA /* deepspeech_ios.h in Headers */,
|
||||||
|
505B137D24961AF20007DADA /* deepspeech.h in Headers */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXHeadersBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXNativeTarget section */
|
||||||
|
505B136024960D550007DADA /* deepspeech_ios */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = 505B137524960D550007DADA /* Build configuration list for PBXNativeTarget "deepspeech_ios" */;
|
||||||
|
buildPhases = (
|
||||||
|
505B135C24960D550007DADA /* Headers */,
|
||||||
|
505B135D24960D550007DADA /* Sources */,
|
||||||
|
505B135E24960D550007DADA /* Frameworks */,
|
||||||
|
505B135F24960D550007DADA /* Resources */,
|
||||||
|
505B138A249628290007DADA /* Embed Libraries */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
);
|
||||||
|
name = deepspeech_ios;
|
||||||
|
productName = deepspeech_ios;
|
||||||
|
productReference = 505B136124960D550007DADA /* deepspeech_ios.framework */;
|
||||||
|
productType = "com.apple.product-type.framework";
|
||||||
|
};
|
||||||
|
505B136924960D550007DADA /* deepspeech_iosTests */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = 505B137824960D550007DADA /* Build configuration list for PBXNativeTarget "deepspeech_iosTests" */;
|
||||||
|
buildPhases = (
|
||||||
|
505B136624960D550007DADA /* Sources */,
|
||||||
|
505B136724960D550007DADA /* Frameworks */,
|
||||||
|
505B136824960D550007DADA /* Resources */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
505B136D24960D550007DADA /* PBXTargetDependency */,
|
||||||
|
);
|
||||||
|
name = deepspeech_iosTests;
|
||||||
|
productName = deepspeech_iosTests;
|
||||||
|
productReference = 505B136A24960D550007DADA /* deepspeech_iosTests.xctest */;
|
||||||
|
productType = "com.apple.product-type.bundle.unit-test";
|
||||||
|
};
|
||||||
|
/* End PBXNativeTarget section */
|
||||||
|
|
||||||
|
/* Begin PBXProject section */
|
||||||
|
505B135824960D550007DADA /* Project object */ = {
|
||||||
|
isa = PBXProject;
|
||||||
|
attributes = {
|
||||||
|
LastSwiftUpdateCheck = 1150;
|
||||||
|
LastUpgradeCheck = 1150;
|
||||||
|
ORGANIZATIONNAME = Mozilla;
|
||||||
|
TargetAttributes = {
|
||||||
|
505B136024960D550007DADA = {
|
||||||
|
CreatedOnToolsVersion = 11.5;
|
||||||
|
LastSwiftMigration = 1150;
|
||||||
|
};
|
||||||
|
505B136924960D550007DADA = {
|
||||||
|
CreatedOnToolsVersion = 11.5;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
buildConfigurationList = 505B135B24960D550007DADA /* Build configuration list for PBXProject "deepspeech_ios" */;
|
||||||
|
compatibilityVersion = "Xcode 9.3";
|
||||||
|
developmentRegion = en;
|
||||||
|
hasScannedForEncodings = 0;
|
||||||
|
knownRegions = (
|
||||||
|
en,
|
||||||
|
Base,
|
||||||
|
);
|
||||||
|
mainGroup = 505B135724960D550007DADA;
|
||||||
|
productRefGroup = 505B136224960D550007DADA /* Products */;
|
||||||
|
projectDirPath = "";
|
||||||
|
projectRoot = "";
|
||||||
|
targets = (
|
||||||
|
505B136024960D550007DADA /* deepspeech_ios */,
|
||||||
|
505B136924960D550007DADA /* deepspeech_iosTests */,
|
||||||
|
);
|
||||||
|
};
|
||||||
|
/* End PBXProject section */
|
||||||
|
|
||||||
|
/* Begin PBXResourcesBuildPhase section */
|
||||||
|
505B135F24960D550007DADA /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
505B136824960D550007DADA /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXResourcesBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXSourcesBuildPhase section */
|
||||||
|
505B135D24960D550007DADA /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
505B137F24961BA70007DADA /* DeepSpeech.swift in Sources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
505B136624960D550007DADA /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXSourcesBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXTargetDependency section */
|
||||||
|
505B136D24960D550007DADA /* PBXTargetDependency */ = {
|
||||||
|
isa = PBXTargetDependency;
|
||||||
|
target = 505B136024960D550007DADA /* deepspeech_ios */;
|
||||||
|
targetProxy = 505B136C24960D550007DADA /* PBXContainerItemProxy */;
|
||||||
|
};
|
||||||
|
/* End PBXTargetDependency section */
|
||||||
|
|
||||||
|
/* Begin XCBuildConfiguration section */
|
||||||
|
505B137324960D550007DADA /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
||||||
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
|
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||||
|
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||||
|
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_COMMA = YES;
|
||||||
|
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||||
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
CLANG_WARN_EMPTY_BODY = YES;
|
||||||
|
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||||
|
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||||
|
CLANG_WARN_INT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||||
|
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||||
|
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||||
|
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||||
|
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||||
|
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||||
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
|
COPY_PHASE_STRIP = NO;
|
||||||
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
|
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||||
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
|
ENABLE_TESTABILITY = YES;
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||||
|
GCC_DYNAMIC_NO_PIC = NO;
|
||||||
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
|
GCC_OPTIMIZATION_LEVEL = 0;
|
||||||
|
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||||
|
"DEBUG=1",
|
||||||
|
"$(inherited)",
|
||||||
|
);
|
||||||
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||||
|
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||||
|
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||||
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 13.5;
|
||||||
|
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||||
|
MTL_FAST_MATH = YES;
|
||||||
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
|
SDKROOT = iphoneos;
|
||||||
|
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
||||||
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
|
VERSIONING_SYSTEM = "apple-generic";
|
||||||
|
VERSION_INFO_PREFIX = "";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
505B137424960D550007DADA /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
||||||
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
|
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||||
|
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||||
|
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_COMMA = YES;
|
||||||
|
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||||
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
CLANG_WARN_EMPTY_BODY = YES;
|
||||||
|
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||||
|
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||||
|
CLANG_WARN_INT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||||
|
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||||
|
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||||
|
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||||
|
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||||
|
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||||
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
|
COPY_PHASE_STRIP = NO;
|
||||||
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
|
ENABLE_NS_ASSERTIONS = NO;
|
||||||
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||||
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||||
|
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||||
|
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||||
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 13.5;
|
||||||
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
|
MTL_FAST_MATH = YES;
|
||||||
|
SDKROOT = iphoneos;
|
||||||
|
SWIFT_COMPILATION_MODE = wholemodule;
|
||||||
|
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
||||||
|
VALIDATE_PRODUCT = YES;
|
||||||
|
VERSIONING_SYSTEM = "apple-generic";
|
||||||
|
VERSION_INFO_PREFIX = "";
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
505B137624960D550007DADA /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
|
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
DEFINES_MODULE = YES;
|
||||||
|
DEVELOPMENT_TEAM = AWCG9S27P7;
|
||||||
|
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||||
|
DYLIB_CURRENT_VERSION = 1;
|
||||||
|
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||||
|
INFOPLIST_FILE = deepspeech_ios/Info.plist;
|
||||||
|
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
"@loader_path/Frameworks",
|
||||||
|
);
|
||||||
|
LIBRARY_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"$(PROJECT_DIR)/deepspeech_ios",
|
||||||
|
"$(PROJECT_DIR)",
|
||||||
|
);
|
||||||
|
MODULEMAP_FILE = deepspeech_ios/deepspeech_ios.modulemap;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "org.mozilla.deepspeech-ios";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||||
|
SKIP_INSTALL = YES;
|
||||||
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
505B137724960D550007DADA /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
|
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
DEFINES_MODULE = YES;
|
||||||
|
DEVELOPMENT_TEAM = AWCG9S27P7;
|
||||||
|
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||||
|
DYLIB_CURRENT_VERSION = 1;
|
||||||
|
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||||
|
INFOPLIST_FILE = deepspeech_ios/Info.plist;
|
||||||
|
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
"@loader_path/Frameworks",
|
||||||
|
);
|
||||||
|
LIBRARY_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"$(PROJECT_DIR)/deepspeech_ios",
|
||||||
|
"$(PROJECT_DIR)",
|
||||||
|
);
|
||||||
|
MODULEMAP_FILE = deepspeech_ios/deepspeech_ios.modulemap;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "org.mozilla.deepspeech-ios";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||||
|
SKIP_INSTALL = YES;
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
505B137924960D550007DADA /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
INFOPLIST_FILE = deepspeech_iosTests/Info.plist;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
"@loader_path/Frameworks",
|
||||||
|
);
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "org.mozilla.deepspeech-iosTests";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
505B137A24960D550007DADA /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
INFOPLIST_FILE = deepspeech_iosTests/Info.plist;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
"@loader_path/Frameworks",
|
||||||
|
);
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "org.mozilla.deepspeech-iosTests";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
/* End XCBuildConfiguration section */
|
||||||
|
|
||||||
|
/* Begin XCConfigurationList section */
|
||||||
|
505B135B24960D550007DADA /* Build configuration list for PBXProject "deepspeech_ios" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
505B137324960D550007DADA /* Debug */,
|
||||||
|
505B137424960D550007DADA /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
505B137524960D550007DADA /* Build configuration list for PBXNativeTarget "deepspeech_ios" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
505B137624960D550007DADA /* Debug */,
|
||||||
|
505B137724960D550007DADA /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
505B137824960D550007DADA /* Build configuration list for PBXNativeTarget "deepspeech_iosTests" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
505B137924960D550007DADA /* Debug */,
|
||||||
|
505B137A24960D550007DADA /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
/* End XCConfigurationList section */
|
||||||
|
};
|
||||||
|
rootObject = 505B135824960D550007DADA /* Project object */;
|
||||||
|
}
|
7
native_client/swift/deepspeech_ios.xcodeproj/project.xcworkspace/contents.xcworkspacedata
generated
Normal file
7
native_client/swift/deepspeech_ios.xcodeproj/project.xcworkspace/contents.xcworkspacedata
generated
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Workspace
|
||||||
|
version = "1.0">
|
||||||
|
<FileRef
|
||||||
|
location = "self:deepspeech_ios.xcodeproj">
|
||||||
|
</FileRef>
|
||||||
|
</Workspace>
|
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>IDEDidComputeMac32BitWarning</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
@ -0,0 +1,77 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Scheme
|
||||||
|
LastUpgradeVersion = "1150"
|
||||||
|
version = "1.3">
|
||||||
|
<BuildAction
|
||||||
|
parallelizeBuildables = "YES"
|
||||||
|
buildImplicitDependencies = "YES">
|
||||||
|
<BuildActionEntries>
|
||||||
|
<BuildActionEntry
|
||||||
|
buildForTesting = "YES"
|
||||||
|
buildForRunning = "YES"
|
||||||
|
buildForProfiling = "YES"
|
||||||
|
buildForArchiving = "YES"
|
||||||
|
buildForAnalyzing = "YES">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "505B136024960D550007DADA"
|
||||||
|
BuildableName = "deepspeech_ios.framework"
|
||||||
|
BlueprintName = "deepspeech_ios"
|
||||||
|
ReferencedContainer = "container:deepspeech_ios.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildActionEntry>
|
||||||
|
</BuildActionEntries>
|
||||||
|
</BuildAction>
|
||||||
|
<TestAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||||
|
<Testables>
|
||||||
|
<TestableReference
|
||||||
|
skipped = "NO">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "505B136924960D550007DADA"
|
||||||
|
BuildableName = "deepspeech_iosTests.xctest"
|
||||||
|
BlueprintName = "deepspeech_iosTests"
|
||||||
|
ReferencedContainer = "container:deepspeech_ios.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</TestableReference>
|
||||||
|
</Testables>
|
||||||
|
</TestAction>
|
||||||
|
<LaunchAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
launchStyle = "0"
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
ignoresPersistentStateOnLaunch = "NO"
|
||||||
|
debugDocumentVersioning = "YES"
|
||||||
|
debugServiceExtension = "internal"
|
||||||
|
allowLocationSimulation = "YES">
|
||||||
|
</LaunchAction>
|
||||||
|
<ProfileAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
savedToolIdentifier = ""
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
debugDocumentVersioning = "YES">
|
||||||
|
<MacroExpansion>
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "505B136024960D550007DADA"
|
||||||
|
BuildableName = "deepspeech_ios.framework"
|
||||||
|
BlueprintName = "deepspeech_ios"
|
||||||
|
ReferencedContainer = "container:deepspeech_ios.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</MacroExpansion>
|
||||||
|
</ProfileAction>
|
||||||
|
<AnalyzeAction
|
||||||
|
buildConfiguration = "Debug">
|
||||||
|
</AnalyzeAction>
|
||||||
|
<ArchiveAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
revealArchiveInOrganizer = "YES">
|
||||||
|
</ArchiveAction>
|
||||||
|
</Scheme>
|
10
native_client/swift/deepspeech_ios.xcworkspace/contents.xcworkspacedata
generated
Normal file
10
native_client/swift/deepspeech_ios.xcworkspace/contents.xcworkspacedata
generated
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Workspace
|
||||||
|
version = "1.0">
|
||||||
|
<FileRef
|
||||||
|
location = "group:deepspeech_ios.xcodeproj">
|
||||||
|
</FileRef>
|
||||||
|
<FileRef
|
||||||
|
location = "group:deepspeech_ios_test.xcodeproj">
|
||||||
|
</FileRef>
|
||||||
|
</Workspace>
|
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>IDEDidComputeMac32BitWarning</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>PreviewsEnabled</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
454
native_client/swift/deepspeech_ios/DeepSpeech.swift
Normal file
454
native_client/swift/deepspeech_ios/DeepSpeech.swift
Normal file
@ -0,0 +1,454 @@
|
|||||||
|
//
|
||||||
|
// DeepSpeech.swift
|
||||||
|
// deepspeech_ios
|
||||||
|
//
|
||||||
|
// Created by Reuben Morais on 14.06.20.
|
||||||
|
// Copyright © 2020 Mozilla. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import deepspeech_ios.libdeepspeech_Private
|
||||||
|
|
||||||
|
public enum DeepSpeechError: Error {
|
||||||
|
// Should be kept in sync with deepspeech.h
|
||||||
|
case noModel(errorCode: Int32)
|
||||||
|
case invalidAlphabet(errorCode: Int32)
|
||||||
|
case invalidShape(errorCode: Int32)
|
||||||
|
case invalidScorer(errorCode: Int32)
|
||||||
|
case modelIncompatible(errorCode: Int32)
|
||||||
|
case scorerNotEnabled(errorCode: Int32)
|
||||||
|
case scorerUnreadable(errorCode: Int32)
|
||||||
|
case scorerInvalidLm(errorCode: Int32)
|
||||||
|
case scorerNoTrie(errorCode: Int32)
|
||||||
|
case scorerInvalidTrie(errorCode: Int32)
|
||||||
|
case scorerVersionMismatch(errorCode: Int32)
|
||||||
|
case failInitMmap(errorCode: Int32)
|
||||||
|
case failInitSess(errorCode: Int32)
|
||||||
|
case failInterpreter(errorCode: Int32)
|
||||||
|
case failRunSess(errorCode: Int32)
|
||||||
|
case failCreateStream(errorCode: Int32)
|
||||||
|
case failReadProtobuf(errorCode: Int32)
|
||||||
|
case failCreateSess(errorCode: Int32)
|
||||||
|
case failCreateModel(errorCode: Int32)
|
||||||
|
|
||||||
|
// Additional case for invalid error codes, should never happen unless the
|
||||||
|
// user has mixed header and binary versions.
|
||||||
|
case invalidErrorCode(errorCode: Int32)
|
||||||
|
}
|
||||||
|
|
||||||
|
extension DeepSpeechError : LocalizedError {
|
||||||
|
public var errorDescription: String? {
|
||||||
|
switch self {
|
||||||
|
case .noModel(let errorCode),
|
||||||
|
.invalidAlphabet(let errorCode),
|
||||||
|
.invalidShape(let errorCode),
|
||||||
|
.invalidScorer(let errorCode),
|
||||||
|
.modelIncompatible(let errorCode),
|
||||||
|
.scorerNotEnabled(let errorCode),
|
||||||
|
.scorerUnreadable(let errorCode),
|
||||||
|
.scorerInvalidLm(let errorCode),
|
||||||
|
.scorerNoTrie(let errorCode),
|
||||||
|
.scorerInvalidTrie(let errorCode),
|
||||||
|
.scorerVersionMismatch(let errorCode),
|
||||||
|
.failInitMmap(let errorCode),
|
||||||
|
.failInitSess(let errorCode),
|
||||||
|
.failInterpreter(let errorCode),
|
||||||
|
.failRunSess(let errorCode),
|
||||||
|
.failCreateStream(let errorCode),
|
||||||
|
.failReadProtobuf(let errorCode),
|
||||||
|
.failCreateSess(let errorCode),
|
||||||
|
.failCreateModel(let errorCode),
|
||||||
|
.invalidErrorCode(let errorCode):
|
||||||
|
let result = DS_ErrorCodeToErrorMessage(errorCode)
|
||||||
|
defer { DS_FreeString(result) }
|
||||||
|
return String(cString: result!)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func errorCodeToEnum(errorCode: Int32) -> DeepSpeechError {
|
||||||
|
switch Int(errorCode) {
|
||||||
|
case Int(DS_ERR_NO_MODEL.rawValue):
|
||||||
|
return DeepSpeechError.noModel(errorCode: errorCode)
|
||||||
|
case Int(DS_ERR_INVALID_ALPHABET.rawValue):
|
||||||
|
return DeepSpeechError.invalidAlphabet(errorCode: errorCode)
|
||||||
|
case Int(DS_ERR_INVALID_SHAPE.rawValue):
|
||||||
|
return DeepSpeechError.invalidShape(errorCode: errorCode)
|
||||||
|
case Int(DS_ERR_INVALID_SCORER.rawValue):
|
||||||
|
return DeepSpeechError.invalidScorer(errorCode: errorCode)
|
||||||
|
case Int(DS_ERR_MODEL_INCOMPATIBLE.rawValue):
|
||||||
|
return DeepSpeechError.modelIncompatible(errorCode: errorCode)
|
||||||
|
case Int(DS_ERR_SCORER_NOT_ENABLED.rawValue):
|
||||||
|
return DeepSpeechError.scorerNotEnabled(errorCode: errorCode)
|
||||||
|
case Int(DS_ERR_SCORER_UNREADABLE.rawValue):
|
||||||
|
return DeepSpeechError.scorerUnreadable(errorCode: errorCode)
|
||||||
|
case Int(DS_ERR_SCORER_INVALID_LM.rawValue):
|
||||||
|
return DeepSpeechError.scorerInvalidLm(errorCode: errorCode)
|
||||||
|
case Int(DS_ERR_SCORER_NO_TRIE.rawValue):
|
||||||
|
return DeepSpeechError.scorerNoTrie(errorCode: errorCode)
|
||||||
|
case Int(DS_ERR_SCORER_INVALID_TRIE.rawValue):
|
||||||
|
return DeepSpeechError.scorerInvalidTrie(errorCode: errorCode)
|
||||||
|
case Int(DS_ERR_SCORER_VERSION_MISMATCH.rawValue):
|
||||||
|
return DeepSpeechError.scorerVersionMismatch(errorCode: errorCode)
|
||||||
|
case Int(DS_ERR_FAIL_INIT_MMAP.rawValue):
|
||||||
|
return DeepSpeechError.failInitMmap(errorCode: errorCode)
|
||||||
|
case Int(DS_ERR_FAIL_INIT_SESS.rawValue):
|
||||||
|
return DeepSpeechError.failInitSess(errorCode: errorCode)
|
||||||
|
case Int(DS_ERR_FAIL_INTERPRETER.rawValue):
|
||||||
|
return DeepSpeechError.failInterpreter(errorCode: errorCode)
|
||||||
|
case Int(DS_ERR_FAIL_RUN_SESS.rawValue):
|
||||||
|
return DeepSpeechError.failRunSess(errorCode: errorCode)
|
||||||
|
case Int(DS_ERR_FAIL_CREATE_STREAM.rawValue):
|
||||||
|
return DeepSpeechError.failCreateStream(errorCode: errorCode)
|
||||||
|
case Int(DS_ERR_FAIL_READ_PROTOBUF.rawValue):
|
||||||
|
return DeepSpeechError.failReadProtobuf(errorCode: errorCode)
|
||||||
|
case Int(DS_ERR_FAIL_CREATE_SESS.rawValue):
|
||||||
|
return DeepSpeechError.failCreateSess(errorCode: errorCode)
|
||||||
|
case Int(DS_ERR_FAIL_CREATE_MODEL.rawValue):
|
||||||
|
return DeepSpeechError.failCreateModel(errorCode: errorCode)
|
||||||
|
default:
|
||||||
|
return DeepSpeechError.invalidErrorCode(errorCode: errorCode)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func evaluateErrorCode(errorCode: Int32) throws {
|
||||||
|
if errorCode != Int32(DS_ERR_OK.rawValue) {
|
||||||
|
throw errorCodeToEnum(errorCode: errorCode)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Stores text of an individual token, along with its timing information
|
||||||
|
public struct DeepSpeechTokenMetadata {
|
||||||
|
/// The text corresponding to this token
|
||||||
|
let text: String
|
||||||
|
|
||||||
|
/// Position of the token in units of 20ms
|
||||||
|
let timestep: Int
|
||||||
|
|
||||||
|
/// Position of the token in seconds
|
||||||
|
let startTime: Float
|
||||||
|
|
||||||
|
internal init(fromInternal: TokenMetadata) {
|
||||||
|
text = String(cString: fromInternal.text)
|
||||||
|
timestep = Int(fromInternal.timestep)
|
||||||
|
startTime = fromInternal.start_time
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** A single transcript computed by the model, including a confidence value and
|
||||||
|
the metadata for its constituent tokens
|
||||||
|
*/
|
||||||
|
public struct DeepSpeechCandidateTranscript {
|
||||||
|
/// Array of DeepSpeechTokenMetadata objects
|
||||||
|
private(set) var tokens: [DeepSpeechTokenMetadata] = []
|
||||||
|
|
||||||
|
/** Approximated confidence value for this transcript. This corresponds to
|
||||||
|
both acoustic model and language model scores that contributed to the
|
||||||
|
creation of this transcript.
|
||||||
|
*/
|
||||||
|
let confidence: Double
|
||||||
|
|
||||||
|
internal init(fromInternal: CandidateTranscript) {
|
||||||
|
let tokensBuffer = UnsafeBufferPointer<TokenMetadata>(start: fromInternal.tokens, count: Int(fromInternal.num_tokens))
|
||||||
|
for tok in tokensBuffer {
|
||||||
|
tokens.append(DeepSpeechTokenMetadata(fromInternal: tok))
|
||||||
|
}
|
||||||
|
confidence = fromInternal.confidence
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// An array of DeepSpeechCandidateTranscript objects computed by the model
|
||||||
|
public struct DeepSpeechMetadata {
|
||||||
|
/// Array of DeepSpeechCandidateTranscript objects
|
||||||
|
private(set) var transcripts: [DeepSpeechCandidateTranscript] = []
|
||||||
|
|
||||||
|
internal init(fromInternal: UnsafeMutablePointer<Metadata>) {
|
||||||
|
let md = fromInternal.pointee
|
||||||
|
let transcriptsBuffer = UnsafeBufferPointer<CandidateTranscript>(
|
||||||
|
start: md.transcripts,
|
||||||
|
count: Int(md.num_transcripts))
|
||||||
|
|
||||||
|
for tr in transcriptsBuffer {
|
||||||
|
transcripts.append(DeepSpeechCandidateTranscript(fromInternal: tr))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class DeepSpeechStream {
|
||||||
|
private var streamCtx: OpaquePointer!
|
||||||
|
|
||||||
|
internal init(streamContext: OpaquePointer) {
|
||||||
|
streamCtx = streamContext
|
||||||
|
}
|
||||||
|
|
||||||
|
deinit {
|
||||||
|
if streamCtx != nil {
|
||||||
|
DS_FreeStream(streamCtx)
|
||||||
|
streamCtx = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Feed audio samples to an ongoing streaming inference.
|
||||||
|
|
||||||
|
- Parameter buffer: A 16-bit, mono raw audio signal at the appropriate
|
||||||
|
sample rate (matching what the model was trained on).
|
||||||
|
|
||||||
|
- Precondition: `finishStream()` has not been called on this stream.
|
||||||
|
*/
|
||||||
|
public func feedAudioContent(buffer: Array<Int16>) {
|
||||||
|
precondition(streamCtx != nil, "calling method on invalidated Stream")
|
||||||
|
|
||||||
|
buffer.withUnsafeBufferPointer { unsafeBufferPointer in
|
||||||
|
feedAudioContent(buffer: unsafeBufferPointer)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Feed audio samples to an ongoing streaming inference.
|
||||||
|
|
||||||
|
- Parameter buffer: A 16-bit, mono raw audio signal at the appropriate
|
||||||
|
sample rate (matching what the model was trained on).
|
||||||
|
|
||||||
|
- Precondition: `finishStream()` has not been called on this stream.
|
||||||
|
*/
|
||||||
|
public func feedAudioContent(buffer: UnsafeBufferPointer<Int16>) {
|
||||||
|
precondition(streamCtx != nil, "calling method on invalidated Stream")
|
||||||
|
|
||||||
|
DS_FeedAudioContent(streamCtx, buffer.baseAddress, UInt32(buffer.count))
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Compute the intermediate decoding of an ongoing streaming inference.
|
||||||
|
|
||||||
|
- Precondition: `finishStream()` has not been called on this stream.
|
||||||
|
|
||||||
|
- Returns: The STT intermediate result.
|
||||||
|
*/
|
||||||
|
public func intermediateDecode() -> String {
|
||||||
|
precondition(streamCtx != nil, "calling method on invalidated Stream")
|
||||||
|
|
||||||
|
let result = DS_IntermediateDecode(streamCtx)
|
||||||
|
defer { DS_FreeString(result) }
|
||||||
|
return String(cString: result!)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Compute the intermediate decoding of an ongoing streaming inference,
|
||||||
|
return results including metadata.
|
||||||
|
|
||||||
|
- Parameter numResults: The number of candidate transcripts to return.
|
||||||
|
|
||||||
|
- Precondition: `finishStream()` has not been called on this stream.
|
||||||
|
|
||||||
|
- Returns: Metadata struct containing multiple CandidateTranscript structs.
|
||||||
|
Each transcript has per-token metadata including timing information.
|
||||||
|
*/
|
||||||
|
public func intermediateDecodeWithMetadata(numResults: Int) -> DeepSpeechMetadata {
|
||||||
|
precondition(streamCtx != nil, "calling method on invalidated Stream")
|
||||||
|
let result = DS_IntermediateDecodeWithMetadata(streamCtx, UInt32(numResults))!
|
||||||
|
defer { DS_FreeMetadata(result) }
|
||||||
|
return DeepSpeechMetadata(fromInternal: result)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Compute the final decoding of an ongoing streaming inference and return
|
||||||
|
the result. Signals the end of an ongoing streaming inference.
|
||||||
|
|
||||||
|
- Precondition: `finishStream()` has not been called on this stream.
|
||||||
|
|
||||||
|
- Returns: The STT result.
|
||||||
|
|
||||||
|
- Postcondition: This method will invalidate this streaming context.
|
||||||
|
*/
|
||||||
|
public func finishStream() -> String {
|
||||||
|
precondition(streamCtx != nil, "calling method on invalidated Stream")
|
||||||
|
|
||||||
|
let result = DS_FinishStream(streamCtx)
|
||||||
|
defer {
|
||||||
|
DS_FreeString(result)
|
||||||
|
streamCtx = nil
|
||||||
|
}
|
||||||
|
return String(cString: result!)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Compute the final decoding of an ongoing streaming inference and return
|
||||||
|
results including metadata. Signals the end of an ongoing streaming
|
||||||
|
inference.
|
||||||
|
|
||||||
|
- Parameter numResults: The number of candidate transcripts to return.
|
||||||
|
|
||||||
|
- Precondition: `finishStream()` has not been called on this stream.
|
||||||
|
|
||||||
|
- Returns: Metadata struct containing multiple CandidateTranscript structs.
|
||||||
|
Each transcript has per-token metadata including timing information.
|
||||||
|
|
||||||
|
- Postcondition: This method will invalidate this streaming context.
|
||||||
|
*/
|
||||||
|
public func finishStreamWithMetadata(numResults: Int) -> DeepSpeechMetadata {
|
||||||
|
precondition(streamCtx != nil, "calling method on invalidated Stream")
|
||||||
|
|
||||||
|
let result = DS_FinishStreamWithMetadata(streamCtx, UInt32(numResults))!
|
||||||
|
defer { DS_FreeMetadata(result) }
|
||||||
|
return DeepSpeechMetadata(fromInternal: result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// An object providing an interface to a trained DeepSpeech model.
|
||||||
|
public class DeepSpeechModel {
|
||||||
|
private var modelCtx: OpaquePointer!
|
||||||
|
|
||||||
|
/**
|
||||||
|
- Parameter modelPath: The path to the model file.
|
||||||
|
|
||||||
|
- Throws: `DeepSpeechError` on failure.
|
||||||
|
*/
|
||||||
|
public init(modelPath: String) throws {
|
||||||
|
let err = DS_CreateModel(modelPath, &modelCtx)
|
||||||
|
try evaluateErrorCode(errorCode: err)
|
||||||
|
}
|
||||||
|
|
||||||
|
deinit {
|
||||||
|
DS_FreeModel(modelCtx)
|
||||||
|
modelCtx = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Get beam width value used by the model. If {@link DS_SetModelBeamWidth}
|
||||||
|
was not called before, will return the default value loaded from the
|
||||||
|
model file.
|
||||||
|
|
||||||
|
- Returns: Beam width value used by the model.
|
||||||
|
*/
|
||||||
|
public func getBeamWidth() -> Int {
|
||||||
|
return Int(DS_GetModelBeamWidth(modelCtx))
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Set beam width value used by the model.
|
||||||
|
|
||||||
|
- Parameter beamWidth: The beam width used by the model. A larger beam
|
||||||
|
width value generates better results at the cost
|
||||||
|
of decoding time.
|
||||||
|
|
||||||
|
- Throws: `DeepSpeechError` on failure.
|
||||||
|
*/
|
||||||
|
public func setBeamWidth(beamWidth: Int) throws {
|
||||||
|
let err = DS_SetModelBeamWidth(modelCtx, UInt32(beamWidth))
|
||||||
|
try evaluateErrorCode(errorCode: err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// The sample rate expected by the model.
|
||||||
|
public var sampleRate: Int {
|
||||||
|
get {
|
||||||
|
return Int(DS_GetModelSampleRate(modelCtx))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Enable decoding using an external scorer.
|
||||||
|
|
||||||
|
- Parameter scorerPath: The path to the external scorer file.
|
||||||
|
|
||||||
|
- Throws: `DeepSpeechError` on failure.
|
||||||
|
*/
|
||||||
|
public func enableExternalScorer(scorerPath: String) throws {
|
||||||
|
let err = DS_EnableExternalScorer(modelCtx, scorerPath)
|
||||||
|
try evaluateErrorCode(errorCode: err)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Disable decoding using an external scorer.
|
||||||
|
|
||||||
|
- Throws: `DeepSpeechError` on failure.
|
||||||
|
*/
|
||||||
|
public func disableExternalScorer() throws {
|
||||||
|
let err = DS_DisableExternalScorer(modelCtx)
|
||||||
|
try evaluateErrorCode(errorCode: err)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Set hyperparameters alpha and beta of the external scorer.
|
||||||
|
|
||||||
|
- Parameter alpha: The alpha hyperparameter of the decoder. Language model weight.
|
||||||
|
- Parameter beta: The beta hyperparameter of the decoder. Word insertion weight.
|
||||||
|
|
||||||
|
- Throws: `DeepSpeechError` on failure.
|
||||||
|
*/
|
||||||
|
public func setScorerAlphaBeta(alpha: Float, beta: Float) throws {
|
||||||
|
let err = DS_SetScorerAlphaBeta(modelCtx, alpha, beta)
|
||||||
|
try evaluateErrorCode(errorCode: err)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Use the DeepSpeech model to convert speech to text.
|
||||||
|
|
||||||
|
- Parameter buffer: A 16-bit, mono raw audio signal at the appropriate
|
||||||
|
sample rate (matching what the model was trained on).
|
||||||
|
|
||||||
|
- Returns: The STT result.
|
||||||
|
*/
|
||||||
|
public func speechToText(buffer: Array<Int16>) -> String {
|
||||||
|
return buffer.withUnsafeBufferPointer { unsafeBufferPointer -> String in
|
||||||
|
return speechToText(buffer: unsafeBufferPointer)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Use the DeepSpeech model to convert speech to text.
|
||||||
|
|
||||||
|
- Parameter buffer: A 16-bit, mono raw audio signal at the appropriate
|
||||||
|
sample rate (matching what the model was trained on).
|
||||||
|
|
||||||
|
- Returns: The STT result.
|
||||||
|
*/
|
||||||
|
public func speechToText(buffer: UnsafeBufferPointer<Int16>) -> String {
|
||||||
|
let result = DS_SpeechToText(modelCtx, buffer.baseAddress, UInt32(buffer.count))
|
||||||
|
defer { DS_FreeString(result) }
|
||||||
|
return String(cString: result!)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Use the DeepSpeech model to convert speech to text and output results
|
||||||
|
including metadata.
|
||||||
|
|
||||||
|
- Parameter buffer: A 16-bit, mono raw audio signal at the appropriate
|
||||||
|
sample rate (matching what the model was trained on).
|
||||||
|
- Parameter numResults: The maximum number of DeepSpeechCandidateTranscript
|
||||||
|
structs to return. Returned value might be smaller than this.
|
||||||
|
|
||||||
|
- Returns: Metadata struct containing multiple CandidateTranscript structs.
|
||||||
|
Each transcript has per-token metadata including timing information.
|
||||||
|
*/
|
||||||
|
public func speechToTextWithMetadata(buffer: Array<Int16>, numResults: Int) -> DeepSpeechMetadata {
|
||||||
|
return buffer.withUnsafeBufferPointer { unsafeBufferPointer -> DeepSpeechMetadata in
|
||||||
|
return speechToTextWithMetadata(buffer: unsafeBufferPointer, numResults: numResults)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Use the DeepSpeech model to convert speech to text and output results
|
||||||
|
including metadata.
|
||||||
|
|
||||||
|
- Parameter buffer: A 16-bit, mono raw audio signal at the appropriate
|
||||||
|
sample rate (matching what the model was trained on).
|
||||||
|
- Parameter numResults: The maximum number of DeepSpeechCandidateTranscript
|
||||||
|
structs to return. Returned value might be smaller than this.
|
||||||
|
|
||||||
|
- Returns: Metadata struct containing multiple CandidateTranscript structs.
|
||||||
|
Each transcript has per-token metadata including timing information.
|
||||||
|
*/
|
||||||
|
public func speechToTextWithMetadata(buffer: UnsafeBufferPointer<Int16>, numResults: Int) -> DeepSpeechMetadata {
|
||||||
|
let result = DS_SpeechToTextWithMetadata(
|
||||||
|
modelCtx,
|
||||||
|
buffer.baseAddress,
|
||||||
|
UInt32(buffer.count),
|
||||||
|
UInt32(numResults))!
|
||||||
|
defer { DS_FreeMetadata(result) }
|
||||||
|
return DeepSpeechMetadata(fromInternal: result)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Create a new streaming inference state.
|
||||||
|
|
||||||
|
- Returns: DeepSpeechStream object representing the streaming state.
|
||||||
|
|
||||||
|
- Throws: `DeepSpeechError` on failure.
|
||||||
|
*/
|
||||||
|
public func createStream() throws -> DeepSpeechStream {
|
||||||
|
var streamContext: OpaquePointer!
|
||||||
|
let err = DS_CreateStream(modelCtx, &streamContext)
|
||||||
|
try evaluateErrorCode(errorCode: err)
|
||||||
|
return DeepSpeechStream(streamContext: streamContext)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public func DeepSpeechVersion() -> String {
|
||||||
|
let result = DS_Version()
|
||||||
|
defer { DS_FreeString(result) }
|
||||||
|
return String(cString: result!)
|
||||||
|
}
|
22
native_client/swift/deepspeech_ios/Info.plist
Normal file
22
native_client/swift/deepspeech_ios/Info.plist
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
|
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||||
|
<key>CFBundleExecutable</key>
|
||||||
|
<string>$(EXECUTABLE_NAME)</string>
|
||||||
|
<key>CFBundleIdentifier</key>
|
||||||
|
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||||
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
|
<string>6.0</string>
|
||||||
|
<key>CFBundleName</key>
|
||||||
|
<string>$(PRODUCT_NAME)</string>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||||
|
<key>CFBundleShortVersionString</key>
|
||||||
|
<string>1.0</string>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>$(CURRENT_PROJECT_VERSION)</string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
13
native_client/swift/deepspeech_ios/deepspeech_ios.h
Normal file
13
native_client/swift/deepspeech_ios/deepspeech_ios.h
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
//
|
||||||
|
// deepspeech_ios.h
|
||||||
|
// deepspeech_ios
|
||||||
|
//
|
||||||
|
// Created by Reuben Morais on 14.06.20.
|
||||||
|
// Copyright © 2020 Mozilla. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
// In this header, you should import all the public headers of your framework using statements like #import <deepspeech_ios/PublicHeader.h>
|
||||||
|
|
||||||
|
|
12
native_client/swift/deepspeech_ios/deepspeech_ios.modulemap
Normal file
12
native_client/swift/deepspeech_ios/deepspeech_ios.modulemap
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
framework module deepspeech_ios {
|
||||||
|
umbrella header "deepspeech_ios.h"
|
||||||
|
|
||||||
|
export *
|
||||||
|
module * { export * }
|
||||||
|
|
||||||
|
explicit module libdeepspeech_Private {
|
||||||
|
header "deepspeech.h"
|
||||||
|
export *
|
||||||
|
link "deepspeech"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,637 @@
|
|||||||
|
// !$*UTF8*$!
|
||||||
|
{
|
||||||
|
archiveVersion = 1;
|
||||||
|
classes = {
|
||||||
|
};
|
||||||
|
objectVersion = 50;
|
||||||
|
objects = {
|
||||||
|
|
||||||
|
/* Begin PBXBuildFile section */
|
||||||
|
507CD3A124B61FE400409BBB /* deepspeech_ios.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 507CD3A024B61FE400409BBB /* deepspeech_ios.framework */; };
|
||||||
|
507CD3A324B61FEB00409BBB /* libdeepspeech.so in Frameworks */ = {isa = PBXBuildFile; fileRef = 507CD3A224B61FEA00409BBB /* libdeepspeech.so */; };
|
||||||
|
507CD3A424B61FFC00409BBB /* libdeepspeech.so in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 507CD3A224B61FEA00409BBB /* libdeepspeech.so */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
|
||||||
|
50F787F32497683900D52237 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F787F22497683900D52237 /* AppDelegate.swift */; };
|
||||||
|
50F787F52497683900D52237 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F787F42497683900D52237 /* SceneDelegate.swift */; };
|
||||||
|
50F787F72497683900D52237 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F787F62497683900D52237 /* ContentView.swift */; };
|
||||||
|
50F787F92497683A00D52237 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 50F787F82497683A00D52237 /* Assets.xcassets */; };
|
||||||
|
50F787FC2497683A00D52237 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 50F787FB2497683A00D52237 /* Preview Assets.xcassets */; };
|
||||||
|
50F787FF2497683A00D52237 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 50F787FD2497683A00D52237 /* LaunchScreen.storyboard */; };
|
||||||
|
50F7880A2497683A00D52237 /* deepspeech_ios_testTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F788092497683A00D52237 /* deepspeech_ios_testTests.swift */; };
|
||||||
|
50F788152497683A00D52237 /* deepspeech_ios_testUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F788142497683A00D52237 /* deepspeech_ios_testUITests.swift */; };
|
||||||
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
|
/* Begin PBXContainerItemProxy section */
|
||||||
|
50F788062497683A00D52237 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = 50F787E72497683900D52237 /* Project object */;
|
||||||
|
proxyType = 1;
|
||||||
|
remoteGlobalIDString = 50F787EE2497683900D52237;
|
||||||
|
remoteInfo = deepspeech_ios_test;
|
||||||
|
};
|
||||||
|
50F788112497683A00D52237 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = 50F787E72497683900D52237 /* Project object */;
|
||||||
|
proxyType = 1;
|
||||||
|
remoteGlobalIDString = 50F787EE2497683900D52237;
|
||||||
|
remoteInfo = deepspeech_ios_test;
|
||||||
|
};
|
||||||
|
/* End PBXContainerItemProxy section */
|
||||||
|
|
||||||
|
/* Begin PBXCopyFilesBuildPhase section */
|
||||||
|
50F2B10E2498EB59007CD876 /* Embed Frameworks */ = {
|
||||||
|
isa = PBXCopyFilesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
dstPath = "";
|
||||||
|
dstSubfolderSpec = 10;
|
||||||
|
files = (
|
||||||
|
507CD3A424B61FFC00409BBB /* libdeepspeech.so in Embed Frameworks */,
|
||||||
|
);
|
||||||
|
name = "Embed Frameworks";
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXCopyFilesBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXFileReference section */
|
||||||
|
507CD3A024B61FE400409BBB /* deepspeech_ios.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = deepspeech_ios.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
507CD3A224B61FEA00409BBB /* libdeepspeech.so */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libdeepspeech.so; path = libdeepspeech.so; sourceTree = "<group>"; };
|
||||||
|
50F787EF2497683900D52237 /* deepspeech_ios_test.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = deepspeech_ios_test.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
50F787F22497683900D52237 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||||
|
50F787F42497683900D52237 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = "<group>"; };
|
||||||
|
50F787F62497683900D52237 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
|
||||||
|
50F787F82497683A00D52237 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||||
|
50F787FB2497683A00D52237 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
|
||||||
|
50F787FE2497683A00D52237 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||||
|
50F788002497683A00D52237 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
|
50F788052497683A00D52237 /* deepspeech_ios_testTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = deepspeech_ios_testTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
50F788092497683A00D52237 /* deepspeech_ios_testTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = deepspeech_ios_testTests.swift; sourceTree = "<group>"; };
|
||||||
|
50F7880B2497683A00D52237 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
|
50F788102497683A00D52237 /* deepspeech_ios_testUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = deepspeech_ios_testUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
50F788142497683A00D52237 /* deepspeech_ios_testUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = deepspeech_ios_testUITests.swift; sourceTree = "<group>"; };
|
||||||
|
50F788162497683A00D52237 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
|
50F787EC2497683900D52237 /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
507CD3A324B61FEB00409BBB /* libdeepspeech.so in Frameworks */,
|
||||||
|
507CD3A124B61FE400409BBB /* deepspeech_ios.framework in Frameworks */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
50F788022497683A00D52237 /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
50F7880D2497683A00D52237 /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXFrameworksBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXGroup section */
|
||||||
|
50F2B0FC2498D6C7007CD876 /* Frameworks */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
507CD3A224B61FEA00409BBB /* libdeepspeech.so */,
|
||||||
|
507CD3A024B61FE400409BBB /* deepspeech_ios.framework */,
|
||||||
|
);
|
||||||
|
name = Frameworks;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
50F787E62497683900D52237 = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
50F787F12497683900D52237 /* deepspeech_ios_test */,
|
||||||
|
50F788082497683A00D52237 /* deepspeech_ios_testTests */,
|
||||||
|
50F788132497683A00D52237 /* deepspeech_ios_testUITests */,
|
||||||
|
50F787F02497683900D52237 /* Products */,
|
||||||
|
50F2B0FC2498D6C7007CD876 /* Frameworks */,
|
||||||
|
);
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
50F787F02497683900D52237 /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
50F787EF2497683900D52237 /* deepspeech_ios_test.app */,
|
||||||
|
50F788052497683A00D52237 /* deepspeech_ios_testTests.xctest */,
|
||||||
|
50F788102497683A00D52237 /* deepspeech_ios_testUITests.xctest */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
50F787F12497683900D52237 /* deepspeech_ios_test */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
50F787F22497683900D52237 /* AppDelegate.swift */,
|
||||||
|
50F787F42497683900D52237 /* SceneDelegate.swift */,
|
||||||
|
50F787F62497683900D52237 /* ContentView.swift */,
|
||||||
|
50F787F82497683A00D52237 /* Assets.xcassets */,
|
||||||
|
50F787FD2497683A00D52237 /* LaunchScreen.storyboard */,
|
||||||
|
50F788002497683A00D52237 /* Info.plist */,
|
||||||
|
50F787FA2497683A00D52237 /* Preview Content */,
|
||||||
|
);
|
||||||
|
path = deepspeech_ios_test;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
50F787FA2497683A00D52237 /* Preview Content */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
50F787FB2497683A00D52237 /* Preview Assets.xcassets */,
|
||||||
|
);
|
||||||
|
path = "Preview Content";
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
50F788082497683A00D52237 /* deepspeech_ios_testTests */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
50F788092497683A00D52237 /* deepspeech_ios_testTests.swift */,
|
||||||
|
50F7880B2497683A00D52237 /* Info.plist */,
|
||||||
|
);
|
||||||
|
path = deepspeech_ios_testTests;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
50F788132497683A00D52237 /* deepspeech_ios_testUITests */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
50F788142497683A00D52237 /* deepspeech_ios_testUITests.swift */,
|
||||||
|
50F788162497683A00D52237 /* Info.plist */,
|
||||||
|
);
|
||||||
|
path = deepspeech_ios_testUITests;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
/* End PBXGroup section */
|
||||||
|
|
||||||
|
/* Begin PBXNativeTarget section */
|
||||||
|
50F787EE2497683900D52237 /* deepspeech_ios_test */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = 50F788192497683A00D52237 /* Build configuration list for PBXNativeTarget "deepspeech_ios_test" */;
|
||||||
|
buildPhases = (
|
||||||
|
50F787EB2497683900D52237 /* Sources */,
|
||||||
|
50F787EC2497683900D52237 /* Frameworks */,
|
||||||
|
50F787ED2497683900D52237 /* Resources */,
|
||||||
|
50F2B10E2498EB59007CD876 /* Embed Frameworks */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
);
|
||||||
|
name = deepspeech_ios_test;
|
||||||
|
productName = deepspeech_ios_test;
|
||||||
|
productReference = 50F787EF2497683900D52237 /* deepspeech_ios_test.app */;
|
||||||
|
productType = "com.apple.product-type.application";
|
||||||
|
};
|
||||||
|
50F788042497683A00D52237 /* deepspeech_ios_testTests */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = 50F7881C2497683A00D52237 /* Build configuration list for PBXNativeTarget "deepspeech_ios_testTests" */;
|
||||||
|
buildPhases = (
|
||||||
|
50F788012497683A00D52237 /* Sources */,
|
||||||
|
50F788022497683A00D52237 /* Frameworks */,
|
||||||
|
50F788032497683A00D52237 /* Resources */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
50F788072497683A00D52237 /* PBXTargetDependency */,
|
||||||
|
);
|
||||||
|
name = deepspeech_ios_testTests;
|
||||||
|
productName = deepspeech_ios_testTests;
|
||||||
|
productReference = 50F788052497683A00D52237 /* deepspeech_ios_testTests.xctest */;
|
||||||
|
productType = "com.apple.product-type.bundle.unit-test";
|
||||||
|
};
|
||||||
|
50F7880F2497683A00D52237 /* deepspeech_ios_testUITests */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = 50F7881F2497683A00D52237 /* Build configuration list for PBXNativeTarget "deepspeech_ios_testUITests" */;
|
||||||
|
buildPhases = (
|
||||||
|
50F7880C2497683A00D52237 /* Sources */,
|
||||||
|
50F7880D2497683A00D52237 /* Frameworks */,
|
||||||
|
50F7880E2497683A00D52237 /* Resources */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
50F788122497683A00D52237 /* PBXTargetDependency */,
|
||||||
|
);
|
||||||
|
name = deepspeech_ios_testUITests;
|
||||||
|
productName = deepspeech_ios_testUITests;
|
||||||
|
productReference = 50F788102497683A00D52237 /* deepspeech_ios_testUITests.xctest */;
|
||||||
|
productType = "com.apple.product-type.bundle.ui-testing";
|
||||||
|
};
|
||||||
|
/* End PBXNativeTarget section */
|
||||||
|
|
||||||
|
/* Begin PBXProject section */
|
||||||
|
50F787E72497683900D52237 /* Project object */ = {
|
||||||
|
isa = PBXProject;
|
||||||
|
attributes = {
|
||||||
|
LastSwiftUpdateCheck = 1150;
|
||||||
|
LastUpgradeCheck = 1150;
|
||||||
|
ORGANIZATIONNAME = Mozilla;
|
||||||
|
TargetAttributes = {
|
||||||
|
50F787EE2497683900D52237 = {
|
||||||
|
CreatedOnToolsVersion = 11.5;
|
||||||
|
};
|
||||||
|
50F788042497683A00D52237 = {
|
||||||
|
CreatedOnToolsVersion = 11.5;
|
||||||
|
TestTargetID = 50F787EE2497683900D52237;
|
||||||
|
};
|
||||||
|
50F7880F2497683A00D52237 = {
|
||||||
|
CreatedOnToolsVersion = 11.5;
|
||||||
|
TestTargetID = 50F787EE2497683900D52237;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
buildConfigurationList = 50F787EA2497683900D52237 /* Build configuration list for PBXProject "deepspeech_ios_test" */;
|
||||||
|
compatibilityVersion = "Xcode 9.3";
|
||||||
|
developmentRegion = en;
|
||||||
|
hasScannedForEncodings = 0;
|
||||||
|
knownRegions = (
|
||||||
|
en,
|
||||||
|
Base,
|
||||||
|
);
|
||||||
|
mainGroup = 50F787E62497683900D52237;
|
||||||
|
productRefGroup = 50F787F02497683900D52237 /* Products */;
|
||||||
|
projectDirPath = "";
|
||||||
|
projectRoot = "";
|
||||||
|
targets = (
|
||||||
|
50F787EE2497683900D52237 /* deepspeech_ios_test */,
|
||||||
|
50F788042497683A00D52237 /* deepspeech_ios_testTests */,
|
||||||
|
50F7880F2497683A00D52237 /* deepspeech_ios_testUITests */,
|
||||||
|
);
|
||||||
|
};
|
||||||
|
/* End PBXProject section */
|
||||||
|
|
||||||
|
/* Begin PBXResourcesBuildPhase section */
|
||||||
|
50F787ED2497683900D52237 /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
50F787FF2497683A00D52237 /* LaunchScreen.storyboard in Resources */,
|
||||||
|
50F787FC2497683A00D52237 /* Preview Assets.xcassets in Resources */,
|
||||||
|
50F787F92497683A00D52237 /* Assets.xcassets in Resources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
50F788032497683A00D52237 /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
50F7880E2497683A00D52237 /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXResourcesBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXSourcesBuildPhase section */
|
||||||
|
50F787EB2497683900D52237 /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
50F787F32497683900D52237 /* AppDelegate.swift in Sources */,
|
||||||
|
50F787F52497683900D52237 /* SceneDelegate.swift in Sources */,
|
||||||
|
50F787F72497683900D52237 /* ContentView.swift in Sources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
50F788012497683A00D52237 /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
50F7880A2497683A00D52237 /* deepspeech_ios_testTests.swift in Sources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
50F7880C2497683A00D52237 /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
50F788152497683A00D52237 /* deepspeech_ios_testUITests.swift in Sources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXSourcesBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXTargetDependency section */
|
||||||
|
50F788072497683A00D52237 /* PBXTargetDependency */ = {
|
||||||
|
isa = PBXTargetDependency;
|
||||||
|
target = 50F787EE2497683900D52237 /* deepspeech_ios_test */;
|
||||||
|
targetProxy = 50F788062497683A00D52237 /* PBXContainerItemProxy */;
|
||||||
|
};
|
||||||
|
50F788122497683A00D52237 /* PBXTargetDependency */ = {
|
||||||
|
isa = PBXTargetDependency;
|
||||||
|
target = 50F787EE2497683900D52237 /* deepspeech_ios_test */;
|
||||||
|
targetProxy = 50F788112497683A00D52237 /* PBXContainerItemProxy */;
|
||||||
|
};
|
||||||
|
/* End PBXTargetDependency section */
|
||||||
|
|
||||||
|
/* Begin PBXVariantGroup section */
|
||||||
|
50F787FD2497683A00D52237 /* LaunchScreen.storyboard */ = {
|
||||||
|
isa = PBXVariantGroup;
|
||||||
|
children = (
|
||||||
|
50F787FE2497683A00D52237 /* Base */,
|
||||||
|
);
|
||||||
|
name = LaunchScreen.storyboard;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
/* End PBXVariantGroup section */
|
||||||
|
|
||||||
|
/* Begin XCBuildConfiguration section */
|
||||||
|
50F788172497683A00D52237 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
||||||
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
|
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||||
|
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||||
|
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_COMMA = YES;
|
||||||
|
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||||
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
CLANG_WARN_EMPTY_BODY = YES;
|
||||||
|
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||||
|
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||||
|
CLANG_WARN_INT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||||
|
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||||
|
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||||
|
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||||
|
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||||
|
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||||
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
|
COPY_PHASE_STRIP = NO;
|
||||||
|
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||||
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
|
ENABLE_TESTABILITY = YES;
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||||
|
GCC_DYNAMIC_NO_PIC = NO;
|
||||||
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
|
GCC_OPTIMIZATION_LEVEL = 0;
|
||||||
|
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||||
|
"DEBUG=1",
|
||||||
|
"$(inherited)",
|
||||||
|
);
|
||||||
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||||
|
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||||
|
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||||
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 13.5;
|
||||||
|
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||||
|
MTL_FAST_MATH = YES;
|
||||||
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
|
SDKROOT = iphoneos;
|
||||||
|
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
||||||
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
50F788182497683A00D52237 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
||||||
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
|
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||||
|
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||||
|
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_COMMA = YES;
|
||||||
|
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||||
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
CLANG_WARN_EMPTY_BODY = YES;
|
||||||
|
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||||
|
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||||
|
CLANG_WARN_INT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||||
|
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||||
|
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||||
|
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||||
|
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||||
|
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||||
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
|
COPY_PHASE_STRIP = NO;
|
||||||
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
|
ENABLE_NS_ASSERTIONS = NO;
|
||||||
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||||
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||||
|
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||||
|
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||||
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 13.5;
|
||||||
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
|
MTL_FAST_MATH = YES;
|
||||||
|
SDKROOT = iphoneos;
|
||||||
|
SWIFT_COMPILATION_MODE = wholemodule;
|
||||||
|
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
||||||
|
VALIDATE_PRODUCT = YES;
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
50F7881A2497683A00D52237 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
DEVELOPMENT_ASSET_PATHS = "\"deepspeech_ios_test/Preview Content\"";
|
||||||
|
DEVELOPMENT_TEAM = AWCG9S27P7;
|
||||||
|
ENABLE_PREVIEWS = YES;
|
||||||
|
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)";
|
||||||
|
INFOPLIST_FILE = deepspeech_ios_test/Info.plist;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
);
|
||||||
|
LIBRARY_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"$(PROJECT_DIR)",
|
||||||
|
);
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "org.mozilla.deepspeech-ios-test";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
50F7881B2497683A00D52237 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
DEVELOPMENT_ASSET_PATHS = "\"deepspeech_ios_test/Preview Content\"";
|
||||||
|
DEVELOPMENT_TEAM = AWCG9S27P7;
|
||||||
|
ENABLE_PREVIEWS = YES;
|
||||||
|
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)";
|
||||||
|
INFOPLIST_FILE = deepspeech_ios_test/Info.plist;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
);
|
||||||
|
LIBRARY_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"$(PROJECT_DIR)",
|
||||||
|
);
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "org.mozilla.deepspeech-ios-test";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
50F7881D2497683A00D52237 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||||
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
INFOPLIST_FILE = deepspeech_ios_testTests/Info.plist;
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 13.5;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
"@loader_path/Frameworks",
|
||||||
|
);
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "org.mozilla.deepspeech-ios-testTests";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/deepspeech_ios_test.app/deepspeech_ios_test";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
50F7881E2497683A00D52237 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||||
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
INFOPLIST_FILE = deepspeech_ios_testTests/Info.plist;
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 13.5;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
"@loader_path/Frameworks",
|
||||||
|
);
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "org.mozilla.deepspeech-ios-testTests";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/deepspeech_ios_test.app/deepspeech_ios_test";
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
50F788202497683A00D52237 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
INFOPLIST_FILE = deepspeech_ios_testUITests/Info.plist;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
"@loader_path/Frameworks",
|
||||||
|
);
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "org.mozilla.deepspeech-ios-testUITests";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
TEST_TARGET_NAME = deepspeech_ios_test;
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
50F788212497683A00D52237 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
INFOPLIST_FILE = deepspeech_ios_testUITests/Info.plist;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
"@loader_path/Frameworks",
|
||||||
|
);
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "org.mozilla.deepspeech-ios-testUITests";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
TEST_TARGET_NAME = deepspeech_ios_test;
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
/* End XCBuildConfiguration section */
|
||||||
|
|
||||||
|
/* Begin XCConfigurationList section */
|
||||||
|
50F787EA2497683900D52237 /* Build configuration list for PBXProject "deepspeech_ios_test" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
50F788172497683A00D52237 /* Debug */,
|
||||||
|
50F788182497683A00D52237 /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
50F788192497683A00D52237 /* Build configuration list for PBXNativeTarget "deepspeech_ios_test" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
50F7881A2497683A00D52237 /* Debug */,
|
||||||
|
50F7881B2497683A00D52237 /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
50F7881C2497683A00D52237 /* Build configuration list for PBXNativeTarget "deepspeech_ios_testTests" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
50F7881D2497683A00D52237 /* Debug */,
|
||||||
|
50F7881E2497683A00D52237 /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
50F7881F2497683A00D52237 /* Build configuration list for PBXNativeTarget "deepspeech_ios_testUITests" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
50F788202497683A00D52237 /* Debug */,
|
||||||
|
50F788212497683A00D52237 /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
/* End XCConfigurationList section */
|
||||||
|
};
|
||||||
|
rootObject = 50F787E72497683900D52237 /* Project object */;
|
||||||
|
}
|
7
native_client/swift/deepspeech_ios_test.xcodeproj/project.xcworkspace/contents.xcworkspacedata
generated
Normal file
7
native_client/swift/deepspeech_ios_test.xcodeproj/project.xcworkspace/contents.xcworkspacedata
generated
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Workspace
|
||||||
|
version = "1.0">
|
||||||
|
<FileRef
|
||||||
|
location = "self:deepspeech_ios_test.xcodeproj">
|
||||||
|
</FileRef>
|
||||||
|
</Workspace>
|
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>IDEDidComputeMac32BitWarning</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
@ -0,0 +1,106 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Scheme
|
||||||
|
LastUpgradeVersion = "1150"
|
||||||
|
version = "1.3">
|
||||||
|
<BuildAction
|
||||||
|
parallelizeBuildables = "YES"
|
||||||
|
buildImplicitDependencies = "YES">
|
||||||
|
<BuildActionEntries>
|
||||||
|
<BuildActionEntry
|
||||||
|
buildForTesting = "YES"
|
||||||
|
buildForRunning = "YES"
|
||||||
|
buildForProfiling = "YES"
|
||||||
|
buildForArchiving = "YES"
|
||||||
|
buildForAnalyzing = "YES">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "50F787EE2497683900D52237"
|
||||||
|
BuildableName = "deepspeech_ios_test.app"
|
||||||
|
BlueprintName = "deepspeech_ios_test"
|
||||||
|
ReferencedContainer = "container:deepspeech_ios_test.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildActionEntry>
|
||||||
|
</BuildActionEntries>
|
||||||
|
</BuildAction>
|
||||||
|
<TestAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||||
|
<Testables>
|
||||||
|
<TestableReference
|
||||||
|
skipped = "NO">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "50F788042497683A00D52237"
|
||||||
|
BuildableName = "deepspeech_ios_testTests.xctest"
|
||||||
|
BlueprintName = "deepspeech_ios_testTests"
|
||||||
|
ReferencedContainer = "container:deepspeech_ios_test.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</TestableReference>
|
||||||
|
<TestableReference
|
||||||
|
skipped = "NO">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "50F7880F2497683A00D52237"
|
||||||
|
BuildableName = "deepspeech_ios_testUITests.xctest"
|
||||||
|
BlueprintName = "deepspeech_ios_testUITests"
|
||||||
|
ReferencedContainer = "container:deepspeech_ios_test.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</TestableReference>
|
||||||
|
</Testables>
|
||||||
|
</TestAction>
|
||||||
|
<LaunchAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
enableAddressSanitizer = "YES"
|
||||||
|
launchStyle = "0"
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
ignoresPersistentStateOnLaunch = "NO"
|
||||||
|
debugDocumentVersioning = "YES"
|
||||||
|
debugServiceExtension = "internal"
|
||||||
|
allowLocationSimulation = "YES">
|
||||||
|
<BuildableProductRunnable
|
||||||
|
runnableDebuggingMode = "0">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "50F787EE2497683900D52237"
|
||||||
|
BuildableName = "deepspeech_ios_test.app"
|
||||||
|
BlueprintName = "deepspeech_ios_test"
|
||||||
|
ReferencedContainer = "container:deepspeech_ios_test.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildableProductRunnable>
|
||||||
|
<AdditionalOptions>
|
||||||
|
<AdditionalOption
|
||||||
|
key = "NSZombieEnabled"
|
||||||
|
value = "YES"
|
||||||
|
isEnabled = "YES">
|
||||||
|
</AdditionalOption>
|
||||||
|
</AdditionalOptions>
|
||||||
|
</LaunchAction>
|
||||||
|
<ProfileAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
savedToolIdentifier = ""
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
debugDocumentVersioning = "YES">
|
||||||
|
<BuildableProductRunnable
|
||||||
|
runnableDebuggingMode = "0">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "50F787EE2497683900D52237"
|
||||||
|
BuildableName = "deepspeech_ios_test.app"
|
||||||
|
BlueprintName = "deepspeech_ios_test"
|
||||||
|
ReferencedContainer = "container:deepspeech_ios_test.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildableProductRunnable>
|
||||||
|
</ProfileAction>
|
||||||
|
<AnalyzeAction
|
||||||
|
buildConfiguration = "Debug">
|
||||||
|
</AnalyzeAction>
|
||||||
|
<ArchiveAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
revealArchiveInOrganizer = "YES">
|
||||||
|
</ArchiveAction>
|
||||||
|
</Scheme>
|
210
native_client/swift/deepspeech_ios_test/AppDelegate.swift
Normal file
210
native_client/swift/deepspeech_ios_test/AppDelegate.swift
Normal file
@ -0,0 +1,210 @@
|
|||||||
|
//
|
||||||
|
// AppDelegate.swift
|
||||||
|
// deepspeech_ios_test
|
||||||
|
//
|
||||||
|
// Created by Reuben Morais on 15.06.20.
|
||||||
|
// Copyright © 2020 Mozilla. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import UIKit
|
||||||
|
import Foundation
|
||||||
|
import AVFoundation
|
||||||
|
import AudioToolbox
|
||||||
|
import Accelerate
|
||||||
|
|
||||||
|
import deepspeech_ios
|
||||||
|
|
||||||
|
/// Holds audio information used for building waveforms
|
||||||
|
final class AudioContext {
|
||||||
|
|
||||||
|
/// The audio asset URL used to load the context
|
||||||
|
public let audioURL: URL
|
||||||
|
|
||||||
|
/// Total number of samples in loaded asset
|
||||||
|
public let totalSamples: Int
|
||||||
|
|
||||||
|
/// Loaded asset
|
||||||
|
public let asset: AVAsset
|
||||||
|
|
||||||
|
// Loaded assetTrack
|
||||||
|
public let assetTrack: AVAssetTrack
|
||||||
|
|
||||||
|
private init(audioURL: URL, totalSamples: Int, asset: AVAsset, assetTrack: AVAssetTrack) {
|
||||||
|
self.audioURL = audioURL
|
||||||
|
self.totalSamples = totalSamples
|
||||||
|
self.asset = asset
|
||||||
|
self.assetTrack = assetTrack
|
||||||
|
}
|
||||||
|
|
||||||
|
public static func load(fromAudioURL audioURL: URL, completionHandler: @escaping (_ audioContext: AudioContext?) -> ()) {
|
||||||
|
let asset = AVURLAsset(url: audioURL, options: [AVURLAssetPreferPreciseDurationAndTimingKey: NSNumber(value: true as Bool)])
|
||||||
|
|
||||||
|
guard let assetTrack = asset.tracks(withMediaType: AVMediaType.audio).first else {
|
||||||
|
fatalError("Couldn't load AVAssetTrack")
|
||||||
|
}
|
||||||
|
|
||||||
|
asset.loadValuesAsynchronously(forKeys: ["duration"]) {
|
||||||
|
var error: NSError?
|
||||||
|
let status = asset.statusOfValue(forKey: "duration", error: &error)
|
||||||
|
switch status {
|
||||||
|
case .loaded:
|
||||||
|
guard
|
||||||
|
let formatDescriptions = assetTrack.formatDescriptions as? [CMAudioFormatDescription],
|
||||||
|
let audioFormatDesc = formatDescriptions.first,
|
||||||
|
let asbd = CMAudioFormatDescriptionGetStreamBasicDescription(audioFormatDesc)
|
||||||
|
else { break }
|
||||||
|
|
||||||
|
let totalSamples = Int((asbd.pointee.mSampleRate) * Float64(asset.duration.value) / Float64(asset.duration.timescale))
|
||||||
|
let audioContext = AudioContext(audioURL: audioURL, totalSamples: totalSamples, asset: asset, assetTrack: assetTrack)
|
||||||
|
completionHandler(audioContext)
|
||||||
|
return
|
||||||
|
|
||||||
|
case .failed, .cancelled, .loading, .unknown:
|
||||||
|
print("Couldn't load asset: \(error?.localizedDescription ?? "Unknown error")")
|
||||||
|
}
|
||||||
|
|
||||||
|
completionHandler(nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func render(audioContext: AudioContext?, stream: DeepSpeechStream) {
|
||||||
|
guard let audioContext = audioContext else {
|
||||||
|
fatalError("Couldn't create the audioContext")
|
||||||
|
}
|
||||||
|
|
||||||
|
let sampleRange: CountableRange<Int> = 0..<audioContext.totalSamples
|
||||||
|
|
||||||
|
guard let reader = try? AVAssetReader(asset: audioContext.asset)
|
||||||
|
else {
|
||||||
|
fatalError("Couldn't initialize the AVAssetReader")
|
||||||
|
}
|
||||||
|
|
||||||
|
reader.timeRange = CMTimeRange(start: CMTime(value: Int64(sampleRange.lowerBound), timescale: audioContext.asset.duration.timescale),
|
||||||
|
duration: CMTime(value: Int64(sampleRange.count), timescale: audioContext.asset.duration.timescale))
|
||||||
|
|
||||||
|
let outputSettingsDict: [String : Any] = [
|
||||||
|
AVFormatIDKey: Int(kAudioFormatLinearPCM),
|
||||||
|
AVLinearPCMBitDepthKey: 16,
|
||||||
|
AVLinearPCMIsBigEndianKey: false,
|
||||||
|
AVLinearPCMIsFloatKey: false,
|
||||||
|
AVLinearPCMIsNonInterleaved: false
|
||||||
|
]
|
||||||
|
|
||||||
|
let readerOutput = AVAssetReaderTrackOutput(track: audioContext.assetTrack,
|
||||||
|
outputSettings: outputSettingsDict)
|
||||||
|
readerOutput.alwaysCopiesSampleData = false
|
||||||
|
reader.add(readerOutput)
|
||||||
|
|
||||||
|
var sampleBuffer = Data()
|
||||||
|
|
||||||
|
// 16-bit samples
|
||||||
|
reader.startReading()
|
||||||
|
defer { reader.cancelReading() }
|
||||||
|
|
||||||
|
while reader.status == .reading {
|
||||||
|
guard let readSampleBuffer = readerOutput.copyNextSampleBuffer(),
|
||||||
|
let readBuffer = CMSampleBufferGetDataBuffer(readSampleBuffer) else {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
// Append audio sample buffer into our current sample buffer
|
||||||
|
var readBufferLength = 0
|
||||||
|
var readBufferPointer: UnsafeMutablePointer<Int8>?
|
||||||
|
CMBlockBufferGetDataPointer(readBuffer,
|
||||||
|
atOffset: 0,
|
||||||
|
lengthAtOffsetOut: &readBufferLength,
|
||||||
|
totalLengthOut: nil,
|
||||||
|
dataPointerOut: &readBufferPointer)
|
||||||
|
sampleBuffer.append(UnsafeBufferPointer(start: readBufferPointer, count: readBufferLength))
|
||||||
|
CMSampleBufferInvalidate(readSampleBuffer)
|
||||||
|
|
||||||
|
let totalSamples = sampleBuffer.count / MemoryLayout<Int16>.size
|
||||||
|
print("read \(totalSamples) samples")
|
||||||
|
|
||||||
|
sampleBuffer.withUnsafeBytes { (samples: UnsafeRawBufferPointer) in
|
||||||
|
let unsafeBufferPointer = samples.bindMemory(to: Int16.self)
|
||||||
|
stream.feedAudioContent(buffer: unsafeBufferPointer)
|
||||||
|
}
|
||||||
|
|
||||||
|
sampleBuffer.removeAll()
|
||||||
|
}
|
||||||
|
|
||||||
|
// if (reader.status == AVAssetReaderStatusFailed || reader.status == AVAssetReaderStatusUnknown)
|
||||||
|
guard reader.status == .completed else {
|
||||||
|
fatalError("Couldn't read the audio file")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func test(model: DeepSpeechModel, audioPath: String, completion: @escaping () -> ()) {
|
||||||
|
let url = URL(fileURLWithPath: audioPath)
|
||||||
|
|
||||||
|
let stream = try! model.createStream()
|
||||||
|
print("\(audioPath)")
|
||||||
|
let start = CFAbsoluteTimeGetCurrent()
|
||||||
|
AudioContext.load(fromAudioURL: url, completionHandler: { audioContext in
|
||||||
|
guard let audioContext = audioContext else {
|
||||||
|
fatalError("Couldn't create the audioContext")
|
||||||
|
}
|
||||||
|
render(audioContext: audioContext, stream: stream)
|
||||||
|
let result = stream.finishStream()
|
||||||
|
let end = CFAbsoluteTimeGetCurrent()
|
||||||
|
print("\"\(audioPath)\": \(end - start) - \(result)")
|
||||||
|
completion()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
@UIApplicationMain
|
||||||
|
class AppDelegate: UIResponder, UIApplicationDelegate {
|
||||||
|
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
|
||||||
|
let model = try! DeepSpeechModel(modelPath: Bundle.main.path(forResource: "output_graph", ofType: "tflite")!)
|
||||||
|
try! model.enableExternalScorer(scorerPath: Bundle.main.path(forResource: "librispeech_en_utf8_nonpruned_o6", ofType: "scorer")!)
|
||||||
|
|
||||||
|
let files = [
|
||||||
|
"5639-40744-0008",
|
||||||
|
"1089-134686-0019",
|
||||||
|
"2094-142345-0053",
|
||||||
|
"8463-294825-0010",
|
||||||
|
"121-123852-0001",
|
||||||
|
"7021-79740-0008",
|
||||||
|
"6930-76324-0010",
|
||||||
|
"5105-28240-0001",
|
||||||
|
"1089-134691-0012",
|
||||||
|
"5142-33396-0027",
|
||||||
|
"260-123288-0004",
|
||||||
|
"6930-75918-0008",
|
||||||
|
"8463-294828-0005",
|
||||||
|
"61-70970-0002"
|
||||||
|
]
|
||||||
|
|
||||||
|
let serialQueue = DispatchQueue(label: "serialQueue")
|
||||||
|
let group = DispatchGroup()
|
||||||
|
group.enter()
|
||||||
|
serialQueue.async {
|
||||||
|
test(model: model, audioPath: Bundle.main.path(forResource: "1284-134647-0003", ofType: "wav")!) {
|
||||||
|
group.leave()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for path in files {
|
||||||
|
group.wait()
|
||||||
|
group.enter()
|
||||||
|
test(model: model, audioPath: Bundle.main.path(forResource: path, ofType: "wav")!) {
|
||||||
|
group.leave()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: UISceneSession Lifecycle
|
||||||
|
|
||||||
|
func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
|
||||||
|
// Called when a new scene session is being created.
|
||||||
|
// Use this method to select a configuration to create the new scene with.
|
||||||
|
return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
|
||||||
|
}
|
||||||
|
|
||||||
|
func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
|
||||||
|
// Called when the user discards a scene session.
|
||||||
|
// If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
|
||||||
|
// Use this method to release any resources that were specific to the discarded scenes, as they will not return.
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,98 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "20x20"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "3x",
|
||||||
|
"size" : "20x20"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "29x29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "3x",
|
||||||
|
"size" : "29x29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "40x40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "3x",
|
||||||
|
"size" : "40x40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "60x60"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "3x",
|
||||||
|
"size" : "60x60"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "20x20"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "20x20"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "29x29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "29x29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "40x40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "40x40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "76x76"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "76x76"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "83.5x83.5"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "ios-marketing",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "1024x1024"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
|
||||||
|
<dependencies>
|
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
|
||||||
|
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||||
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
|
</dependencies>
|
||||||
|
<scenes>
|
||||||
|
<!--View Controller-->
|
||||||
|
<scene sceneID="EHf-IW-A2E">
|
||||||
|
<objects>
|
||||||
|
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
|
||||||
|
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
|
<color key="backgroundColor" xcode11CocoaTouchSystemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
|
||||||
|
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
|
||||||
|
</view>
|
||||||
|
</viewController>
|
||||||
|
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||||
|
</objects>
|
||||||
|
<point key="canvasLocation" x="53" y="375"/>
|
||||||
|
</scene>
|
||||||
|
</scenes>
|
||||||
|
</document>
|
21
native_client/swift/deepspeech_ios_test/ContentView.swift
Normal file
21
native_client/swift/deepspeech_ios_test/ContentView.swift
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
//
|
||||||
|
// ContentView.swift
|
||||||
|
// deepspeech_ios_test
|
||||||
|
//
|
||||||
|
// Created by Reuben Morais on 15.06.20.
|
||||||
|
// Copyright © 2020 Mozilla. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct ContentView: View {
|
||||||
|
var body: some View {
|
||||||
|
Text("Hello, World!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ContentView_Previews: PreviewProvider {
|
||||||
|
static var previews: some View {
|
||||||
|
ContentView()
|
||||||
|
}
|
||||||
|
}
|
60
native_client/swift/deepspeech_ios_test/Info.plist
Normal file
60
native_client/swift/deepspeech_ios_test/Info.plist
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
|
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||||
|
<key>CFBundleExecutable</key>
|
||||||
|
<string>$(EXECUTABLE_NAME)</string>
|
||||||
|
<key>CFBundleIdentifier</key>
|
||||||
|
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||||
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
|
<string>6.0</string>
|
||||||
|
<key>CFBundleName</key>
|
||||||
|
<string>$(PRODUCT_NAME)</string>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||||
|
<key>CFBundleShortVersionString</key>
|
||||||
|
<string>1.0</string>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>1</string>
|
||||||
|
<key>LSRequiresIPhoneOS</key>
|
||||||
|
<true/>
|
||||||
|
<key>UIApplicationSceneManifest</key>
|
||||||
|
<dict>
|
||||||
|
<key>UIApplicationSupportsMultipleScenes</key>
|
||||||
|
<false/>
|
||||||
|
<key>UISceneConfigurations</key>
|
||||||
|
<dict>
|
||||||
|
<key>UIWindowSceneSessionRoleApplication</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>UISceneConfigurationName</key>
|
||||||
|
<string>Default Configuration</string>
|
||||||
|
<key>UISceneDelegateClassName</key>
|
||||||
|
<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<key>UILaunchStoryboardName</key>
|
||||||
|
<string>LaunchScreen</string>
|
||||||
|
<key>UIRequiredDeviceCapabilities</key>
|
||||||
|
<array>
|
||||||
|
<string>armv7</string>
|
||||||
|
</array>
|
||||||
|
<key>UISupportedInterfaceOrientations</key>
|
||||||
|
<array>
|
||||||
|
<string>UIInterfaceOrientationPortrait</string>
|
||||||
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
|
</array>
|
||||||
|
<key>UISupportedInterfaceOrientations~ipad</key>
|
||||||
|
<array>
|
||||||
|
<string>UIInterfaceOrientationPortrait</string>
|
||||||
|
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
||||||
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
64
native_client/swift/deepspeech_ios_test/SceneDelegate.swift
Normal file
64
native_client/swift/deepspeech_ios_test/SceneDelegate.swift
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
//
|
||||||
|
// SceneDelegate.swift
|
||||||
|
// deepspeech_ios_test
|
||||||
|
//
|
||||||
|
// Created by Reuben Morais on 15.06.20.
|
||||||
|
// Copyright © 2020 Mozilla. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import UIKit
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
|
||||||
|
|
||||||
|
var window: UIWindow?
|
||||||
|
|
||||||
|
|
||||||
|
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
|
||||||
|
// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
|
||||||
|
// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
|
||||||
|
// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
|
||||||
|
|
||||||
|
// Create the SwiftUI view that provides the window contents.
|
||||||
|
let contentView = ContentView()
|
||||||
|
|
||||||
|
// Use a UIHostingController as window root view controller.
|
||||||
|
if let windowScene = scene as? UIWindowScene {
|
||||||
|
let window = UIWindow(windowScene: windowScene)
|
||||||
|
window.rootViewController = UIHostingController(rootView: contentView)
|
||||||
|
self.window = window
|
||||||
|
window.makeKeyAndVisible()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func sceneDidDisconnect(_ scene: UIScene) {
|
||||||
|
// Called as the scene is being released by the system.
|
||||||
|
// This occurs shortly after the scene enters the background, or when its session is discarded.
|
||||||
|
// Release any resources associated with this scene that can be re-created the next time the scene connects.
|
||||||
|
// The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead).
|
||||||
|
}
|
||||||
|
|
||||||
|
func sceneDidBecomeActive(_ scene: UIScene) {
|
||||||
|
// Called when the scene has moved from an inactive state to an active state.
|
||||||
|
// Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
|
||||||
|
}
|
||||||
|
|
||||||
|
func sceneWillResignActive(_ scene: UIScene) {
|
||||||
|
// Called when the scene will move from an active state to an inactive state.
|
||||||
|
// This may occur due to temporary interruptions (ex. an incoming phone call).
|
||||||
|
}
|
||||||
|
|
||||||
|
func sceneWillEnterForeground(_ scene: UIScene) {
|
||||||
|
// Called as the scene transitions from the background to the foreground.
|
||||||
|
// Use this method to undo the changes made on entering the background.
|
||||||
|
}
|
||||||
|
|
||||||
|
func sceneDidEnterBackground(_ scene: UIScene) {
|
||||||
|
// Called as the scene transitions from the foreground to the background.
|
||||||
|
// Use this method to save data, release shared resources, and store enough scene-specific state information
|
||||||
|
// to restore the scene back to its current state.
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
22
native_client/swift/deepspeech_ios_testTests/Info.plist
Normal file
22
native_client/swift/deepspeech_ios_testTests/Info.plist
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
|
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||||
|
<key>CFBundleExecutable</key>
|
||||||
|
<string>$(EXECUTABLE_NAME)</string>
|
||||||
|
<key>CFBundleIdentifier</key>
|
||||||
|
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||||
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
|
<string>6.0</string>
|
||||||
|
<key>CFBundleName</key>
|
||||||
|
<string>$(PRODUCT_NAME)</string>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||||
|
<key>CFBundleShortVersionString</key>
|
||||||
|
<string>1.0</string>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>1</string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
@ -0,0 +1,34 @@
|
|||||||
|
//
|
||||||
|
// deepspeech_ios_testTests.swift
|
||||||
|
// deepspeech_ios_testTests
|
||||||
|
//
|
||||||
|
// Created by Reuben Morais on 15.06.20.
|
||||||
|
// Copyright © 2020 Mozilla. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import XCTest
|
||||||
|
@testable import deepspeech_ios_test
|
||||||
|
|
||||||
|
class deepspeech_ios_testTests: XCTestCase {
|
||||||
|
|
||||||
|
override func setUpWithError() throws {
|
||||||
|
// Put setup code here. This method is called before the invocation of each test method in the class.
|
||||||
|
}
|
||||||
|
|
||||||
|
override func tearDownWithError() throws {
|
||||||
|
// Put teardown code here. This method is called after the invocation of each test method in the class.
|
||||||
|
}
|
||||||
|
|
||||||
|
func testExample() throws {
|
||||||
|
// This is an example of a functional test case.
|
||||||
|
// Use XCTAssert and related functions to verify your tests produce the correct results.
|
||||||
|
}
|
||||||
|
|
||||||
|
func testPerformanceExample() throws {
|
||||||
|
// This is an example of a performance test case.
|
||||||
|
self.measure {
|
||||||
|
// Put the code you want to measure the time of here.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
22
native_client/swift/deepspeech_ios_testUITests/Info.plist
Normal file
22
native_client/swift/deepspeech_ios_testUITests/Info.plist
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
|
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||||
|
<key>CFBundleExecutable</key>
|
||||||
|
<string>$(EXECUTABLE_NAME)</string>
|
||||||
|
<key>CFBundleIdentifier</key>
|
||||||
|
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||||
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
|
<string>6.0</string>
|
||||||
|
<key>CFBundleName</key>
|
||||||
|
<string>$(PRODUCT_NAME)</string>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||||
|
<key>CFBundleShortVersionString</key>
|
||||||
|
<string>1.0</string>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>1</string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
@ -0,0 +1,43 @@
|
|||||||
|
//
|
||||||
|
// deepspeech_ios_testUITests.swift
|
||||||
|
// deepspeech_ios_testUITests
|
||||||
|
//
|
||||||
|
// Created by Reuben Morais on 15.06.20.
|
||||||
|
// Copyright © 2020 Mozilla. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import XCTest
|
||||||
|
|
||||||
|
class deepspeech_ios_testUITests: XCTestCase {
|
||||||
|
|
||||||
|
override func setUpWithError() throws {
|
||||||
|
// Put setup code here. This method is called before the invocation of each test method in the class.
|
||||||
|
|
||||||
|
// In UI tests it is usually best to stop immediately when a failure occurs.
|
||||||
|
continueAfterFailure = false
|
||||||
|
|
||||||
|
// In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
|
||||||
|
}
|
||||||
|
|
||||||
|
override func tearDownWithError() throws {
|
||||||
|
// Put teardown code here. This method is called after the invocation of each test method in the class.
|
||||||
|
}
|
||||||
|
|
||||||
|
func testExample() throws {
|
||||||
|
// UI tests must launch the application that they test.
|
||||||
|
let app = XCUIApplication()
|
||||||
|
app.launch()
|
||||||
|
|
||||||
|
// Use recording to get started writing UI tests.
|
||||||
|
// Use XCTAssert and related functions to verify your tests produce the correct results.
|
||||||
|
}
|
||||||
|
|
||||||
|
func testLaunchPerformance() throws {
|
||||||
|
if #available(macOS 10.15, iOS 13.0, tvOS 13.0, *) {
|
||||||
|
// This measures how long it takes to launch your application.
|
||||||
|
measure(metrics: [XCTOSSignpostMetric.applicationLaunch]) {
|
||||||
|
XCUIApplication().launch()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -25,7 +25,7 @@ build:
|
|||||||
nc_asset_name: 'native_client.tar.xz'
|
nc_asset_name: 'native_client.tar.xz'
|
||||||
args:
|
args:
|
||||||
tests_cmdline: ''
|
tests_cmdline: ''
|
||||||
tensorflow_git_desc: 'TensorFlow: v2.2.0-15-g518c1d0'
|
tensorflow_git_desc: 'TensorFlow: v2.2.0-17-g0854bb5'
|
||||||
test_model_task: ''
|
test_model_task: ''
|
||||||
homebrew:
|
homebrew:
|
||||||
url: ''
|
url: ''
|
||||||
|
@ -14,8 +14,6 @@ deepspeech:
|
|||||||
tensorflow:
|
tensorflow:
|
||||||
packages_xenial:
|
packages_xenial:
|
||||||
apt: 'apt-get -qq update && apt-get -qq -y install realpath build-essential python-virtualenv python-dev python-pip libblas-dev liblapack-dev gfortran wget software-properties-common pixz zip zlib1g-dev unzip'
|
apt: 'apt-get -qq update && apt-get -qq -y install realpath build-essential python-virtualenv python-dev python-pip libblas-dev liblapack-dev gfortran wget software-properties-common pixz zip zlib1g-dev unzip'
|
||||||
packages_macos:
|
|
||||||
brew: '$TASKCLUSTER_TASK_DIR/DeepSpeech/ds/taskcluster/tf_tc-brew.sh'
|
|
||||||
packages_win:
|
packages_win:
|
||||||
pacman: 'pacman --noconfirm -S patch unzip tar'
|
pacman: 'pacman --noconfirm -S patch unzip tar'
|
||||||
msys64: 'ln -s $USERPROFILE/msys64 $TASKCLUSTER_TASK_DIR/msys64'
|
msys64: 'ln -s $USERPROFILE/msys64 $TASKCLUSTER_TASK_DIR/msys64'
|
||||||
@ -68,11 +66,11 @@ system:
|
|||||||
url: 'https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.node-gyp-cache.7/artifacts/public/node-gyp-cache.tar.gz'
|
url: 'https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.node-gyp-cache.7/artifacts/public/node-gyp-cache.tar.gz'
|
||||||
namespace: 'project.deepspeech.node-gyp-cache.7'
|
namespace: 'project.deepspeech.node-gyp-cache.7'
|
||||||
homebrew_builds:
|
homebrew_builds:
|
||||||
url: 'https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.homebrew_builds.7/artifacts/public/homebrew_builds.tar.gz'
|
url: 'https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.homebrew_builds.8/artifacts/public/homebrew_builds.tar.gz'
|
||||||
namespace: 'project.deepspeech.homebrew_builds.7'
|
namespace: 'project.deepspeech.homebrew_builds.8'
|
||||||
homebrew_tests:
|
homebrew_tests:
|
||||||
url: 'https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.homebrew_tests.8/artifacts/public/homebrew_tests.tar.gz'
|
url: 'https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.homebrew_tests.9/artifacts/public/homebrew_tests.tar.gz'
|
||||||
namespace: 'project.deepspeech.homebrew_tests.8'
|
namespace: 'project.deepspeech.homebrew_tests.9'
|
||||||
android_cache:
|
android_cache:
|
||||||
arm64_v8a:
|
arm64_v8a:
|
||||||
android_24:
|
android_24:
|
||||||
@ -122,8 +120,8 @@ system:
|
|||||||
url: 'https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.pyenv.linux.8/artifacts/public/pyenv.tar.gz'
|
url: 'https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.pyenv.linux.8/artifacts/public/pyenv.tar.gz'
|
||||||
namespace: 'project.deepspeech.pyenv.linux.8'
|
namespace: 'project.deepspeech.pyenv.linux.8'
|
||||||
osx:
|
osx:
|
||||||
url: 'https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.pyenv.osx.8/artifacts/public/pyenv.tar.gz'
|
url: 'https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.pyenv.osx.9/artifacts/public/pyenv.tar.gz'
|
||||||
namespace: 'project.deepspeech.pyenv.osx.8'
|
namespace: 'project.deepspeech.pyenv.osx.9'
|
||||||
win:
|
win:
|
||||||
url: 'https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.pyenv.win.8/artifacts/public/pyenv.tar.gz'
|
url: 'https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.pyenv.win.8/artifacts/public/pyenv.tar.gz'
|
||||||
namespace: 'project.deepspeech.pyenv.win.8'
|
namespace: 'project.deepspeech.pyenv.win.8'
|
||||||
@ -142,32 +140,38 @@ system:
|
|||||||
namespace: "project.deepspeech.swig.win.amd64.b5fea54d39832d1d132d7dd921b69c0c2c9d5118"
|
namespace: "project.deepspeech.swig.win.amd64.b5fea54d39832d1d132d7dd921b69c0c2c9d5118"
|
||||||
tensorflow:
|
tensorflow:
|
||||||
linux_amd64_cpu:
|
linux_amd64_cpu:
|
||||||
url: "https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.tensorflow.pip.r2.2.518c1d04bf55d362bb11e973b8f5d0aa3e5bf44d.1.cpu/artifacts/public/home.tar.xz"
|
url: "https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.tensorflow.pip.r2.2.0854bb5188a3150a4d75a1c71ee610b0d45cfcb1.cpu/artifacts/public/home.tar.xz"
|
||||||
namespace: "project.deepspeech.tensorflow.pip.r2.2.518c1d04bf55d362bb11e973b8f5d0aa3e5bf44d.1.cpu"
|
namespace: "project.deepspeech.tensorflow.pip.r2.2.0854bb5188a3150a4d75a1c71ee610b0d45cfcb1.cpu"
|
||||||
linux_amd64_cuda:
|
linux_amd64_cuda:
|
||||||
url: "https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.tensorflow.pip.r2.2.518c1d04bf55d362bb11e973b8f5d0aa3e5bf44d.0.cuda/artifacts/public/home.tar.xz"
|
url: "https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.tensorflow.pip.r2.2.0854bb5188a3150a4d75a1c71ee610b0d45cfcb1.cuda/artifacts/public/home.tar.xz"
|
||||||
namespace: "project.deepspeech.tensorflow.pip.r2.2.518c1d04bf55d362bb11e973b8f5d0aa3e5bf44d.0.cuda"
|
namespace: "project.deepspeech.tensorflow.pip.r2.2.0854bb5188a3150a4d75a1c71ee610b0d45cfcb1.cuda"
|
||||||
linux_armv7:
|
linux_armv7:
|
||||||
url: "https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.tensorflow.pip.r2.2.518c1d04bf55d362bb11e973b8f5d0aa3e5bf44d.0.arm/artifacts/public/home.tar.xz"
|
url: "https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.tensorflow.pip.r2.2.0854bb5188a3150a4d75a1c71ee610b0d45cfcb1.arm/artifacts/public/home.tar.xz"
|
||||||
namespace: "project.deepspeech.tensorflow.pip.r2.2.518c1d04bf55d362bb11e973b8f5d0aa3e5bf44d.0.arm"
|
namespace: "project.deepspeech.tensorflow.pip.r2.2.0854bb5188a3150a4d75a1c71ee610b0d45cfcb1.arm"
|
||||||
linux_arm64:
|
linux_arm64:
|
||||||
url: "https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.tensorflow.pip.r2.2.518c1d04bf55d362bb11e973b8f5d0aa3e5bf44d.0.arm64/artifacts/public/home.tar.xz"
|
url: "https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.tensorflow.pip.r2.2.0854bb5188a3150a4d75a1c71ee610b0d45cfcb1.arm64/artifacts/public/home.tar.xz"
|
||||||
namespace: "project.deepspeech.tensorflow.pip.r2.2.518c1d04bf55d362bb11e973b8f5d0aa3e5bf44d.0.arm64"
|
namespace: "project.deepspeech.tensorflow.pip.r2.2.0854bb5188a3150a4d75a1c71ee610b0d45cfcb1.arm64"
|
||||||
darwin_amd64:
|
darwin_amd64:
|
||||||
url: "https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.tensorflow.pip.r2.2.518c1d04bf55d362bb11e973b8f5d0aa3e5bf44d.0.osx/artifacts/public/home.tar.xz"
|
url: "https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.tensorflow.pip.r2.2.0854bb5188a3150a4d75a1c71ee610b0d45cfcb1.3.osx/artifacts/public/home.tar.xz"
|
||||||
namespace: "project.deepspeech.tensorflow.pip.r2.2.518c1d04bf55d362bb11e973b8f5d0aa3e5bf44d.0.osx"
|
namespace: "project.deepspeech.tensorflow.pip.r2.2.0854bb5188a3150a4d75a1c71ee610b0d45cfcb1.3.osx"
|
||||||
android_arm64:
|
android_arm64:
|
||||||
url: "https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.tensorflow.pip.r2.2.518c1.1.bf55d362bb11e973b8f5.1.a3e5bf44d.1.android-arm64/artifacts/public/home.tar.xz"
|
url: "https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.tensorflow.pip.r2.2.0854bb5188a3150a4d75a1c71ee610b0d45cfcb1.android-arm64/artifacts/public/home.tar.xz"
|
||||||
namespace: "project.deepspeech.tensorflow.pip.r2.2.518c1.1.bf55d362bb11e973b8f5.1.a3e5bf44d.1.android-arm64"
|
namespace: "project.deepspeech.tensorflow.pip.r2.2.0854bb5188a3150a4d75a1c71ee610b0d45cfcb1.android-arm64"
|
||||||
android_armv7:
|
android_armv7:
|
||||||
url: "https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.tensorflow.pip.r2.2.518c1.1.bf55d362bb11e973b8f5.1.a3e5bf44d.1.android-armv7/artifacts/public/home.tar.xz"
|
url: "https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.tensorflow.pip.r2.2.0854bb5188a3150a4d75a1c71ee610b0d45cfcb1.android-armv7/artifacts/public/home.tar.xz"
|
||||||
namespace: "project.deepspeech.tensorflow.pip.r2.2.518c1.1.bf55d362bb11e973b8f5.1.a3e5bf44d.1.android-armv7"
|
namespace: "project.deepspeech.tensorflow.pip.r2.2.0854bb5188a3150a4d75a1c71ee610b0d45cfcb1.android-armv7"
|
||||||
win_amd64_cpu:
|
win_amd64_cpu:
|
||||||
url: "https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.tensorflow.pip.r2.2.518c1d04bf55d362bb11e973b8f5d0aa3e5bf44d.1.win/artifacts/public/home.tar.xz"
|
url: "https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.tensorflow.pip.r2.2.518c1d04bf55d362bb11e973b8f5d0aa3e5bf44d.2.win/artifacts/public/home.tar.xz"
|
||||||
namespace: "project.deepspeech.tensorflow.pip.r2.2.518c1d04bf55d362bb11e973b8f5d0aa3e5bf44d.1.win"
|
namespace: "project.deepspeech.tensorflow.pip.r2.2.518c1d04bf55d362bb11e973b8f5d0aa3e5bf44d.2.win"
|
||||||
win_amd64_cuda:
|
win_amd64_cuda:
|
||||||
url: "https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.tensorflow.pip.r2.2.518c1d04bf55d362bb11e973b8f5d0aa3e5bf44d.1.win-cuda/artifacts/public/home.tar.xz"
|
url: "https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.tensorflow.pip.r2.2.518c1d04bf55d362bb11e973b8f5d0aa3e5bf44d.2.win-cuda/artifacts/public/home.tar.xz"
|
||||||
namespace: "project.deepspeech.tensorflow.pip.r2.2.518c1d04bf55d362bb11e973b8f5d0aa3e5bf44d.1.win-cuda"
|
namespace: "project.deepspeech.tensorflow.pip.r2.2.518c1d04bf55d362bb11e973b8f5d0aa3e5bf44d.2.win-cuda"
|
||||||
|
ios_arm64:
|
||||||
|
url: "https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.tensorflow.pip.r2.2.0854bb5188a3150a4d75a1c71ee610b0d45cfcb1.3.ios_arm64/artifacts/public/home.tar.xz"
|
||||||
|
namespace: "project.deepspeech.tensorflow.pip.r2.2.0854bb5188a3150a4d75a1c71ee610b0d45cfcb1.3.ios_arm64"
|
||||||
|
ios_x86_64:
|
||||||
|
url: "https://community-tc.services.mozilla.com/api/index/v1/task/project.deepspeech.tensorflow.pip.r2.2.0854bb5188a3150a4d75a1c71ee610b0d45cfcb1.3.ios_x86_64/artifacts/public/home.tar.xz"
|
||||||
|
namespace: "project.deepspeech.tensorflow.pip.r2.2.0854bb5188a3150a4d75a1c71ee610b0d45cfcb1.3.ios_x86_64"
|
||||||
username: 'build-user'
|
username: 'build-user'
|
||||||
homedir:
|
homedir:
|
||||||
linux: '/home/build-user'
|
linux: '/home/build-user'
|
||||||
|
@ -35,11 +35,8 @@ payload:
|
|||||||
# There is no VM yet running tasks on OSX
|
# There is no VM yet running tasks on OSX
|
||||||
# so one should install by hand:
|
# so one should install by hand:
|
||||||
# - brew
|
# - brew
|
||||||
# - xcode (brew would install)
|
# - Xcode 10.1 in /Applications/Xcode.app, then sudo chown -R root:wheel /Applications/Xcode.app
|
||||||
# - brew install gnu-tar
|
# - brew install gnu-tar git pixz wget coreutils pyenv-virtualenv
|
||||||
# - brew install git
|
|
||||||
# - brew install pixz
|
|
||||||
# - brew cask install java
|
|
||||||
# - sudo easy_install pip
|
# - sudo easy_install pip
|
||||||
|
|
||||||
command:
|
command:
|
||||||
|
@ -42,12 +42,13 @@ do_prepare_homebrew()
|
|||||||
|
|
||||||
check_homebrew "${_brew_instance}"
|
check_homebrew "${_brew_instance}"
|
||||||
|
|
||||||
# Force an upgrade to fetch formulae
|
|
||||||
brew search openssl
|
|
||||||
|
|
||||||
# Then we force onto a specific well-known commit
|
# Then we force onto a specific well-known commit
|
||||||
|
mkdir -p "$(brew --prefix)/Library/Taps/homebrew/homebrew-core"
|
||||||
pushd "$(brew --prefix)/Library/Taps/homebrew/homebrew-core"
|
pushd "$(brew --prefix)/Library/Taps/homebrew/homebrew-core"
|
||||||
git fetch origin && git checkout ${BREW_FORMULAS_COMMIT}
|
git init
|
||||||
|
git remote add origin https://github.com/Homebrew/homebrew-core.git
|
||||||
|
git fetch origin
|
||||||
|
git checkout ${BREW_FORMULAS_COMMIT}
|
||||||
popd
|
popd
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,4 +9,4 @@ build:
|
|||||||
package: "taskcluster/homebrew-package.sh --builds"
|
package: "taskcluster/homebrew-package.sh --builds"
|
||||||
metadata:
|
metadata:
|
||||||
name: "Builds Homebrew macOS AMD64"
|
name: "Builds Homebrew macOS AMD64"
|
||||||
description: "Setup a buildsl Homebrew for macOS/AMD64"
|
description: "Setup a builds Homebrew for macOS/AMD64"
|
||||||
|
21
taskcluster/ios-arm64-tflite-opt.yml
Normal file
21
taskcluster/ios-arm64-tflite-opt.yml
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
build:
|
||||||
|
template_file: darwin-opt-base.tyml
|
||||||
|
dependencies:
|
||||||
|
- "swig-darwin-amd64"
|
||||||
|
- "node-gyp-cache"
|
||||||
|
- "homebrew_builds-darwin-amd64"
|
||||||
|
- "pyenv-darwin-amd64"
|
||||||
|
- "tf_ios-arm64-opt"
|
||||||
|
routes:
|
||||||
|
- "index.project.deepspeech.deepspeech.native_client.${event.head.branchortag}.ios_arm64-tflite"
|
||||||
|
- "index.project.deepspeech.deepspeech.native_client.${event.head.branchortag}.${event.head.sha}.ios_arm64-tflite"
|
||||||
|
- "index.project.deepspeech.deepspeech.native_client.ios_arm64-tflite.${event.head.sha}"
|
||||||
|
tensorflow: ${system.tensorflow.ios_arm64.url}
|
||||||
|
scripts:
|
||||||
|
build: "taskcluster/ios-build.sh --arm64"
|
||||||
|
package: "taskcluster/ios-package.sh --arm64"
|
||||||
|
nc_asset_name: "native_client.arm64.tflite.ios.tar.xz"
|
||||||
|
maxRunTime: 14400
|
||||||
|
metadata:
|
||||||
|
name: "DeepSpeech iOS ARM64 TFLite"
|
||||||
|
description: "Building DeepSpeech for iOS ARM64, TFLite, optimized version"
|
25
taskcluster/ios-build.sh
Executable file
25
taskcluster/ios-build.sh
Executable file
@ -0,0 +1,25 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -xe
|
||||||
|
|
||||||
|
arch=$1
|
||||||
|
|
||||||
|
source $(dirname "$0")/tc-tests-utils.sh
|
||||||
|
|
||||||
|
source $(dirname "$0")/tf_tc-vars.sh
|
||||||
|
|
||||||
|
BAZEL_TARGETS="
|
||||||
|
//native_client:libdeepspeech.so
|
||||||
|
"
|
||||||
|
|
||||||
|
if [ "${arch}" = "--arm64" ]; then
|
||||||
|
BAZEL_BUILD_FLAGS="${BAZEL_IOS_ARM64_FLAGS}"
|
||||||
|
else
|
||||||
|
BAZEL_BUILD_FLAGS="${BAZEL_IOS_X86_64_FLAGS}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
BAZEL_ENV_FLAGS="TF_NEED_CUDA=0"
|
||||||
|
|
||||||
|
do_bazel_build
|
||||||
|
|
||||||
|
do_deepspeech_ios_framework_build "${arch}"
|
30
taskcluster/ios-package.sh
Executable file
30
taskcluster/ios-package.sh
Executable file
@ -0,0 +1,30 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -xe
|
||||||
|
|
||||||
|
arch=$1
|
||||||
|
|
||||||
|
source $(dirname "$0")/tc-tests-utils.sh
|
||||||
|
|
||||||
|
mkdir -p ${TASKCLUSTER_ARTIFACTS} || true
|
||||||
|
|
||||||
|
cp ${DS_ROOT_TASK}/DeepSpeech/ds/tensorflow/bazel*.log ${TASKCLUSTER_ARTIFACTS}/
|
||||||
|
|
||||||
|
package_native_client "native_client.tar.xz"
|
||||||
|
|
||||||
|
package_libdeepspeech_as_zip "libdeepspeech.zip"
|
||||||
|
|
||||||
|
case $arch in
|
||||||
|
"--x86_64")
|
||||||
|
release_folder="Release-iphonesimulator"
|
||||||
|
artifact_name="deepspeech_ios.framework.x86_64.tar.xz"
|
||||||
|
;;
|
||||||
|
"--arm64")
|
||||||
|
release_folder="Release-iphoneos"
|
||||||
|
artifact_name="deepspeech_ios.framework.arm64.tar.xz"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
${TAR} -cf - \
|
||||||
|
-C ${DS_ROOT_TASK}/DeepSpeech/ds/native_client/swift/DerivedData/Build/Products/${release_folder}/ deepspeech_ios.framework \
|
||||||
|
| ${XZ} > "${TASKCLUSTER_ARTIFACTS}/${artifact_name}"
|
21
taskcluster/ios-x86_64-tflite-opt.yml
Normal file
21
taskcluster/ios-x86_64-tflite-opt.yml
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
build:
|
||||||
|
template_file: darwin-opt-base.tyml
|
||||||
|
dependencies:
|
||||||
|
- "swig-darwin-amd64"
|
||||||
|
- "node-gyp-cache"
|
||||||
|
- "homebrew_builds-darwin-amd64"
|
||||||
|
- "pyenv-darwin-amd64"
|
||||||
|
- "tf_ios-x86_64-opt"
|
||||||
|
routes:
|
||||||
|
- "index.project.deepspeech.deepspeech.native_client.${event.head.branchortag}.ios_x86_64-tflite"
|
||||||
|
- "index.project.deepspeech.deepspeech.native_client.${event.head.branchortag}.${event.head.sha}.ios_x86_64-tflite"
|
||||||
|
- "index.project.deepspeech.deepspeech.native_client.ios_x86_64-tflite.${event.head.sha}"
|
||||||
|
tensorflow: ${system.tensorflow.ios_x86_64.url}
|
||||||
|
scripts:
|
||||||
|
build: "taskcluster/ios-build.sh --x86_64"
|
||||||
|
package: "taskcluster/ios-package.sh --x86_64"
|
||||||
|
nc_asset_name: "native_client.x86_64.tflite.ios.tar.xz"
|
||||||
|
maxRunTime: 14400
|
||||||
|
metadata:
|
||||||
|
name: "DeepSpeech iOS x86_64 TFLite"
|
||||||
|
description: "Building DeepSpeech for iOS x86_64, TFLite, optimized version"
|
@ -20,6 +20,8 @@ build:
|
|||||||
- "win-amd64-cpu-opt"
|
- "win-amd64-cpu-opt"
|
||||||
- "win-amd64-gpu-opt"
|
- "win-amd64-gpu-opt"
|
||||||
- "win-amd64-ctc-opt"
|
- "win-amd64-ctc-opt"
|
||||||
|
- "ios-x86_64-tflite-opt"
|
||||||
|
- "ios-arm64-tflite-opt"
|
||||||
allowed:
|
allowed:
|
||||||
- "tag"
|
- "tag"
|
||||||
ref_match: "refs/tags/"
|
ref_match: "refs/tags/"
|
||||||
@ -66,6 +68,9 @@ build:
|
|||||||
- "win-amd64-cpu-opt"
|
- "win-amd64-cpu-opt"
|
||||||
- "win-amd64-gpu-opt"
|
- "win-amd64-gpu-opt"
|
||||||
- "win-amd64-tflite-opt"
|
- "win-amd64-tflite-opt"
|
||||||
|
ios:
|
||||||
|
- "ios-x86_64-tflite-opt"
|
||||||
|
- "ios-arm64-tflite-opt"
|
||||||
metadata:
|
metadata:
|
||||||
name: "DeepSpeech GitHub Packages"
|
name: "DeepSpeech GitHub Packages"
|
||||||
description: "Trigger Uploading of DeepSpeech Packages to GitHub release page"
|
description: "Trigger Uploading of DeepSpeech Packages to GitHub release page"
|
||||||
|
@ -33,6 +33,8 @@ do_deepspeech_python_build()
|
|||||||
virtualenv_activate "${pyalias}" "deepspeech"
|
virtualenv_activate "${pyalias}" "deepspeech"
|
||||||
|
|
||||||
python --version
|
python --version
|
||||||
|
pip --version
|
||||||
|
pip3 --version
|
||||||
which pip
|
which pip
|
||||||
which pip3
|
which pip3
|
||||||
|
|
||||||
@ -229,7 +231,7 @@ do_deepspeech_netframework_build()
|
|||||||
cd ${DS_DSDIR}/native_client/dotnet
|
cd ${DS_DSDIR}/native_client/dotnet
|
||||||
|
|
||||||
# Setup dependencies
|
# Setup dependencies
|
||||||
nuget install DeepSpeechConsole/packages.config -OutputDirectory packages/
|
nuget restore DeepSpeech.sln
|
||||||
|
|
||||||
MSBUILD="$(cygpath 'C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin\MSBuild.exe')"
|
MSBUILD="$(cygpath 'C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin\MSBuild.exe')"
|
||||||
|
|
||||||
@ -240,23 +242,30 @@ do_deepspeech_netframework_build()
|
|||||||
DeepSpeechClient/DeepSpeechClient.csproj \
|
DeepSpeechClient/DeepSpeechClient.csproj \
|
||||||
/p:Configuration=Release \
|
/p:Configuration=Release \
|
||||||
/p:Platform=x64 \
|
/p:Platform=x64 \
|
||||||
/p:TargetFrameworkVersion="v4.5.2" \
|
/p:TargetFramework="net452" \
|
||||||
/p:OutputPath=bin/nuget/x64/v4.5
|
/p:OutputPath=bin/nuget/x64/v4.5
|
||||||
|
|
||||||
MSYS2_ARG_CONV_EXCL='/' "${MSBUILD}" \
|
MSYS2_ARG_CONV_EXCL='/' "${MSBUILD}" \
|
||||||
DeepSpeechClient/DeepSpeechClient.csproj \
|
DeepSpeechClient/DeepSpeechClient.csproj \
|
||||||
/p:Configuration=Release \
|
/p:Configuration=Release \
|
||||||
/p:Platform=x64 \
|
/p:Platform=x64 \
|
||||||
/p:TargetFrameworkVersion="v4.6" \
|
/p:TargetFramework="net46" \
|
||||||
/p:OutputPath=bin/nuget/x64/v4.6
|
/p:OutputPath=bin/nuget/x64/v4.6
|
||||||
|
|
||||||
MSYS2_ARG_CONV_EXCL='/' "${MSBUILD}" \
|
MSYS2_ARG_CONV_EXCL='/' "${MSBUILD}" \
|
||||||
DeepSpeechClient/DeepSpeechClient.csproj \
|
DeepSpeechClient/DeepSpeechClient.csproj \
|
||||||
/p:Configuration=Release \
|
/p:Configuration=Release \
|
||||||
/p:Platform=x64 \
|
/p:Platform=x64 \
|
||||||
/p:TargetFrameworkVersion="v4.7" \
|
/p:TargetFramework="net47" \
|
||||||
/p:OutputPath=bin/nuget/x64/v4.7
|
/p:OutputPath=bin/nuget/x64/v4.7
|
||||||
|
|
||||||
|
MSYS2_ARG_CONV_EXCL='/' "${MSBUILD}" \
|
||||||
|
DeepSpeechClient/DeepSpeechClient.csproj \
|
||||||
|
/p:Configuration=Release \
|
||||||
|
/p:Platform=x64 \
|
||||||
|
/p:TargetFramework="uap10.0" \
|
||||||
|
/p:OutputPath=bin/nuget/x64/uap10.0
|
||||||
|
|
||||||
MSYS2_ARG_CONV_EXCL='/' "${MSBUILD}" \
|
MSYS2_ARG_CONV_EXCL='/' "${MSBUILD}" \
|
||||||
DeepSpeechConsole/DeepSpeechConsole.csproj \
|
DeepSpeechConsole/DeepSpeechConsole.csproj \
|
||||||
/p:Configuration=Release \
|
/p:Configuration=Release \
|
||||||
@ -305,6 +314,9 @@ do_nuget_build()
|
|||||||
mkdir -p nupkg/lib/net47/
|
mkdir -p nupkg/lib/net47/
|
||||||
cp DeepSpeechClient/bin/nuget/x64/v4.7/DeepSpeechClient.dll nupkg/lib/net47/
|
cp DeepSpeechClient/bin/nuget/x64/v4.7/DeepSpeechClient.dll nupkg/lib/net47/
|
||||||
|
|
||||||
|
mkdir -p nupkg/lib/uap10.0/
|
||||||
|
cp DeepSpeechClient/bin/nuget/x64/uap10.0/DeepSpeechClient.dll nupkg/lib/uap10.0/
|
||||||
|
|
||||||
PROJECT_VERSION=$(strip "${DS_VERSION}")
|
PROJECT_VERSION=$(strip "${DS_VERSION}")
|
||||||
sed \
|
sed \
|
||||||
-e "s/\$NUPKG_ID/${PROJECT_NAME}/" \
|
-e "s/\$NUPKG_ID/${PROJECT_NAME}/" \
|
||||||
@ -313,3 +325,21 @@ do_nuget_build()
|
|||||||
|
|
||||||
nuget pack nupkg/deepspeech.nuspec
|
nuget pack nupkg/deepspeech.nuspec
|
||||||
}
|
}
|
||||||
|
|
||||||
|
do_deepspeech_ios_framework_build()
|
||||||
|
{
|
||||||
|
arch=$1
|
||||||
|
cp ${DS_TFDIR}/bazel-bin/native_client/libdeepspeech.so ${DS_DSDIR}/native_client/swift/libdeepspeech.so
|
||||||
|
cd ${DS_DSDIR}/native_client/swift
|
||||||
|
case $arch in
|
||||||
|
"--x86_64")
|
||||||
|
iosSDK="iphonesimulator"
|
||||||
|
xcodeArch="x86_64"
|
||||||
|
;;
|
||||||
|
"--arm64")
|
||||||
|
iosSDK="iphoneos"
|
||||||
|
xcodeArch="arm64"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
xcodebuild -workspace deepspeech_ios.xcworkspace -scheme deepspeech_ios_test -configuration Release -arch "${xcodeArch}" -sdk "${iosSDK}" -derivedDataPath DerivedData CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO
|
||||||
|
}
|
||||||
|
@ -17,10 +17,6 @@ download_material "${TASKCLUSTER_TMP_DIR}/ds"
|
|||||||
|
|
||||||
export PATH=${TASKCLUSTER_TMP_DIR}/ds/:$PATH
|
export PATH=${TASKCLUSTER_TMP_DIR}/ds/:$PATH
|
||||||
|
|
||||||
if [ "${OS}" = "Darwin" ]; then
|
|
||||||
export DYLD_LIBRARY_PATH=$TESTS_BREW/lib/:$DYLD_LIBRARY_PATH
|
|
||||||
fi;
|
|
||||||
|
|
||||||
check_versions
|
check_versions
|
||||||
|
|
||||||
run_prod_inference_tests "${bitrate}"
|
run_prod_inference_tests "${bitrate}"
|
||||||
|
@ -11,10 +11,6 @@ download_material "${TASKCLUSTER_TMP_DIR}/ds"
|
|||||||
|
|
||||||
export PATH=${TASKCLUSTER_TMP_DIR}/ds/:$PATH
|
export PATH=${TASKCLUSTER_TMP_DIR}/ds/:$PATH
|
||||||
|
|
||||||
if [ "${OS}" = "Darwin" ]; then
|
|
||||||
export DYLD_LIBRARY_PATH=$TESTS_BREW/lib/:$DYLD_LIBRARY_PATH
|
|
||||||
fi;
|
|
||||||
|
|
||||||
check_versions
|
check_versions
|
||||||
|
|
||||||
run_all_inference_tests
|
run_all_inference_tests
|
||||||
|
@ -16,10 +16,6 @@ download_material "${TASKCLUSTER_TMP_DIR}/ds"
|
|||||||
|
|
||||||
export PATH=${TASKCLUSTER_TMP_DIR}/ds/:$PATH
|
export PATH=${TASKCLUSTER_TMP_DIR}/ds/:$PATH
|
||||||
|
|
||||||
if [ "${OS}" = "Darwin" ]; then
|
|
||||||
export DYLD_LIBRARY_PATH=$TESTS_BREW/lib/:$DYLD_LIBRARY_PATH
|
|
||||||
fi;
|
|
||||||
|
|
||||||
check_versions
|
check_versions
|
||||||
|
|
||||||
run_all_inference_tests
|
run_all_inference_tests
|
||||||
|
@ -18,10 +18,6 @@ download_material "${TASKCLUSTER_TMP_DIR}/ds"
|
|||||||
|
|
||||||
export PATH=${TASKCLUSTER_TMP_DIR}/ds/:$PATH
|
export PATH=${TASKCLUSTER_TMP_DIR}/ds/:$PATH
|
||||||
|
|
||||||
if [ "${OS}" = "Darwin" ]; then
|
|
||||||
export DYLD_LIBRARY_PATH=$TESTS_BREW/lib/:$DYLD_LIBRARY_PATH
|
|
||||||
fi;
|
|
||||||
|
|
||||||
check_versions
|
check_versions
|
||||||
|
|
||||||
run_prodtflite_inference_tests "${bitrate}"
|
run_prodtflite_inference_tests "${bitrate}"
|
||||||
|
@ -16,10 +16,6 @@ download_material "${TASKCLUSTER_TMP_DIR}/ds"
|
|||||||
|
|
||||||
export PATH=${TASKCLUSTER_TMP_DIR}/ds/:$PATH
|
export PATH=${TASKCLUSTER_TMP_DIR}/ds/:$PATH
|
||||||
|
|
||||||
if [ "${OS}" = "Darwin" ]; then
|
|
||||||
export DYLD_LIBRARY_PATH=$TESTS_BREW/lib/:$DYLD_LIBRARY_PATH
|
|
||||||
fi;
|
|
||||||
|
|
||||||
check_versions
|
check_versions
|
||||||
|
|
||||||
run_tflite_basic_inference_tests
|
run_tflite_basic_inference_tests
|
||||||
|
@ -5,12 +5,9 @@ build:
|
|||||||
artifact_namespace: ${system.tensorflow.darwin_amd64.namespace}
|
artifact_namespace: ${system.tensorflow.darwin_amd64.namespace}
|
||||||
generic:
|
generic:
|
||||||
workerType: "ds-macos-heavy"
|
workerType: "ds-macos-heavy"
|
||||||
system_config:
|
|
||||||
>
|
|
||||||
${tensorflow.packages_macos.brew}
|
|
||||||
scripts:
|
scripts:
|
||||||
setup: "taskcluster/tf_tc-setup.sh"
|
setup: "taskcluster/tf_tc-setup.sh"
|
||||||
build: "taskcluster/tf_tc-build.sh --osx"
|
build: "taskcluster/tf_tc-build.sh --cpu"
|
||||||
package: "taskcluster/tf_tc-package.sh"
|
package: "taskcluster/tf_tc-package.sh"
|
||||||
maxRunTime: 28800
|
maxRunTime: 28800
|
||||||
metadata:
|
metadata:
|
||||||
|
15
taskcluster/tf_ios-arm64-opt.yml
Normal file
15
taskcluster/tf_ios-arm64-opt.yml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
build:
|
||||||
|
template_file: generic_tc_caching-darwin-opt-base.tyml
|
||||||
|
cache:
|
||||||
|
artifact_url: ${system.tensorflow.ios_arm64.url}
|
||||||
|
artifact_namespace: ${system.tensorflow.ios_arm64.namespace}
|
||||||
|
generic:
|
||||||
|
workerType: "ds-macos-heavy"
|
||||||
|
scripts:
|
||||||
|
setup: "taskcluster/tf_tc-setup.sh"
|
||||||
|
build: "taskcluster/tf_tc-build.sh --ios-arm64"
|
||||||
|
package: "taskcluster/tf_tc-package.sh"
|
||||||
|
maxRunTime: 28800
|
||||||
|
metadata:
|
||||||
|
name: "TensorFlow iOS ARM64 TFLite"
|
||||||
|
description: "Building TensorFlow for iOS ARM64, TFLite, optimized version"
|
15
taskcluster/tf_ios-x86_64-opt.yml
Normal file
15
taskcluster/tf_ios-x86_64-opt.yml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
build:
|
||||||
|
template_file: generic_tc_caching-darwin-opt-base.tyml
|
||||||
|
cache:
|
||||||
|
artifact_url: ${system.tensorflow.ios_x86_64.url}
|
||||||
|
artifact_namespace: ${system.tensorflow.ios_x86_64.namespace}
|
||||||
|
generic:
|
||||||
|
workerType: "ds-macos-heavy"
|
||||||
|
scripts:
|
||||||
|
setup: "taskcluster/tf_tc-setup.sh"
|
||||||
|
build: "taskcluster/tf_tc-build.sh --ios-x86_64"
|
||||||
|
package: "taskcluster/tf_tc-package.sh"
|
||||||
|
maxRunTime: 28800
|
||||||
|
metadata:
|
||||||
|
name: "TensorFlow iOS x86_64 TFLite"
|
||||||
|
description: "Building TensorFlow for iOS x86_64, TFLite, optimized version"
|
@ -8,7 +8,7 @@ build:
|
|||||||
${tensorflow.packages_xenial.apt} && ${java.packages_xenial.apt}
|
${tensorflow.packages_xenial.apt} && ${java.packages_xenial.apt}
|
||||||
scripts:
|
scripts:
|
||||||
setup: "taskcluster/tf_tc-setup.sh"
|
setup: "taskcluster/tf_tc-setup.sh"
|
||||||
build: "taskcluster/tf_tc-build.sh"
|
build: "taskcluster/tf_tc-build.sh --cpu"
|
||||||
package: "taskcluster/tf_tc-package.sh"
|
package: "taskcluster/tf_tc-package.sh"
|
||||||
maxRunTime: 14400
|
maxRunTime: 14400
|
||||||
metadata:
|
metadata:
|
||||||
|
@ -1,44 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -ex
|
|
||||||
|
|
||||||
if [ -z "${TASKCLUSTER_TASK_DIR}" ]; then
|
|
||||||
echo "No TASKCLUSTER_TASK_DIR, aborting."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
LOCAL_BREW="${TASKCLUSTER_TASK_DIR}/homebrew"
|
|
||||||
export PATH=${LOCAL_BREW}/bin:$PATH
|
|
||||||
export HOMEBREW_LOGS="${TASKCLUSTER_TASK_DIR}/homebrew.logs/"
|
|
||||||
export HOMEBREW_CACHE="${TASKCLUSTER_TASK_DIR}/homebrew.cache/"
|
|
||||||
|
|
||||||
# Never fail on pre-existing homebrew/ directory
|
|
||||||
mkdir -p "${LOCAL_BREW}" || true
|
|
||||||
mkdir -p "${HOMEBREW_CACHE}" || true
|
|
||||||
|
|
||||||
# Make sure to verify there is a 'brew' binary there, otherwise install things.
|
|
||||||
if [ ! -x "${LOCAL_BREW}/bin/brew" ]; then
|
|
||||||
curl -L https://github.com/Homebrew/brew/tarball/2.2.17 | tar xz --strip 1 -C "${LOCAL_BREW}"
|
|
||||||
fi;
|
|
||||||
|
|
||||||
echo "local brew list (should be empty) ..."
|
|
||||||
brew list
|
|
||||||
|
|
||||||
echo "local brew prefix ..."
|
|
||||||
local_prefix=$(brew --prefix)
|
|
||||||
echo "${local_prefix}"
|
|
||||||
|
|
||||||
if [ "${LOCAL_BREW}" != "${local_prefix}" ]; then
|
|
||||||
echo "Weird state:"
|
|
||||||
echo "LOCAL_BREW=${LOCAL_BREW}"
|
|
||||||
echo "local_prefix=${local_prefix}"
|
|
||||||
exit 1
|
|
||||||
fi;
|
|
||||||
|
|
||||||
# coreutils, pyenv-virtualenv required for build of tensorflow
|
|
||||||
all_pkgs="coreutils pyenv-virtualenv"
|
|
||||||
|
|
||||||
for pkg in ${all_pkgs};
|
|
||||||
do
|
|
||||||
(brew list --versions ${pkg} && brew upgrade ${pkg}) || brew install ${pkg}
|
|
||||||
done;
|
|
@ -4,58 +4,6 @@ set -ex
|
|||||||
|
|
||||||
source $(dirname $0)/tf_tc-vars.sh
|
source $(dirname $0)/tf_tc-vars.sh
|
||||||
|
|
||||||
build_amd64=yes
|
|
||||||
build_gpu=no
|
|
||||||
build_android_arm=no
|
|
||||||
build_android_arm64=no
|
|
||||||
build_linux_arm=no
|
|
||||||
build_linux_arm64=no
|
|
||||||
|
|
||||||
if [ "$1" = "--gpu" ]; then
|
|
||||||
build_amd64=yes
|
|
||||||
build_gpu=yes
|
|
||||||
build_android_arm=no
|
|
||||||
build_android_arm64=no
|
|
||||||
build_linux_arm=no
|
|
||||||
build_linux_arm64=no
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$1" = "--arm" ]; then
|
|
||||||
build_amd64=yes
|
|
||||||
build_gpu=no
|
|
||||||
build_android_arm=no
|
|
||||||
build_android_arm64=no
|
|
||||||
build_linux_arm=yes
|
|
||||||
build_linux_arm64=no
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$1" = "--arm64" ]; then
|
|
||||||
build_amd64=yes
|
|
||||||
build_gpu=no
|
|
||||||
build_android_arm=no
|
|
||||||
build_android_arm64=no
|
|
||||||
build_linux_arm=no
|
|
||||||
build_linux_arm64=yes
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$1" = "--android-armv7" ]; then
|
|
||||||
build_amd64=no
|
|
||||||
build_gpu=no
|
|
||||||
build_android_arm=yes
|
|
||||||
build_android_arm64=no
|
|
||||||
build_linux_arm=no
|
|
||||||
build_linux_arm64=no
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$1" = "--android-arm64" ]; then
|
|
||||||
build_amd64=no
|
|
||||||
build_gpu=no
|
|
||||||
build_android_arm=no
|
|
||||||
build_android_arm64=yes
|
|
||||||
build_linux_arm=no
|
|
||||||
build_linux_arm64=no
|
|
||||||
fi
|
|
||||||
|
|
||||||
pushd ${DS_ROOT_TASK}/DeepSpeech/ds/tensorflow/
|
pushd ${DS_ROOT_TASK}/DeepSpeech/ds/tensorflow/
|
||||||
BAZEL_BUILD="bazel ${BAZEL_OUTPUT_USER_ROOT} build -s --explain bazel_monolithic_tf.log --verbose_explanations --experimental_strict_action_env --config=monolithic"
|
BAZEL_BUILD="bazel ${BAZEL_OUTPUT_USER_ROOT} build -s --explain bazel_monolithic_tf.log --verbose_explanations --experimental_strict_action_env --config=monolithic"
|
||||||
|
|
||||||
@ -66,43 +14,32 @@ pushd ${DS_ROOT_TASK}/DeepSpeech/ds/tensorflow/
|
|||||||
# Force toolchain sync (useful on macOS ?)
|
# Force toolchain sync (useful on macOS ?)
|
||||||
bazel ${BAZEL_OUTPUT_USER_ROOT} sync --configure
|
bazel ${BAZEL_OUTPUT_USER_ROOT} sync --configure
|
||||||
|
|
||||||
if [ "${build_amd64}" = "yes" ]; then
|
case "$1" in
|
||||||
# Pure amd64 CPU-only build
|
"--cpu")
|
||||||
if [ "${OS}" = "${TC_MSYS_VERSION}" -a "${build_gpu}" = "no" ]; then
|
echo "" | TF_NEED_CUDA=0 ./configure && ${BAZEL_BUILD} -c opt ${BAZEL_OPT_FLAGS} ${BAZEL_EXTRA_FLAGS} ${BUILD_TARGET_LIB_CPP_API} ${BUILD_TARGET_LITE_LIB}
|
||||||
echo "" | TF_NEED_CUDA=0 ./configure && ${BAZEL_BUILD} -c opt ${BAZEL_OPT_FLAGS} ${BAZEL_EXTRA_FLAGS} ${BUILD_TARGET_LIB_CPP_API} ${BUILD_TARGET_LITE_LIB}
|
;;
|
||||||
elif [ "${build_gpu}" = "no" -a "${build_linux_arm}" = "no" -a "${build_linux_arm64}" = "no" ]; then
|
"--gpu")
|
||||||
echo "" | TF_NEED_CUDA=0 ./configure && ${BAZEL_BUILD} -c opt ${BAZEL_OPT_FLAGS} ${BAZEL_EXTRA_FLAGS} ${BUILD_TARGET_LIB_CPP_API} ${BUILD_TARGET_LITE_LIB}
|
eval "export ${TF_CUDA_FLAGS}" && (echo "" | TF_NEED_CUDA=1 ./configure) && ${BAZEL_BUILD} -c opt ${BAZEL_CUDA_FLAGS} ${BAZEL_EXTRA_FLAGS} ${BAZEL_OPT_FLAGS} ${BUILD_TARGET_LIB_CPP_API}
|
||||||
fi
|
;;
|
||||||
|
"--arm")
|
||||||
# Cross RPi3 CPU-only build
|
echo "" | TF_NEED_CUDA=0 ./configure && ${BAZEL_BUILD} -c opt ${BAZEL_ARM_FLAGS} ${BAZEL_EXTRA_FLAGS} ${BUILD_TARGET_LITE_LIB}
|
||||||
if [ "${build_linux_arm}" = "yes" ]; then
|
;;
|
||||||
echo "" | TF_NEED_CUDA=0 ./configure && ${BAZEL_BUILD} -c opt ${BAZEL_ARM_FLAGS} ${BAZEL_EXTRA_FLAGS} ${BUILD_TARGET_LITE_LIB}
|
"--arm64")
|
||||||
fi
|
echo "" | TF_NEED_CUDA=0 ./configure && ${BAZEL_BUILD} -c opt ${BAZEL_ARM64_FLAGS} ${BAZEL_EXTRA_FLAGS} ${BUILD_TARGET_LITE_LIB}
|
||||||
|
;;
|
||||||
# Cross ARM64 Cortex-A53 build
|
"--android-armv7")
|
||||||
if [ "${build_linux_arm64}" = "yes" ]; then
|
|
||||||
echo "" | TF_NEED_CUDA=0 ./configure && ${BAZEL_BUILD} -c opt ${BAZEL_ARM64_FLAGS} ${BAZEL_EXTRA_FLAGS} ${BUILD_TARGET_LITE_LIB}
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Pure amd64 GPU-enabled build
|
|
||||||
if [ "${build_gpu}" = "yes" ]; then
|
|
||||||
eval "export ${TF_CUDA_FLAGS}" && (echo "" | TF_NEED_CUDA=1 ./configure) && ${BAZEL_BUILD} -c opt ${BAZEL_CUDA_FLAGS} ${BAZEL_EXTRA_FLAGS} ${BAZEL_OPT_FLAGS} ${BUILD_TARGET_LIB_CPP_API}
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "${build_android_arm}" = "yes" ]; then
|
|
||||||
echo "" | TF_SET_ANDROID_WORKSPACE=1 ./configure && ${BAZEL_BUILD} -c opt ${BAZEL_ANDROID_ARM_FLAGS} ${BAZEL_EXTRA_FLAGS} ${BUILD_TARGET_LITE_LIB}
|
echo "" | TF_SET_ANDROID_WORKSPACE=1 ./configure && ${BAZEL_BUILD} -c opt ${BAZEL_ANDROID_ARM_FLAGS} ${BAZEL_EXTRA_FLAGS} ${BUILD_TARGET_LITE_LIB}
|
||||||
fi;
|
;;
|
||||||
|
"--android-arm64")
|
||||||
if [ "${build_android_arm64}" = "yes" ]; then
|
|
||||||
echo "" | TF_SET_ANDROID_WORKSPACE=1 ./configure && ${BAZEL_BUILD} -c opt ${BAZEL_ANDROID_ARM64_FLAGS} ${BAZEL_EXTRA_FLAGS} ${BUILD_TARGET_LITE_LIB}
|
echo "" | TF_SET_ANDROID_WORKSPACE=1 ./configure && ${BAZEL_BUILD} -c opt ${BAZEL_ANDROID_ARM64_FLAGS} ${BAZEL_EXTRA_FLAGS} ${BUILD_TARGET_LITE_LIB}
|
||||||
fi;
|
;;
|
||||||
|
"--ios-arm64")
|
||||||
if [ $? -ne 0 ]; then
|
echo "" | TF_NEED_CUDA=0 TF_CONFIGURE_IOS=1 ./configure && ${BAZEL_BUILD} -c opt ${BAZEL_IOS_ARM64_FLAGS} ${BUILD_TARGET_LITE_LIB}
|
||||||
# There was a failure, just account for it.
|
;;
|
||||||
echo "Build failure, please check the output above. Exit code was: $?"
|
"--ios-x86_64")
|
||||||
return 1
|
echo "" | TF_NEED_CUDA=0 TF_CONFIGURE_IOS=1 ./configure && ${BAZEL_BUILD} -c opt ${BAZEL_IOS_X86_64_FLAGS} ${BUILD_TARGET_LITE_LIB}
|
||||||
fi
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
bazel ${BAZEL_OUTPUT_USER_ROOT} shutdown
|
bazel ${BAZEL_OUTPUT_USER_ROOT} shutdown
|
||||||
popd
|
popd
|
||||||
|
@ -171,6 +171,8 @@ BAZEL_ARM64_FLAGS="--config=rpi3-armv8 --config=rpi3-armv8_opt --copt=-DTFLITE_W
|
|||||||
BAZEL_ANDROID_ARM_FLAGS="--config=android --config=android_arm --action_env ANDROID_NDK_API_LEVEL=21 --cxxopt=-std=c++14 --copt=-D_GLIBCXX_USE_C99 --copt=-DTFLITE_WITH_RUY_GEMV"
|
BAZEL_ANDROID_ARM_FLAGS="--config=android --config=android_arm --action_env ANDROID_NDK_API_LEVEL=21 --cxxopt=-std=c++14 --copt=-D_GLIBCXX_USE_C99 --copt=-DTFLITE_WITH_RUY_GEMV"
|
||||||
BAZEL_ANDROID_ARM64_FLAGS="--config=android --config=android_arm64 --action_env ANDROID_NDK_API_LEVEL=21 --cxxopt=-std=c++14 --copt=-D_GLIBCXX_USE_C99 --copt=-DTFLITE_WITH_RUY_GEMV"
|
BAZEL_ANDROID_ARM64_FLAGS="--config=android --config=android_arm64 --action_env ANDROID_NDK_API_LEVEL=21 --cxxopt=-std=c++14 --copt=-D_GLIBCXX_USE_C99 --copt=-DTFLITE_WITH_RUY_GEMV"
|
||||||
BAZEL_CUDA_FLAGS="--config=cuda"
|
BAZEL_CUDA_FLAGS="--config=cuda"
|
||||||
|
BAZEL_IOS_ARM64_FLAGS="--config=ios_arm64 --define=runtime=tflite --copt=-DTFLITE_WITH_RUY_GEMV"
|
||||||
|
BAZEL_IOS_X86_64_FLAGS="--config=ios_x86_64 --define=runtime=tflite --copt=-DTFLITE_WITH_RUY_GEMV"
|
||||||
|
|
||||||
if [ "${OS}" = "${TC_MSYS_VERSION}" ]; then
|
if [ "${OS}" = "${TC_MSYS_VERSION}" ]; then
|
||||||
# Somehow, even with Python being in the PATH, Bazel on windows struggles
|
# Somehow, even with Python being in the PATH, Bazel on windows struggles
|
||||||
|
@ -8,7 +8,7 @@ build:
|
|||||||
${tensorflow.packages_win.pacman} && ${tensorflow.packages_win.msys64}
|
${tensorflow.packages_win.pacman} && ${tensorflow.packages_win.msys64}
|
||||||
scripts:
|
scripts:
|
||||||
setup: "taskcluster/tf_tc-setup.sh"
|
setup: "taskcluster/tf_tc-setup.sh"
|
||||||
build: "taskcluster/tf_tc-build.sh"
|
build: "taskcluster/tf_tc-build.sh --cpu"
|
||||||
package: "taskcluster/tf_tc-package.sh"
|
package: "taskcluster/tf_tc-package.sh"
|
||||||
maxRunTime: 14400
|
maxRunTime: 14400
|
||||||
metadata:
|
metadata:
|
||||||
|
@ -43,7 +43,7 @@ payload:
|
|||||||
- .\msys64\usr\bin\bash.exe --login -cx "pacman -Syu --noconfirm"
|
- .\msys64\usr\bin\bash.exe --login -cx "pacman -Syu --noconfirm"
|
||||||
- echo .\msys64\usr\bin\bash.exe --login -cxe "
|
- echo .\msys64\usr\bin\bash.exe --login -cxe "
|
||||||
export LC_ALL=C &&
|
export LC_ALL=C &&
|
||||||
export PATH=\"/c/builds/tc-workdir/msys64/usr/bin:/c/Python36:/c/Program Files/Git/bin:/c/Program Files/7-Zip/:/c/Program Files (x86)/Windows Kits/10/bin/x64/:$PATH\" &&
|
export PATH=\"/c/builds/tc-workdir/msys64/usr/bin:/c/Python36:/c/Program Files/Git/bin:/c/Program Files/7-Zip/:/c/Program Files (x86)/Windows Kits/10/bin/x64/:/c/Program Files/dotnet/:$PATH\" &&
|
||||||
export TASKCLUSTER_ARTIFACTS=\"$USERPROFILE/public\" &&
|
export TASKCLUSTER_ARTIFACTS=\"$USERPROFILE/public\" &&
|
||||||
export TASKCLUSTER_TASK_DIR=\"/c/builds/tc-workdir/\" &&
|
export TASKCLUSTER_TASK_DIR=\"/c/builds/tc-workdir/\" &&
|
||||||
(mkdir $TASKCLUSTER_TASK_DIR || rm -fr $TASKCLUSTER_TASK_DIR/*) && cd $TASKCLUSTER_TASK_DIR &&
|
(mkdir $TASKCLUSTER_TASK_DIR || rm -fr $TASKCLUSTER_TASK_DIR/*) && cd $TASKCLUSTER_TASK_DIR &&
|
||||||
|
@ -4,8 +4,8 @@ taskcluster:
|
|||||||
provisionerId: proj-deepspeech
|
provisionerId: proj-deepspeech
|
||||||
workerType: ci
|
workerType: ci
|
||||||
workerTypeKvm: kvm
|
workerTypeKvm: kvm
|
||||||
workerTypeWin: win
|
workerTypeWin: win-b
|
||||||
workerTypeCuda: win-gpu-b
|
workerTypeCuda: win-gpu
|
||||||
dockerrpi3:
|
dockerrpi3:
|
||||||
provisionerId: proj-deepspeech
|
provisionerId: proj-deepspeech
|
||||||
workerType: ds-rpi3
|
workerType: ds-rpi3
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit 518c1d04bf55d362bb11e973b8f5d0aa3e5bf44d
|
Subproject commit 0854bb5188a3150a4d75a1c71ee610b0d45cfcb1
|
@ -50,7 +50,11 @@ def evaluate(test_csvs, create_model):
|
|||||||
else:
|
else:
|
||||||
scorer = None
|
scorer = None
|
||||||
|
|
||||||
test_sets = [create_dataset([csv], batch_size=FLAGS.test_batch_size, train_phase=False) for csv in test_csvs]
|
test_sets = [create_dataset([csv],
|
||||||
|
batch_size=FLAGS.test_batch_size,
|
||||||
|
train_phase=False,
|
||||||
|
reverse=FLAGS.reverse_test,
|
||||||
|
limit=FLAGS.limit_test) for csv in test_csvs]
|
||||||
iterator = tfv1.data.Iterator.from_structure(tfv1.data.get_output_types(test_sets[0]),
|
iterator = tfv1.data.Iterator.from_structure(tfv1.data.get_output_types(test_sets[0]),
|
||||||
tfv1.data.get_output_shapes(test_sets[0]),
|
tfv1.data.get_output_shapes(test_sets[0]),
|
||||||
output_classes=tfv1.data.get_output_classes(test_sets[0]))
|
output_classes=tfv1.data.get_output_classes(test_sets[0]))
|
||||||
|
@ -417,6 +417,8 @@ def train():
|
|||||||
train_phase=True,
|
train_phase=True,
|
||||||
exception_box=exception_box,
|
exception_box=exception_box,
|
||||||
process_ahead=len(Config.available_devices) * FLAGS.train_batch_size * 2,
|
process_ahead=len(Config.available_devices) * FLAGS.train_batch_size * 2,
|
||||||
|
reverse=FLAGS.reverse_train,
|
||||||
|
limit=FLAGS.limit_train,
|
||||||
buffering=FLAGS.read_buffer)
|
buffering=FLAGS.read_buffer)
|
||||||
|
|
||||||
iterator = tfv1.data.Iterator.from_structure(tfv1.data.get_output_types(train_set),
|
iterator = tfv1.data.Iterator.from_structure(tfv1.data.get_output_types(train_set),
|
||||||
@ -433,6 +435,8 @@ def train():
|
|||||||
train_phase=False,
|
train_phase=False,
|
||||||
exception_box=exception_box,
|
exception_box=exception_box,
|
||||||
process_ahead=len(Config.available_devices) * FLAGS.dev_batch_size * 2,
|
process_ahead=len(Config.available_devices) * FLAGS.dev_batch_size * 2,
|
||||||
|
reverse=FLAGS.reverse_dev,
|
||||||
|
limit=FLAGS.limit_dev,
|
||||||
buffering=FLAGS.read_buffer) for source in dev_sources]
|
buffering=FLAGS.read_buffer) for source in dev_sources]
|
||||||
dev_init_ops = [iterator.make_initializer(dev_set) for dev_set in dev_sets]
|
dev_init_ops = [iterator.make_initializer(dev_set) for dev_set in dev_sets]
|
||||||
|
|
||||||
@ -443,6 +447,8 @@ def train():
|
|||||||
train_phase=False,
|
train_phase=False,
|
||||||
exception_box=exception_box,
|
exception_box=exception_box,
|
||||||
process_ahead=len(Config.available_devices) * FLAGS.dev_batch_size * 2,
|
process_ahead=len(Config.available_devices) * FLAGS.dev_batch_size * 2,
|
||||||
|
reverse=FLAGS.reverse_dev,
|
||||||
|
limit=FLAGS.limit_dev,
|
||||||
buffering=FLAGS.read_buffer) for source in metrics_sources]
|
buffering=FLAGS.read_buffer) for source in metrics_sources]
|
||||||
metrics_init_ops = [iterator.make_initializer(metrics_set) for metrics_set in metrics_sets]
|
metrics_init_ops = [iterator.make_initializer(metrics_set) for metrics_set in metrics_sets]
|
||||||
|
|
||||||
|
@ -349,8 +349,13 @@ class Resample(SampleAugmentation):
|
|||||||
audio = sample.audio
|
audio = sample.audio
|
||||||
orig_len = len(audio)
|
orig_len = len(audio)
|
||||||
audio = np.swapaxes(audio, 0, 1)
|
audio = np.swapaxes(audio, 0, 1)
|
||||||
audio = resample(audio, sample.audio_format.rate, rate)
|
if audio.shape[0] < 2:
|
||||||
audio = resample(audio, rate, sample.audio_format.rate)
|
# since v0.8 librosa enforces a shape of (samples,) instead of (channels, samples) for mono samples
|
||||||
|
resampled = resample(audio[0], sample.audio_format.rate, rate)
|
||||||
|
audio[0] = resample(resampled, rate, sample.audio_format.rate)[:orig_len]
|
||||||
|
else:
|
||||||
|
audio = resample(audio, sample.audio_format.rate, rate)
|
||||||
|
audio = resample(audio, rate, sample.audio_format.rate)
|
||||||
audio = np.swapaxes(audio, 0, 1)[0:orig_len]
|
audio = np.swapaxes(audio, 0, 1)[0:orig_len]
|
||||||
sample.audio = audio
|
sample.audio = audio
|
||||||
|
|
||||||
|
@ -90,6 +90,8 @@ def create_dataset(sources,
|
|||||||
augmentations=None,
|
augmentations=None,
|
||||||
cache_path=None,
|
cache_path=None,
|
||||||
train_phase=False,
|
train_phase=False,
|
||||||
|
reverse=False,
|
||||||
|
limit=0,
|
||||||
exception_box=None,
|
exception_box=None,
|
||||||
process_ahead=None,
|
process_ahead=None,
|
||||||
buffering=1 * MEGABYTE):
|
buffering=1 * MEGABYTE):
|
||||||
@ -99,8 +101,10 @@ def create_dataset(sources,
|
|||||||
epoch = epoch_counter['epoch']
|
epoch = epoch_counter['epoch']
|
||||||
if train_phase:
|
if train_phase:
|
||||||
epoch_counter['epoch'] += 1
|
epoch_counter['epoch'] += 1
|
||||||
samples = samples_from_sources(sources, buffering=buffering, labeled=True)
|
samples = samples_from_sources(sources, buffering=buffering, labeled=True, reverse=reverse)
|
||||||
num_samples = len(samples)
|
num_samples = len(samples)
|
||||||
|
if limit > 0:
|
||||||
|
num_samples = min(limit, num_samples)
|
||||||
samples = apply_sample_augmentations(samples,
|
samples = apply_sample_augmentations(samples,
|
||||||
augmentations,
|
augmentations,
|
||||||
buffering=buffering,
|
buffering=buffering,
|
||||||
@ -108,6 +112,8 @@ def create_dataset(sources,
|
|||||||
clock=epoch / epochs,
|
clock=epoch / epochs,
|
||||||
final_clock=(epoch + 1) / epochs)
|
final_clock=(epoch + 1) / epochs)
|
||||||
for sample_index, sample in enumerate(samples):
|
for sample_index, sample in enumerate(samples):
|
||||||
|
if sample_index >= num_samples:
|
||||||
|
break
|
||||||
clock = (epoch * num_samples + sample_index) / (epochs * num_samples) if train_phase and epochs > 0 else 0.0
|
clock = (epoch * num_samples + sample_index) / (epochs * num_samples) if train_phase and epochs > 0 else 0.0
|
||||||
transcript = text_to_char_array(sample.transcript, Config.alphabet, context=sample.sample_id)
|
transcript = text_to_char_array(sample.transcript, Config.alphabet, context=sample.sample_id)
|
||||||
transcript = to_sparse_tuple(transcript)
|
transcript = to_sparse_tuple(transcript)
|
||||||
|
@ -71,8 +71,14 @@ def create_flags():
|
|||||||
# Sample limits
|
# Sample limits
|
||||||
|
|
||||||
f.DEFINE_integer('limit_train', 0, 'maximum number of elements to use from train set - 0 means no limit')
|
f.DEFINE_integer('limit_train', 0, 'maximum number of elements to use from train set - 0 means no limit')
|
||||||
f.DEFINE_integer('limit_dev', 0, 'maximum number of elements to use from validation set- 0 means no limit')
|
f.DEFINE_integer('limit_dev', 0, 'maximum number of elements to use from validation set - 0 means no limit')
|
||||||
f.DEFINE_integer('limit_test', 0, 'maximum number of elements to use from test set- 0 means no limit')
|
f.DEFINE_integer('limit_test', 0, 'maximum number of elements to use from test set - 0 means no limit')
|
||||||
|
|
||||||
|
# Sample order
|
||||||
|
|
||||||
|
f.DEFINE_boolean('reverse_train', False, 'if to reverse sample order of the train set')
|
||||||
|
f.DEFINE_boolean('reverse_dev', False, 'if to reverse sample order of the dev set')
|
||||||
|
f.DEFINE_boolean('reverse_test', False, 'if to reverse sample order of the test set')
|
||||||
|
|
||||||
# Checkpointing
|
# Checkpointing
|
||||||
|
|
||||||
|
@ -65,13 +65,14 @@ class Interleaved:
|
|||||||
"""Collection that lazily combines sorted collections in an interleaving fashion.
|
"""Collection that lazily combines sorted collections in an interleaving fashion.
|
||||||
During iteration the next smallest element from all the sorted collections is always picked.
|
During iteration the next smallest element from all the sorted collections is always picked.
|
||||||
The collections must support iter() and len()."""
|
The collections must support iter() and len()."""
|
||||||
def __init__(self, *iterables, key=lambda obj: obj):
|
def __init__(self, *iterables, key=lambda obj: obj, reverse=False):
|
||||||
self.iterables = iterables
|
self.iterables = iterables
|
||||||
self.key = key
|
self.key = key
|
||||||
|
self.reverse = reverse
|
||||||
self.len = sum(map(len, iterables))
|
self.len = sum(map(len, iterables))
|
||||||
|
|
||||||
def __iter__(self):
|
def __iter__(self):
|
||||||
return heapq.merge(*self.iterables, key=self.key)
|
return heapq.merge(*self.iterables, key=self.key, reverse=self.reverse)
|
||||||
|
|
||||||
def __len__(self):
|
def __len__(self):
|
||||||
return self.len
|
return self.len
|
||||||
|
@ -6,8 +6,16 @@ import json
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from functools import partial
|
from functools import partial
|
||||||
|
|
||||||
from .helpers import MEGABYTE, GIGABYTE, Interleaved
|
from .helpers import KILOBYTE, MEGABYTE, GIGABYTE, Interleaved
|
||||||
from .audio import Sample, DEFAULT_FORMAT, AUDIO_TYPE_OPUS, SERIALIZABLE_AUDIO_TYPES, get_audio_type_from_extension
|
from .audio import (
|
||||||
|
Sample,
|
||||||
|
DEFAULT_FORMAT,
|
||||||
|
AUDIO_TYPE_PCM,
|
||||||
|
AUDIO_TYPE_OPUS,
|
||||||
|
SERIALIZABLE_AUDIO_TYPES,
|
||||||
|
get_audio_type_from_extension,
|
||||||
|
write_wav
|
||||||
|
)
|
||||||
|
|
||||||
BIG_ENDIAN = 'big'
|
BIG_ENDIAN = 'big'
|
||||||
INT_SIZE = 4
|
INT_SIZE = 4
|
||||||
@ -15,6 +23,7 @@ BIGINT_SIZE = 2 * INT_SIZE
|
|||||||
MAGIC = b'SAMPLEDB'
|
MAGIC = b'SAMPLEDB'
|
||||||
|
|
||||||
BUFFER_SIZE = 1 * MEGABYTE
|
BUFFER_SIZE = 1 * MEGABYTE
|
||||||
|
REVERSE_BUFFER_SIZE = 16 * KILOBYTE
|
||||||
CACHE_SIZE = 1 * GIGABYTE
|
CACHE_SIZE = 1 * GIGABYTE
|
||||||
|
|
||||||
SCHEMA_KEY = 'schema'
|
SCHEMA_KEY = 'schema'
|
||||||
@ -181,14 +190,19 @@ class DirectSDBWriter:
|
|||||||
|
|
||||||
class SDB: # pylint: disable=too-many-instance-attributes
|
class SDB: # pylint: disable=too-many-instance-attributes
|
||||||
"""Sample collection reader for reading a Sample DB (SDB) file"""
|
"""Sample collection reader for reading a Sample DB (SDB) file"""
|
||||||
def __init__(self, sdb_filename, buffering=BUFFER_SIZE, id_prefix=None, labeled=True):
|
def __init__(self,
|
||||||
|
sdb_filename,
|
||||||
|
buffering=BUFFER_SIZE,
|
||||||
|
id_prefix=None,
|
||||||
|
labeled=True,
|
||||||
|
reverse=False):
|
||||||
"""
|
"""
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
sdb_filename : str
|
sdb_filename : str
|
||||||
Path to the SDB file to read samples from
|
Path to the SDB file to read samples from
|
||||||
buffering : int
|
buffering : int
|
||||||
Read-buffer size to use while reading the SDB file
|
Read-ahead buffer size to use while reading the SDB file in normal order. Fixed to 16kB if in reverse-mode.
|
||||||
id_prefix : str
|
id_prefix : str
|
||||||
Prefix for IDs of read samples - defaults to sdb_filename
|
Prefix for IDs of read samples - defaults to sdb_filename
|
||||||
labeled : bool or None
|
labeled : bool or None
|
||||||
@ -199,7 +213,7 @@ class SDB: # pylint: disable=too-many-instance-attributes
|
|||||||
"""
|
"""
|
||||||
self.sdb_filename = sdb_filename
|
self.sdb_filename = sdb_filename
|
||||||
self.id_prefix = sdb_filename if id_prefix is None else id_prefix
|
self.id_prefix = sdb_filename if id_prefix is None else id_prefix
|
||||||
self.sdb_file = open(sdb_filename, 'rb', buffering=buffering)
|
self.sdb_file = open(sdb_filename, 'rb', buffering=REVERSE_BUFFER_SIZE if reverse else buffering)
|
||||||
self.offsets = []
|
self.offsets = []
|
||||||
if self.sdb_file.read(len(MAGIC)) != MAGIC:
|
if self.sdb_file.read(len(MAGIC)) != MAGIC:
|
||||||
raise RuntimeError('No Sample Database')
|
raise RuntimeError('No Sample Database')
|
||||||
@ -229,6 +243,8 @@ class SDB: # pylint: disable=too-many-instance-attributes
|
|||||||
num_samples = self.read_big_int()
|
num_samples = self.read_big_int()
|
||||||
for _ in range(num_samples):
|
for _ in range(num_samples):
|
||||||
self.offsets.append(self.read_big_int())
|
self.offsets.append(self.read_big_int())
|
||||||
|
if reverse:
|
||||||
|
self.offsets.reverse()
|
||||||
|
|
||||||
def read_int(self):
|
def read_int(self):
|
||||||
return int.from_bytes(self.sdb_file.read(INT_SIZE), BIG_ENDIAN)
|
return int.from_bytes(self.sdb_file.read(INT_SIZE), BIG_ENDIAN)
|
||||||
@ -297,9 +313,73 @@ class SDB: # pylint: disable=too-many-instance-attributes
|
|||||||
self.close()
|
self.close()
|
||||||
|
|
||||||
|
|
||||||
|
class CSVWriter: # pylint: disable=too-many-instance-attributes
|
||||||
|
"""Sample collection writer for writing a CSV data-set and all its referenced WAV samples"""
|
||||||
|
def __init__(self,
|
||||||
|
csv_filename,
|
||||||
|
absolute_paths=False,
|
||||||
|
labeled=True):
|
||||||
|
"""
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
csv_filename : str
|
||||||
|
Path to the CSV file to write.
|
||||||
|
Will create a directory (CSV-filename without extension) next to it and fail if it already exists.
|
||||||
|
absolute_paths : bool
|
||||||
|
If paths in CSV file should be absolute instead of relative to the CSV file's parent directory.
|
||||||
|
labeled : bool or None
|
||||||
|
If True: Writes labeled samples (util.sample_collections.LabeledSample) only.
|
||||||
|
If False: Ignores transcripts (if available) and writes (unlabeled) util.audio.Sample instances.
|
||||||
|
"""
|
||||||
|
self.csv_filename = Path(csv_filename)
|
||||||
|
self.csv_base_dir = self.csv_filename.parent.resolve().absolute()
|
||||||
|
self.set_name = self.csv_filename.stem
|
||||||
|
self.csv_dir = self.csv_base_dir / self.set_name
|
||||||
|
if self.csv_dir.exists():
|
||||||
|
raise RuntimeError('"{}" already existing'.format(self.csv_dir))
|
||||||
|
os.mkdir(str(self.csv_dir))
|
||||||
|
self.absolute_paths = absolute_paths
|
||||||
|
fieldnames = ['wav_filename', 'wav_filesize']
|
||||||
|
self.labeled = labeled
|
||||||
|
if labeled:
|
||||||
|
fieldnames.append('transcript')
|
||||||
|
self.csv_file = open(csv_filename, 'w', encoding='utf-8', newline='')
|
||||||
|
self.csv_writer = csv.DictWriter(self.csv_file, fieldnames=fieldnames)
|
||||||
|
self.csv_writer.writeheader()
|
||||||
|
self.counter = 0
|
||||||
|
|
||||||
|
def __enter__(self):
|
||||||
|
return self
|
||||||
|
|
||||||
|
def add(self, sample):
|
||||||
|
sample_filename = self.csv_dir / 'sample{0:08d}.wav'.format(self.counter)
|
||||||
|
self.counter += 1
|
||||||
|
sample.change_audio_type(AUDIO_TYPE_PCM)
|
||||||
|
write_wav(str(sample_filename), sample.audio, audio_format=sample.audio_format)
|
||||||
|
sample.sample_id = str(sample_filename.relative_to(self.csv_base_dir))
|
||||||
|
row = {
|
||||||
|
'wav_filename': str(sample_filename.absolute()) if self.absolute_paths else sample.sample_id,
|
||||||
|
'wav_filesize': sample_filename.stat().st_size
|
||||||
|
}
|
||||||
|
if self.labeled:
|
||||||
|
row['transcript'] = sample.transcript
|
||||||
|
self.csv_writer.writerow(row)
|
||||||
|
return sample.sample_id
|
||||||
|
|
||||||
|
def close(self):
|
||||||
|
if self.csv_file:
|
||||||
|
self.csv_file.close()
|
||||||
|
|
||||||
|
def __len__(self):
|
||||||
|
return self.counter
|
||||||
|
|
||||||
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
||||||
|
self.close()
|
||||||
|
|
||||||
|
|
||||||
class SampleList:
|
class SampleList:
|
||||||
"""Sample collection base class with samples loaded from a list of in-memory paths."""
|
"""Sample collection base class with samples loaded from a list of in-memory paths."""
|
||||||
def __init__(self, samples, labeled=True):
|
def __init__(self, samples, labeled=True, reverse=False):
|
||||||
"""
|
"""
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
@ -308,10 +388,12 @@ class SampleList:
|
|||||||
labeled : bool or None
|
labeled : bool or None
|
||||||
If True: Reads LabeledSample instances.
|
If True: Reads LabeledSample instances.
|
||||||
If False: Ignores transcripts (if available) and reads (unlabeled) util.audio.Sample instances.
|
If False: Ignores transcripts (if available) and reads (unlabeled) util.audio.Sample instances.
|
||||||
|
reverse : bool
|
||||||
|
If the order of the samples should be reversed
|
||||||
"""
|
"""
|
||||||
self.labeled = labeled
|
self.labeled = labeled
|
||||||
self.samples = list(samples)
|
self.samples = list(samples)
|
||||||
self.samples.sort(key=lambda r: r[1])
|
self.samples.sort(key=lambda r: r[1], reverse=reverse)
|
||||||
|
|
||||||
def __getitem__(self, i):
|
def __getitem__(self, i):
|
||||||
sample_spec = self.samples[i]
|
sample_spec = self.samples[i]
|
||||||
@ -324,7 +406,7 @@ class SampleList:
|
|||||||
class CSV(SampleList):
|
class CSV(SampleList):
|
||||||
"""Sample collection reader for reading a DeepSpeech CSV file
|
"""Sample collection reader for reading a DeepSpeech CSV file
|
||||||
Automatically orders samples by CSV column wav_filesize (if available)."""
|
Automatically orders samples by CSV column wav_filesize (if available)."""
|
||||||
def __init__(self, csv_filename, labeled=None):
|
def __init__(self, csv_filename, labeled=None, reverse=False):
|
||||||
"""
|
"""
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
@ -335,6 +417,8 @@ class CSV(SampleList):
|
|||||||
If False: Ignores transcripts (if available) and reads (unlabeled) util.audio.Sample instances.
|
If False: Ignores transcripts (if available) and reads (unlabeled) util.audio.Sample instances.
|
||||||
If None: Automatically determines if CSV file has a transcript column
|
If None: Automatically determines if CSV file has a transcript column
|
||||||
(reading util.sample_collections.LabeledSample instances) or not (reading util.audio.Sample instances).
|
(reading util.sample_collections.LabeledSample instances) or not (reading util.audio.Sample instances).
|
||||||
|
reverse : bool
|
||||||
|
If the order of the samples should be reversed
|
||||||
"""
|
"""
|
||||||
rows = []
|
rows = []
|
||||||
csv_dir = Path(csv_filename).parent
|
csv_dir = Path(csv_filename).parent
|
||||||
@ -355,10 +439,10 @@ class CSV(SampleList):
|
|||||||
rows.append((wav_filename, wav_filesize, row['transcript']))
|
rows.append((wav_filename, wav_filesize, row['transcript']))
|
||||||
else:
|
else:
|
||||||
rows.append((wav_filename, wav_filesize))
|
rows.append((wav_filename, wav_filesize))
|
||||||
super(CSV, self).__init__(rows, labeled=labeled)
|
super(CSV, self).__init__(rows, labeled=labeled, reverse=reverse)
|
||||||
|
|
||||||
|
|
||||||
def samples_from_source(sample_source, buffering=BUFFER_SIZE, labeled=None):
|
def samples_from_source(sample_source, buffering=BUFFER_SIZE, labeled=None, reverse=False):
|
||||||
"""
|
"""
|
||||||
Loads samples from a sample source file.
|
Loads samples from a sample source file.
|
||||||
|
|
||||||
@ -373,6 +457,8 @@ def samples_from_source(sample_source, buffering=BUFFER_SIZE, labeled=None):
|
|||||||
If False: Ignores transcripts (if available) and reads (unlabeled) util.audio.Sample instances.
|
If False: Ignores transcripts (if available) and reads (unlabeled) util.audio.Sample instances.
|
||||||
If None: Automatically determines if source provides transcripts
|
If None: Automatically determines if source provides transcripts
|
||||||
(reading util.sample_collections.LabeledSample instances) or not (reading util.audio.Sample instances).
|
(reading util.sample_collections.LabeledSample instances) or not (reading util.audio.Sample instances).
|
||||||
|
reverse : bool
|
||||||
|
If the order of the samples should be reversed
|
||||||
|
|
||||||
Returns
|
Returns
|
||||||
-------
|
-------
|
||||||
@ -380,13 +466,13 @@ def samples_from_source(sample_source, buffering=BUFFER_SIZE, labeled=None):
|
|||||||
"""
|
"""
|
||||||
ext = os.path.splitext(sample_source)[1].lower()
|
ext = os.path.splitext(sample_source)[1].lower()
|
||||||
if ext == '.sdb':
|
if ext == '.sdb':
|
||||||
return SDB(sample_source, buffering=buffering, labeled=labeled)
|
return SDB(sample_source, buffering=buffering, labeled=labeled, reverse=reverse)
|
||||||
if ext == '.csv':
|
if ext == '.csv':
|
||||||
return CSV(sample_source, labeled=labeled)
|
return CSV(sample_source, labeled=labeled, reverse=reverse)
|
||||||
raise ValueError('Unknown file type: "{}"'.format(ext))
|
raise ValueError('Unknown file type: "{}"'.format(ext))
|
||||||
|
|
||||||
|
|
||||||
def samples_from_sources(sample_sources, buffering=BUFFER_SIZE, labeled=None):
|
def samples_from_sources(sample_sources, buffering=BUFFER_SIZE, labeled=None, reverse=False):
|
||||||
"""
|
"""
|
||||||
Loads and combines samples from a list of source files. Sources are combined in an interleaving way to
|
Loads and combines samples from a list of source files. Sources are combined in an interleaving way to
|
||||||
keep default sample order from shortest to longest.
|
keep default sample order from shortest to longest.
|
||||||
@ -402,6 +488,8 @@ def samples_from_sources(sample_sources, buffering=BUFFER_SIZE, labeled=None):
|
|||||||
If False: Ignores transcripts (if available) and always reads (unlabeled) util.audio.Sample instances.
|
If False: Ignores transcripts (if available) and always reads (unlabeled) util.audio.Sample instances.
|
||||||
If None: Reads util.sample_collections.LabeledSample instances from sources with transcripts and
|
If None: Reads util.sample_collections.LabeledSample instances from sources with transcripts and
|
||||||
util.audio.Sample instances from sources with no transcripts.
|
util.audio.Sample instances from sources with no transcripts.
|
||||||
|
reverse : bool
|
||||||
|
If the order of the samples should be reversed
|
||||||
|
|
||||||
Returns
|
Returns
|
||||||
-------
|
-------
|
||||||
@ -411,6 +499,7 @@ def samples_from_sources(sample_sources, buffering=BUFFER_SIZE, labeled=None):
|
|||||||
if len(sample_sources) == 0:
|
if len(sample_sources) == 0:
|
||||||
raise ValueError('No files')
|
raise ValueError('No files')
|
||||||
if len(sample_sources) == 1:
|
if len(sample_sources) == 1:
|
||||||
return samples_from_source(sample_sources[0], buffering=buffering, labeled=labeled)
|
return samples_from_source(sample_sources[0], buffering=buffering, labeled=labeled, reverse=reverse)
|
||||||
cols = list(map(partial(samples_from_source, buffering=buffering, labeled=labeled), sample_sources))
|
cols = [samples_from_source(source, buffering=buffering, labeled=labeled, reverse=reverse)
|
||||||
return Interleaved(*cols, key=lambda s: s.duration)
|
for source in sample_sources]
|
||||||
|
return Interleaved(*cols, key=lambda s: s.duration, reverse=reverse)
|
||||||
|
@ -9,16 +9,20 @@ def text_to_char_array(transcript, alphabet, context=''):
|
|||||||
integers and return a numpy array representing the processed string.
|
integers and return a numpy array representing the processed string.
|
||||||
Use a string in `context` for adding text to raised exceptions.
|
Use a string in `context` for adding text to raised exceptions.
|
||||||
"""
|
"""
|
||||||
try:
|
if not alphabet.CanEncode(transcript):
|
||||||
transcript = alphabet.Encode(transcript)
|
|
||||||
if len(transcript) == 0:
|
|
||||||
raise ValueError('While processing {}: Found an empty transcript! '
|
|
||||||
'You must include a transcript for all training data.'
|
|
||||||
.format(context))
|
|
||||||
return transcript
|
|
||||||
except KeyError as e:
|
|
||||||
# Provide the row context (especially wav_filename) for alphabet errors
|
# Provide the row context (especially wav_filename) for alphabet errors
|
||||||
raise ValueError('While processing: {}\n{}'.format(context, e))
|
raise ValueError(
|
||||||
|
'Alphabet cannot encode transcript "{}" while processing sample "{}", '
|
||||||
|
'check that your alphabet contains all characters in the training corpus. '
|
||||||
|
'Missing characters are: {}.'
|
||||||
|
.format(transcript, context, list(ch for ch in transcript if not alphabet.CanEncodeSingle(ch))))
|
||||||
|
|
||||||
|
encoded = alphabet.Encode(transcript)
|
||||||
|
if len(encoded) == 0:
|
||||||
|
raise ValueError('While processing {}: Found an empty transcript! '
|
||||||
|
'You must include a transcript for all training data.'
|
||||||
|
.format(context))
|
||||||
|
return encoded
|
||||||
|
|
||||||
|
|
||||||
# The following code is from: http://hetland.org/coding/python/levenshtein.py
|
# The following code is from: http://hetland.org/coding/python/levenshtein.py
|
||||||
|
Loading…
Reference in New Issue
Block a user