Skip to content
This repository was archived by the owner on Jun 19, 2025. It is now read-only.

Commit ff12a73

Browse files
author
TheDutchMC
committed
Intermediate commit
1 parent 07ba928 commit ff12a73

File tree

27 files changed

+856
-31
lines changed

27 files changed

+856
-31
lines changed

native_client/java/Makefile

Lines changed: 27 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,41 @@
1-
.PHONY: clean apk-clean jre jre-prepare jre-libdeepspeech-jni jre-gradle jre-collect jre-clean apk-prepare
1+
.PHONY: clean android-clean jre jre-prepare jre-libdeepspeech-jni jre-gradle jre-collect jre-clean android-prepare
22

33
include ../definitions.mk
44

5-
ARCHS := $(shell grep 'ABI_FILTERS' libdeepspeech/gradle.properties | cut -d'=' -f2 | sed -e 's/;/ /g')
5+
ARCHS := $(shell grep 'ABI_FILTERS' libdeepspeech_android/gradle.properties | cut -d'=' -f2 | sed -e 's/;/ /g')
66
GRADLE ?= ./gradlew
77

8-
all: apk jre
9-
android: apk
8+
all: android jre
109
standalone: jre
1110

12-
clean: apk-clean jre-clean
11+
clean: android-clean jre-clean
1312
rm -rf *.java jni/deepspeech_wrap.cpp
1413

15-
apk-clean:
14+
android-clean:
1615
$(GRADLE) clean
1716

18-
libs-clean:
19-
rm -fr libdeepspeech/libs/*/libdeepspeech.so
17+
libdeepspeech_jre/libs/%/libdeepspeech.so:
18+
-mkdir libdeepspeech_jre/libs/$*/
19+
cp ${TFDIR}/bazel-out/$*-*/bin/native_client/libdeepspeech.so libdeepspeech_jre/libs/$*/
2020

21-
libdeepspeech/libs/%/libdeepspeech.so:
22-
-mkdir libdeepspeech/libs/$*/
23-
cp ${TFDIR}/bazel-out/$*-*/bin/native_client/libdeepspeech.so libdeepspeech/libs/$*/
21+
libdeepspeech_android/libs/%/libdeepspeech.so:
22+
-mkdir libdeepspeech_android/libs/$*/
23+
cp ${TFDIR}/bazel-out/$*-*/bin/native_client/libdeepspeech.so libdeepspeech_android/libs/$*/
2424

25-
apk-prepare:
25+
android-prepare:
2626
cp build.gradle.android build.gradle
27-
cp libdeepspeech/build.gradle.android libdeepspeech/build.gradle
28-
cp libdeepspeech/CMakeLists_android.txt libdeepspeech/CMakeLists.txt
2927

30-
apk: apk-prepare apk-clean bindings $(patsubst %,libdeepspeech/libs/%/libdeepspeech.so,$(ARCHS))
28+
android: android-prepare android-clean bindings $(patsubst %,libdeepspeech/libs/%/libdeepspeech.so,$(ARCHS))
3129
$(GRADLE) build
3230

3331
jre: jre-prepare jre-collect jre-restore-makefile jre-clean
34-
jre-prepare: $(patsubst %,libdeepspeech/libs/%/libdeepspeech.so,$(ARCHS))
32+
jre-prepare: $(patsubst %,libdeepspeech_jre/libs/%/libdeepspeech.so,$(ARCHS))
3533
cp Makefile Makefile.original
3634
cp build.gradle.standalone build.gradle
37-
cp libdeepspeech/build.gradle.standalone libdeepspeech/build.gradle
38-
cp libdeepspeech/CMakeLists_standalone.txt libdeepspeech/CMakeLists.txt
39-
sed -i 's|__JAVA_HOME__|'${JAVA_HOME}'|g' libdeepspeech/CMakeLists.txt
35+
sed -i 's|__JAVA_HOME__|'${JAVA_HOME}'|g' libdeepspeech_jre/CMakeLists.txt
4036

4137
jre-libdeepspeech-jni: bindings
42-
cd libdeepspeech; \
38+
cd libdeepspeech_jre; \
4339
cmake .; \
4440
$(MAKE)
4541

@@ -48,24 +44,26 @@ jre-gradle: jre-libdeepspeech-jni
4844

4945
jre-collect: jre-gradle
5046
mkdir -p build
51-
mv libdeepspeech/libdeepspeech-jni.so build/
52-
cp libdeepspeech/libs/x86_64/libdeepspeech.so build/
53-
cp libdeepspeech/build/libs/libdeepspeech.jar build/
47+
mv libdeepspeech_jre/libdeepspeech-jni.so build/
48+
cp libdeepspeech_jre/libs/x86_64/libdeepspeech.so build/
49+
cp libdeepspeech_jre/build/libs/libdeepspeech.jar build/
5450

5551
jre-clean:
56-
rm -f libdeepspeech/CMakeLists.txt
57-
rm -f libdeepspeech/build.gradle
5852
rm -f build.gradle
5953
rm -f jni/deepspeech_wrap.cpp jni/deepspeech_wrap.o
60-
rm -rf libdeepspeech/cmake_install.cmake libdeepspeech/CMakeCache.txt libdeepspeech/Makefile libdeepspeech/CMakeFiles/
61-
rm -rf libdeepspeech/build/
54+
rm -rf libdeepspeech_jre/cmake_install.cmake libdeepspeech_jre/CMakeCache.txt libdeepspeech_jre/Makefile libdeepspeech_jre/CMakeFiles/
55+
rm -rf libdeepspeech_jre/build/
6256

6357
jre-restore-makefile:
6458
mv Makefile.original Makefile
6559

66-
maven-bundle: apk
60+
maven-bundle: android
6761
$(GRADLE) uploadArchives
6862
$(GRADLE) zipMavenArtifacts
6963

7064
bindings: clean ds-swig
71-
$(DS_SWIG_ENV) swig -c++ -java -package org.deepspeech.libdeepspeech -outdir libdeepspeech/src/main/java/org/deepspeech/libdeepspeech/ -o jni/deepspeech_wrap.cpp jni/deepspeech.i
65+
mkdir -p ./tmp
66+
$(DS_SWIG_ENV) swig -c++ -java -package org.deepspeech.libdeepspeech -outdir ./tmp -o jni/deepspeech_wrap.cpp jni/deepspeech.i
67+
cp ./tmp/* libdeepspeech_android/src/main/java/org/deepspeech/libdeepspeech/
68+
cp ./tmp/* libdeepspeech_jre/src/main/java/org/deepspeech/libdeepspeech/
69+
rm -rf ./tmp

native_client/java/Makefile.original

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
.PHONY: clean android-clean jre jre-prepare jre-libdeepspeech-jni jre-gradle jre-collect jre-clean android-prepare
2+
3+
include ../definitions.mk
4+
5+
ARCHS := $(shell grep 'ABI_FILTERS' libdeepspeech/gradle.properties | cut -d'=' -f2 | sed -e 's/;/ /g')
6+
GRADLE ?= ./gradlew
7+
8+
all: android jre
9+
standalone: jre
10+
11+
clean: android-clean jre-clean
12+
rm -rf *.java jni/deepspeech_wrap.cpp
13+
14+
android-clean:
15+
$(GRADLE) clean
16+
17+
libdeepspeech_jre/libs/%/libdeepspeech.so:
18+
-mkdir libdeepspeech_jre/libs/$*/
19+
cp ${TFDIR}/bazel-out/$*-*/bin/native_client/libdeepspeech.so libdeepspeech_jre/libs/$*/
20+
21+
libdeepspeech_android/libs/%/libdeepspeech.so:
22+
-mkdir libdeepspeech_android/libs/$*/
23+
cp ${TFDIR}/bazel-out/$*-*/bin/native_client/libdeepspeech.so libdeepspeech_android/libs/$*/
24+
25+
android-prepare:
26+
cp build.gradle.android build.gradle
27+
28+
android: android-prepare android-clean bindings $(patsubst %,libdeepspeech/libs/%/libdeepspeech.so,$(ARCHS))
29+
$(GRADLE) build
30+
31+
jre: jre-prepare jre-collect jre-restore-makefile jre-clean
32+
jre-prepare: $(patsubst %,libdeepspeech_jre/libs/%/libdeepspeech.so,$(ARCHS))
33+
cp Makefile Makefile.original
34+
cp build.gradle.standalone build.gradle
35+
sed -i 's|__JAVA_HOME__|'${JAVA_HOME}'|g' libdeepspeech_jre/CMakeLists.txt
36+
37+
jre-libdeepspeech-jni: bindings
38+
cd libdeepspeech_jre; \
39+
cmake .; \
40+
$(MAKE)
41+
42+
jre-gradle: jre-libdeepspeech-jni
43+
$(GRADLE) build
44+
45+
jre-collect: jre-gradle
46+
mkdir -p build
47+
mv libdeepspeech_jre/libdeepspeech-jni.so build/
48+
cp libdeepspeech_jre/libs/x86_64/libdeepspeech.so build/
49+
cp libdeepspeech_jre/build/libs/libdeepspeech.jar build/
50+
51+
jre-clean:
52+
rm -f build.gradle
53+
rm -f jni/deepspeech_wrap.cpp jni/deepspeech_wrap.o
54+
rm -rf libdeepspeech_jre/cmake_install.cmake libdeepspeech_jre/CMakeCache.txt libdeepspeech_jre/Makefile libdeepspeech_jre/CMakeFiles/
55+
rm -rf libdeepspeech_jre/build/
56+
57+
jre-restore-makefile:
58+
mv Makefile.original Makefile
59+
60+
maven-bundle: android
61+
$(GRADLE) uploadArchives
62+
$(GRADLE) zipMavenArtifacts
63+
64+
bindings: clean ds-swig
65+
$(DS_SWIG_ENV) swig -c++ -java -package org.deepspeech.libdeepspeech -outdir libdeepspeech_android/src/main/java/org/deepspeech/libdeepspeech/ -o jni/deepspeech_wrap.cpp jni/deepspeech.i
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/build
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ABI_FILTERS = arm64-v8a;armeabi-v7a;x86_64
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
arm64-v8a/
2+
armeabi-v7a/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
package org.deepspeech.libdeepspeech.test;
2+
3+
import android.content.Context;
4+
import android.support.test.InstrumentationRegistry;
5+
import android.support.test.runner.AndroidJUnit4;
6+
7+
import org.junit.Test;
8+
import org.junit.FixMethodOrder;
9+
import org.junit.runner.RunWith;
10+
import org.junit.runners.MethodSorters;
11+
12+
import static org.junit.Assert.*;
13+
14+
import org.deepspeech.libdeepspeech.DeepSpeechModel;
15+
import org.deepspeech.libdeepspeech.CandidateTranscript;
16+
17+
import java.io.RandomAccessFile;
18+
import java.io.FileNotFoundException;
19+
import java.io.IOException;
20+
import java.nio.ByteOrder;
21+
import java.nio.ByteBuffer;
22+
23+
/**
24+
* Instrumented test, which will execute on an Android device.
25+
*
26+
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
27+
*/
28+
@RunWith(AndroidJUnit4.class)
29+
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
30+
public class BasicTest {
31+
32+
public static final String modelFile = "/data/local/tmp/test/output_graph.tflite";
33+
public static final String scorerFile = "/data/local/tmp/test/kenlm.scorer";
34+
public static final String wavFile = "/data/local/tmp/test/LDC93S1.wav";
35+
public static final String[] word = {"friend", "enemy", "family"};
36+
public static final float[] boost = {1.5f, 0f, -20.4f};
37+
38+
private char readLEChar(RandomAccessFile f) throws IOException {
39+
byte b1 = f.readByte();
40+
byte b2 = f.readByte();
41+
return (char)((b2 << 8) | b1);
42+
}
43+
44+
private int readLEInt(RandomAccessFile f) throws IOException {
45+
byte b1 = f.readByte();
46+
byte b2 = f.readByte();
47+
byte b3 = f.readByte();
48+
byte b4 = f.readByte();
49+
return (int)((b1 & 0xFF) | (b2 & 0xFF) << 8 | (b3 & 0xFF) << 16 | (b4 & 0xFF) << 24);
50+
}
51+
52+
@Test
53+
public void useAppContext() {
54+
// Context of the app under test.
55+
Context appContext = InstrumentationRegistry.getTargetContext();
56+
57+
assertEquals("org.deepspeech.libdeepspeech.test", appContext.getPackageName());
58+
}
59+
60+
@Test
61+
public void loadDeepSpeech_basic() {
62+
DeepSpeechModel m = new DeepSpeechModel(modelFile);
63+
m.freeModel();
64+
}
65+
66+
private String candidateTranscriptToString(CandidateTranscript t) {
67+
String retval = "";
68+
for (int i = 0; i < t.getNumTokens(); ++i) {
69+
retval += t.getToken(i).getText();
70+
}
71+
return retval;
72+
}
73+
74+
private String doSTT(DeepSpeechModel m, boolean extendedMetadata) {
75+
try {
76+
RandomAccessFile wave = new RandomAccessFile(wavFile, "r");
77+
78+
wave.seek(20); char audioFormat = this.readLEChar(wave);
79+
assert (audioFormat == 1); // 1 is PCM
80+
81+
wave.seek(22); char numChannels = this.readLEChar(wave);
82+
assert (numChannels == 1); // MONO
83+
84+
wave.seek(24); int sampleRate = this.readLEInt(wave);
85+
assert (sampleRate == 16000); // 16000 Hz
86+
87+
wave.seek(34); char bitsPerSample = this.readLEChar(wave);
88+
assert (bitsPerSample == 16); // 16 bits per sample
89+
90+
wave.seek(40); int bufferSize = this.readLEInt(wave);
91+
assert (bufferSize > 0);
92+
93+
wave.seek(44);
94+
byte[] bytes = new byte[bufferSize];
95+
wave.readFully(bytes);
96+
97+
short[] shorts = new short[bytes.length/2];
98+
// to turn bytes to shorts as either big endian or little endian.
99+
ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(shorts);
100+
101+
if (extendedMetadata) {
102+
return candidateTranscriptToString(m.sttWithMetadata(shorts, shorts.length, 1).getTranscript(0));
103+
} else {
104+
return m.stt(shorts, shorts.length);
105+
}
106+
} catch (FileNotFoundException ex) {
107+
108+
} catch (IOException ex) {
109+
110+
} finally {
111+
112+
}
113+
114+
return "";
115+
}
116+
117+
@Test
118+
public void loadDeepSpeech_stt_noLM() {
119+
DeepSpeechModel m = new DeepSpeechModel(modelFile);
120+
121+
String decoded = doSTT(m, false);
122+
assertEquals("she had your dark suit in greasy wash water all year", decoded);
123+
m.freeModel();
124+
}
125+
126+
@Test
127+
public void loadDeepSpeech_stt_withLM() {
128+
DeepSpeechModel m = new DeepSpeechModel(modelFile);
129+
m.enableExternalScorer(scorerFile);
130+
131+
String decoded = doSTT(m, false);
132+
assertEquals("she had your dark suit in greasy wash water all year", decoded);
133+
m.freeModel();
134+
}
135+
136+
@Test
137+
public void loadDeepSpeech_sttWithMetadata_noLM() {
138+
DeepSpeechModel m = new DeepSpeechModel(modelFile);
139+
140+
String decoded = doSTT(m, true);
141+
assertEquals("she had your dark suit in greasy wash water all year", decoded);
142+
m.freeModel();
143+
}
144+
145+
@Test
146+
public void loadDeepSpeech_sttWithMetadata_withLM() {
147+
DeepSpeechModel m = new DeepSpeechModel(modelFile);
148+
m.enableExternalScorer(scorerFile);
149+
150+
String decoded = doSTT(m, true);
151+
assertEquals("she had your dark suit in greasy wash water all year", decoded);
152+
m.freeModel();
153+
}
154+
155+
@Test
156+
public void loadDeepSpeech_HotWord_withLM() {
157+
DeepSpeechModel m = new DeepSpeechModel(modelFile);
158+
m.enableExternalScorer(scorerFile);
159+
160+
for(int i = 0; i < word.length; i++) {
161+
m.addHotWord(word[i], boost[i]);
162+
String decoded = doSTT(m, false);
163+
assertEquals("she had your dark suit in greasy wash water all year", decoded);
164+
m.eraseHotWord(word[i]);
165+
}
166+
167+
m.freeModel();
168+
}
169+
170+
@Test
171+
public void loadDeepSpeech_HotWord_noLM() {
172+
DeepSpeechModel m = new DeepSpeechModel(modelFile);
173+
try {
174+
m.addHotWord(word[0], boost[0]);
175+
assert(false);
176+
}
177+
catch(Exception e) {
178+
assertEquals("Error: External scorer is not enabled. (0x2004).", e.getMessage());
179+
}
180+
finally {
181+
m.freeModel();
182+
assert(true);
183+
}
184+
}
185+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
2+
package="org.deepspeech.libdeepspeech" />

0 commit comments

Comments
 (0)