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 3e1922ea370c110f9854ae7e97101f2ea00f55c6.
This commit is contained in:
CatalinVoss 2020-11-23 18:32:18 -08:00 committed by Reuben Morais
parent bcfc74874f
commit 32b6067a01
10 changed files with 61 additions and 18 deletions

1
.gitignore vendored
View File

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

View File

@ -3,6 +3,7 @@
load("@org_tensorflow//tensorflow:tensorflow.bzl", "tf_cc_shared_object") load("@org_tensorflow//tensorflow:tensorflow.bzl", "tf_cc_shared_object")
load("@local_config_cuda//cuda:build_defs.bzl", "if_cuda") load("@local_config_cuda//cuda:build_defs.bzl", "if_cuda")
load("@com_github_nelhage_rules_boost//:boost/boost.bzl", "boost_deps") load("@com_github_nelhage_rules_boost//:boost/boost.bzl", "boost_deps")
load("@build_bazel_rules_apple//apple:ios.bzl", "ios_static_framework")
load( load(
"@org_tensorflow//tensorflow/lite:build_def.bzl", "@org_tensorflow//tensorflow/lite:build_def.bzl",
@ -110,8 +111,8 @@ cc_library(
], ],
) )
tf_cc_shared_object( cc_library(
name = "libdeepspeech.so", name = "deepspeech_bundle",
srcs = [ srcs = [
"deepspeech.cc", "deepspeech.cc",
"deepspeech.h", "deepspeech.h",
@ -203,6 +204,19 @@ tf_cc_shared_object(
]) + [":decoder"], ]) + [":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( genrule(
name = "libdeepspeech_so_dsym", name = "libdeepspeech_so_dsym",
srcs = [":libdeepspeech.so"], srcs = [":libdeepspeech.so"],

View File

@ -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

View File

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

View File

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

View File

@ -11,8 +11,6 @@
504EC34424CF4EFD0073C22E /* AudioContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504EC34224CF4EFD0073C22E /* AudioContext.swift */; }; 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, ); }; }; 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 */; }; 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 */; }; 50F787F32497683900D52237 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F787F22497683900D52237 /* AppDelegate.swift */; };
50F787F52497683900D52237 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F787F42497683900D52237 /* SceneDelegate.swift */; }; 50F787F52497683900D52237 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F787F42497683900D52237 /* SceneDelegate.swift */; };
50F787F72497683900D52237 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F787F62497683900D52237 /* ContentView.swift */; }; 50F787F72497683900D52237 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F787F62497683900D52237 /* ContentView.swift */; };
@ -48,7 +46,6 @@
dstSubfolderSpec = 10; dstSubfolderSpec = 10;
files = ( files = (
504EC34524CF4F4F0073C22E /* deepspeech_ios.framework in Embed Frameworks */, 504EC34524CF4F4F0073C22E /* deepspeech_ios.framework in Embed Frameworks */,
507CD3A424B61FFC00409BBB /* libdeepspeech.so in Embed Frameworks */,
); );
name = "Embed Frameworks"; name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
@ -81,7 +78,6 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
507CD3A324B61FEB00409BBB /* libdeepspeech.so in Frameworks */,
507CD3A124B61FE400409BBB /* deepspeech_ios.framework in Frameworks */, 507CD3A124B61FE400409BBB /* deepspeech_ios.framework in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;

View File

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

View File

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

View File

@ -10,10 +10,6 @@ mkdir -p ${TASKCLUSTER_ARTIFACTS} || true
cp ${DS_ROOT_TASK}/DeepSpeech/ds/tensorflow/bazel*.log ${TASKCLUSTER_ARTIFACTS}/ 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 case $arch in
"--x86_64") "--x86_64")
release_folder="Release-iphonesimulator" release_folder="Release-iphonesimulator"

View File

@ -340,7 +340,7 @@ do_nuget_build()
do_deepspeech_ios_framework_build() do_deepspeech_ios_framework_build()
{ {
arch=$1 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 cd ${DS_DSDIR}/native_client/swift
case $arch in case $arch in
"--x86_64") "--x86_64")