Enable static build of DeepSpeech iOS framework

Set up additional `deepspeech_ios` target with static build steps

Xcode config: lock swift version at 5.0, bundle framework rather than dynamic lib, never strip swift symbols, add framework search paths, and bring in lstdc++

Runtime schema config: disable the main thread checker as this causes trouble with the static build

Update model versions to 0.9.1

Remove libdeepspeech.so from example app bundling steps

Swift lib embed settings that are somehow essential

Attempt to adjust taskcluster build steps

Add a basic podspec

Add framework to gitignore

Fix podspec version code

Attempt to fix taskcluster unzip step

Switch deepspeech targets for iOS build

Try doing this unzip in one step

Remove packaging steps for unneeded stuff because libdeepspeech.so is no longer a thing here. I suppose we could add a step to package the iOS static lib instead.

Fix podspec version

Set up podspec relative assuming a clone from the repo root

Remove space in iOS package step

Fix buildfile nit

Link stdc++ in explicitly with iOS build only

Revert "Remove space in iOS package step"

This reverts commit 3e1922ea37.
This commit is contained in:
CatalinVoss 2020-11-23 18:32:18 -08:00 коммит произвёл Reuben Morais
Родитель bcfc74874f
Коммит 32b6067a01
10 изменённых файлов: 61 добавлений и 18 удалений

1
.gitignore поставляемый
Просмотреть файл

@ -38,3 +38,4 @@ doc/xml-c
doc/xml-java
doc/xml-dotnet
convert_graphdef_memmapped_format
native_client/swift/deepspeech_ios.framework/deepspeech_ios

Просмотреть файл

@ -3,6 +3,7 @@
load("@org_tensorflow//tensorflow:tensorflow.bzl", "tf_cc_shared_object")
load("@local_config_cuda//cuda:build_defs.bzl", "if_cuda")
load("@com_github_nelhage_rules_boost//:boost/boost.bzl", "boost_deps")
load("@build_bazel_rules_apple//apple:ios.bzl", "ios_static_framework")
load(
"@org_tensorflow//tensorflow/lite:build_def.bzl",
@ -110,8 +111,8 @@ cc_library(
],
)
tf_cc_shared_object(
name = "libdeepspeech.so",
cc_library(
name = "deepspeech_bundle",
srcs = [
"deepspeech.cc",
"deepspeech.h",
@ -203,6 +204,19 @@ tf_cc_shared_object(
]) + [":decoder"],
)
tf_cc_shared_object(
name = "libdeepspeech.so",
deps = [":deepspeech_bundle"],
)
ios_static_framework(
name = "deepspeech_ios",
deps = [":deepspeech_bundle"],
families = ["iphone", "ipad"],
minimum_os_version = "9.0",
linkopts = ["-lstdc++"],
)
genrule(
name = "libdeepspeech_so_dsym",
srcs = [":libdeepspeech.so"],

Просмотреть файл

@ -0,0 +1,19 @@
# Pull in version from outside
version = File.read(File.join(__dir__, "../../training/deepspeech_training/VERSION")).split("\n")[0]
Pod::Spec.new do |s|
s.name = "deepspeech-ios"
s.version = version
s.summary = "DeepSpeech"
s.homepage = "https://github.com/mozilla/DeepSpeech"
s.license = "Mozilla Public License 2.0"
s.authors = "Mozilla et al."
s.platforms = { :ios => "9.0" }
s.source = { :git => "https://github.com/mozilla/DeepSpeech.git", :tag => "v#{s.version}" }
# Assuming taskcluster build location. Depending on your Xcode setup, this might be in
# build/Release-iphoneos/deepspeech_ios.framework instead.
s.vendored_frameworks = "native_client/swift/DerivedData/Build/Products/Release-iphoneos/deepspeech_ios.framework"
s.source_files = "native_client/swift/deepspeech_ios/**/*.{h,m,mm,swift}"
end

Просмотреть файл

@ -11,7 +11,7 @@
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 */; };
AD2FD0F925678F8800314F2E /* deepspeech_ios.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD2FD0F825678F8800314F2E /* deepspeech_ios.framework */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@ -45,7 +45,7 @@
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>"; };
AD2FD0F825678F8800314F2E /* deepspeech_ios.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = deepspeech_ios.framework; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -53,7 +53,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
507CD39B24B61FA100409BBB /* libdeepspeech.so in Frameworks */,
AD2FD0F925678F8800314F2E /* deepspeech_ios.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -101,7 +101,7 @@
505B1380249620C60007DADA /* Frameworks */ = {
isa = PBXGroup;
children = (
507CD39A24B61FA100409BBB /* libdeepspeech.so */,
AD2FD0F825678F8800314F2E /* deepspeech_ios.framework */,
);
name = Frameworks;
sourceTree = "<group>";
@ -243,6 +243,7 @@
505B137324960D550007DADA /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
@ -296,8 +297,10 @@
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
STRIP_SWIFT_SYMBOLS = NO;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
@ -306,6 +309,7 @@
505B137424960D550007DADA /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
@ -352,8 +356,10 @@
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = iphoneos;
STRIP_SWIFT_SYMBOLS = NO;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
SWIFT_VERSION = 5.0;
VALIDATE_PRODUCT = YES;
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
@ -372,6 +378,10 @@
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)",
);
INFOPLIST_FILE = deepspeech_ios/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
@ -386,6 +396,7 @@
);
MODULEMAP_FILE = deepspeech_ios/deepspeech_ios.modulemap;
PRODUCT_BUNDLE_IDENTIFIER = "org.mozilla.deepspeech-ios";
OTHER_LDFLAGS = "-lstdc++";
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SKIP_INSTALL = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@ -406,6 +417,10 @@
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)",
);
INFOPLIST_FILE = deepspeech_ios/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
@ -420,6 +435,7 @@
);
MODULEMAP_FILE = deepspeech_ios/deepspeech_ios.modulemap;
PRODUCT_BUNDLE_IDENTIFIER = "org.mozilla.deepspeech-ios";
OTHER_LDFLAGS = "-lstdc++";
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SKIP_INSTALL = YES;
SWIFT_VERSION = 5.0;

Просмотреть файл

@ -44,6 +44,7 @@
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
disableMainThreadChecker = "YES"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"

Просмотреть файл

@ -11,8 +11,6 @@
504EC34424CF4EFD0073C22E /* AudioContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504EC34224CF4EFD0073C22E /* AudioContext.swift */; };
504EC34524CF4F4F0073C22E /* deepspeech_ios.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 507CD3A024B61FE400409BBB /* deepspeech_ios.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
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 */; };
@ -48,7 +46,6 @@
dstSubfolderSpec = 10;
files = (
504EC34524CF4F4F0073C22E /* deepspeech_ios.framework in Embed Frameworks */,
507CD3A424B61FFC00409BBB /* libdeepspeech.so in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
@ -81,7 +78,6 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
507CD3A324B61FEB00409BBB /* libdeepspeech.so in Frameworks */,
507CD3A124B61FE400409BBB /* deepspeech_ios.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;

Просмотреть файл

@ -26,8 +26,8 @@ class SpeechRecognitionImpl : NSObject, AVCaptureAudioDataOutputSampleBufferDele
private var audioData = Data()
override init() {
let modelPath = Bundle.main.path(forResource: "deepspeech-0.7.4-models", ofType: "tflite")!
let scorerPath = Bundle.main.path(forResource: "deepspeech-0.7.4-models", ofType: "scorer")!
let modelPath = Bundle.main.path(forResource: "deepspeech-0.9.1-models", ofType: "tflite")!
let scorerPath = Bundle.main.path(forResource: "deepspeech-0.9.1-models", ofType: "scorer")!
model = try! DeepSpeechModel(modelPath: modelPath)
try! model.enableExternalScorer(scorerPath: scorerPath)

Просмотреть файл

@ -9,7 +9,7 @@ source $(dirname "$0")/tc-tests-utils.sh
source $(dirname "$0")/tf_tc-vars.sh
BAZEL_TARGETS="
//native_client:libdeepspeech.so
//native_client:deepspeech_ios
"
if [ "${arch}" = "--arm64" ]; then

Просмотреть файл

@ -10,10 +10,6 @@ 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"

Просмотреть файл

@ -340,7 +340,7 @@ do_nuget_build()
do_deepspeech_ios_framework_build()
{
arch=$1
cp ${DS_TFDIR}/bazel-bin/native_client/libdeepspeech.so ${DS_DSDIR}/native_client/swift/libdeepspeech.so
unzip ${DS_TFDIR}/bazel-bin/native_client/deepspeech_ios.zip -d ${DS_DSDIR}/native_client/swift
cd ${DS_DSDIR}/native_client/swift
case $arch in
"--x86_64")