Toggle navigation
Toggle navigation
此项目
正在载入...
Sign in
xuning
/
sherpaonnx
转到一个项目
Toggle navigation
项目
群组
代码片段
帮助
Toggle navigation pinning
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Authored by
Fangjun Kuang
2025-04-25 11:18:57 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Committed by
GitHub
2025-04-25 11:18:57 +0800
Commit
e3280027f95cff53b21588d721404009695ffda2
e3280027
1 parent
48ab90aa
Support decoding multiple streams in Java API. (#2149)
隐藏空白字符变更
内嵌
并排对比
正在显示
7 个修改的文件
包含
160 行增加
和
3 行删除
.github/workflows/run-java-test.yaml
java-api-examples/NonStreamingDecodeFileWhisperMultiple.java
java-api-examples/run-non-streaming-decode-file-whisper-multiple.sh
sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/OfflineRecognizer.java
sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/OnlineRecognizer.java
sherpa-onnx/jni/offline-recognizer.cc
sherpa-onnx/jni/online-recognizer.cc
.github/workflows/run-java-test.yaml
查看文件 @
e328002
...
...
@@ -166,6 +166,8 @@ jobs:
rm -rf sherpa-onnx-fire-red-*
./run-non-streaming-decode-file-whisper.sh
./run-non-streaming-decode-file-whisper-multiple.sh
rm -rf sherpa-onnx-whisper-*
./run-non-streaming-decode-file-nemo.sh
...
...
java-api-examples/NonStreamingDecodeFileWhisperMultiple.java
0 → 100644
查看文件 @
e328002
// Copyright 2025 Xiaomi Corporation
// This file shows how to use an offline whisper, i.e., non-streaming whisper,
// to decode files.
import
com.k2fsa.sherpa.onnx.*
;
public
class
NonStreamingDecodeFileWhisperMultiple
{
public
static
void
main
(
String
[]
args
)
{
// please refer to
// https://k2-fsa.github.io/sherpa/onnx/pretrained_models/whisper/tiny.en.html
// to download model files
String
encoder
=
"./sherpa-onnx-whisper-tiny.en/tiny.en-encoder.int8.onnx"
;
String
decoder
=
"./sherpa-onnx-whisper-tiny.en/tiny.en-decoder.int8.onnx"
;
String
tokens
=
"./sherpa-onnx-whisper-tiny.en/tiny.en-tokens.txt"
;
String
waveFilename0
=
"./sherpa-onnx-whisper-tiny.en/test_wavs/0.wav"
;
String
waveFilename1
=
"./sherpa-onnx-whisper-tiny.en/test_wavs/1.wav"
;
WaveReader
reader0
=
new
WaveReader
(
waveFilename0
);
WaveReader
reader1
=
new
WaveReader
(
waveFilename1
);
OfflineWhisperModelConfig
whisper
=
OfflineWhisperModelConfig
.
builder
().
setEncoder
(
encoder
).
setDecoder
(
decoder
).
build
();
OfflineModelConfig
modelConfig
=
OfflineModelConfig
.
builder
()
.
setWhisper
(
whisper
)
.
setTokens
(
tokens
)
.
setNumThreads
(
1
)
.
setDebug
(
true
)
.
build
();
OfflineRecognizerConfig
config
=
OfflineRecognizerConfig
.
builder
()
.
setOfflineModelConfig
(
modelConfig
)
.
setDecodingMethod
(
"greedy_search"
)
.
build
();
OfflineRecognizer
recognizer
=
new
OfflineRecognizer
(
config
);
OfflineStream
stream0
=
recognizer
.
createStream
();
stream0
.
acceptWaveform
(
reader0
.
getSamples
(),
reader0
.
getSampleRate
());
OfflineStream
stream1
=
recognizer
.
createStream
();
stream1
.
acceptWaveform
(
reader1
.
getSamples
(),
reader1
.
getSampleRate
());
OfflineStream
[]
ss
=
new
OfflineStream
[]
{
stream0
,
stream1
};
recognizer
.
decode
(
ss
);
String
text0
=
recognizer
.
getResult
(
stream0
).
getText
();
String
text1
=
recognizer
.
getResult
(
stream1
).
getText
();
System
.
out
.
printf
(
"filename0:%s\nresult0:%s\n\n"
,
waveFilename0
,
text0
);
System
.
out
.
printf
(
"filename1:%s\nresult1:%s\n\n"
,
waveFilename1
,
text1
);
stream0
.
release
();
stream1
.
release
();
recognizer
.
release
();
}
}
...
...
java-api-examples/run-non-streaming-decode-file-whisper-multiple.sh
0 → 100755
查看文件 @
e328002
#!/usr/bin/env bash
set
-ex
if
[[
! -f ../build/lib/libsherpa-onnx-jni.dylib
&&
! -f ../build/lib/libsherpa-onnx-jni.so
]]
;
then
mkdir -p ../build
pushd
../build
cmake
\
-DSHERPA_ONNX_ENABLE_PYTHON
=
OFF
\
-DSHERPA_ONNX_ENABLE_TESTS
=
OFF
\
-DSHERPA_ONNX_ENABLE_CHECK
=
OFF
\
-DBUILD_SHARED_LIBS
=
ON
\
-DSHERPA_ONNX_ENABLE_PORTAUDIO
=
OFF
\
-DSHERPA_ONNX_ENABLE_JNI
=
ON
\
..
make -j4
ls -lh lib
popd
fi
if
[
! -f ../sherpa-onnx/java-api/build/sherpa-onnx.jar
]
;
then
pushd
../sherpa-onnx/java-api
make
popd
fi
if
[
! -f ./sherpa-onnx-whisper-tiny.en/tiny.en-tokens.txt
]
;
then
curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-whisper-tiny.en.tar.bz2
tar xvf sherpa-onnx-whisper-tiny.en.tar.bz2
rm sherpa-onnx-whisper-tiny.en.tar.bz2
fi
java
\
-Djava.library.path
=
$PWD
/../build/lib
\
-cp ../sherpa-onnx/java-api/build/sherpa-onnx.jar
\
NonStreamingDecodeFileWhisperMultiple.java
...
...
sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/OfflineRecognizer.java
查看文件 @
e328002
...
...
@@ -17,6 +17,14 @@ public class OfflineRecognizer {
decode
(
ptr
,
s
.
getPtr
());
}
public
void
decode
(
OfflineStream
[]
ss
)
{
long
[]
streamPtrs
=
new
long
[
ss
.
length
];
for
(
int
i
=
0
;
i
<
ss
.
length
;
++
i
)
{
streamPtrs
[
i
]
=
ss
[
i
].
getPtr
();
}
decodeStreams
(
ptr
,
streamPtrs
);
}
public
OfflineStream
createStream
()
{
long
p
=
createStream
(
ptr
);
return
new
OfflineStream
(
p
);
...
...
@@ -55,5 +63,7 @@ public class OfflineRecognizer {
private
native
void
decode
(
long
ptr
,
long
streamPtr
);
private
native
void
decodeStreams
(
long
ptr
,
long
[]
streamPtrs
);
private
native
Object
[]
getResult
(
long
streamPtr
);
}
...
...
sherpa-onnx/java-api/src/com/k2fsa/sherpa/onnx/OnlineRecognizer.java
查看文件 @
e328002
...
...
@@ -18,6 +18,14 @@ public class OnlineRecognizer {
decode
(
ptr
,
s
.
getPtr
());
}
public
void
decode
(
OnlineStream
[]
ss
)
{
long
[]
streamPtrs
=
new
long
[
ss
.
length
];
for
(
int
i
=
0
;
i
<
ss
.
length
;
++
i
)
{
streamPtrs
[
i
]
=
ss
[
i
].
getPtr
();
}
decodeStreams
(
ptr
,
streamPtrs
);
}
public
boolean
isReady
(
OnlineStream
s
)
{
return
isReady
(
ptr
,
s
.
getPtr
());
}
...
...
@@ -68,6 +76,8 @@ public class OnlineRecognizer {
private
native
void
decode
(
long
ptr
,
long
streamPtr
);
private
native
void
decodeStreams
(
long
ptr
,
long
[]
streamPtrs
);
private
native
boolean
isEndpoint
(
long
ptr
,
long
streamPtr
);
private
native
boolean
isReady
(
long
ptr
,
long
streamPtr
);
...
...
sherpa-onnx/jni/offline-recognizer.cc
查看文件 @
e328002
...
...
@@ -366,22 +366,44 @@ Java_com_k2fsa_sherpa_onnx_OfflineRecognizer_createStream(JNIEnv * /*env*/,
SHERPA_ONNX_EXTERN_C
JNIEXPORT
void
JNICALL
Java_com_k2fsa_sherpa_onnx_OfflineRecognizer_decode
(
JNIEnv
*
env
,
jobject
/*obj*/
,
jlong
ptr
,
jlong
stream
P
tr
)
{
JNIEnv
*
env
,
jobject
/*obj*/
,
jlong
ptr
,
jlong
stream
_p
tr
)
{
SafeJNI
(
env
,
"OfflineRecognizer_decode"
,
[
&
]
{
if
(
!
ValidatePointer
(
env
,
ptr
,
"OfflineRecognizer_decode"
,
"OfflineRecognizer pointer is null."
)
||
!
ValidatePointer
(
env
,
stream
P
tr
,
"OfflineRecognizer_decode"
,
!
ValidatePointer
(
env
,
stream
_p
tr
,
"OfflineRecognizer_decode"
,
"OfflineStream pointer is null."
))
{
return
;
}
auto
recognizer
=
reinterpret_cast
<
sherpa_onnx
::
OfflineRecognizer
*>
(
ptr
);
auto
stream
=
reinterpret_cast
<
sherpa_onnx
::
OfflineStream
*>
(
stream
P
tr
);
auto
stream
=
reinterpret_cast
<
sherpa_onnx
::
OfflineStream
*>
(
stream
_p
tr
);
recognizer
->
DecodeStream
(
stream
);
});
}
SHERPA_ONNX_EXTERN_C
JNIEXPORT
void
JNICALL
Java_com_k2fsa_sherpa_onnx_OfflineRecognizer_decodeStreams
(
JNIEnv
*
env
,
jobject
/*obj*/
,
jlong
ptr
,
jlongArray
stream_ptrs
)
{
SafeJNI
(
env
,
"OfflineRecognizer_decode_streams"
,
[
&
]
{
if
(
!
ValidatePointer
(
env
,
ptr
,
"OfflineRecognizer_decode_streams"
,
"OfflineRecognizer pointer is null."
))
{
return
;
}
auto
recognizer
=
reinterpret_cast
<
sherpa_onnx
::
OfflineRecognizer
*>
(
ptr
);
jlong
*
p
=
env
->
GetLongArrayElements
(
stream_ptrs
,
nullptr
);
jsize
n
=
env
->
GetArrayLength
(
stream_ptrs
);
auto
ss
=
reinterpret_cast
<
sherpa_onnx
::
OfflineStream
**>
(
p
);
recognizer
->
DecodeStreams
(
ss
,
n
);
env
->
ReleaseLongArrayElements
(
stream_ptrs
,
p
,
JNI_ABORT
);
});
}
SHERPA_ONNX_EXTERN_C
JNIEXPORT
jobjectArray
JNICALL
Java_com_k2fsa_sherpa_onnx_OfflineRecognizer_getResult
(
JNIEnv
*
env
,
jobject
/*obj*/
,
...
...
sherpa-onnx/jni/online-recognizer.cc
查看文件 @
e328002
...
...
@@ -340,6 +340,22 @@ JNIEXPORT void JNICALL Java_com_k2fsa_sherpa_onnx_OnlineRecognizer_decode(
}
SHERPA_ONNX_EXTERN_C
JNIEXPORT
void
JNICALL
Java_com_k2fsa_sherpa_onnx_OnlineRecognizer_decodeStreams
(
JNIEnv
*
env
,
jobject
/*obj*/
,
jlong
ptr
,
jlongArray
stream_ptrs
)
{
auto
recognizer
=
reinterpret_cast
<
sherpa_onnx
::
OnlineRecognizer
*>
(
ptr
);
jlong
*
p
=
env
->
GetLongArrayElements
(
stream_ptrs
,
nullptr
);
jsize
n
=
env
->
GetArrayLength
(
stream_ptrs
);
auto
ss
=
reinterpret_cast
<
sherpa_onnx
::
OnlineStream
**>
(
p
);
recognizer
->
DecodeStreams
(
ss
,
n
);
env
->
ReleaseLongArrayElements
(
stream_ptrs
,
p
,
JNI_ABORT
);
}
SHERPA_ONNX_EXTERN_C
JNIEXPORT
jlong
JNICALL
Java_com_k2fsa_sherpa_onnx_OnlineRecognizer_createStream
(
JNIEnv
*
env
,
jobject
/*obj*/
,
...
...
请
注册
或
登录
后发表评论