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
2024-07-10 21:18:46 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Committed by
GitHub
2024-07-10 21:18:46 +0800
Commit
08c758520fcd6f7113a969d742821df08a4d288a
08c75852
1 parent
dd0ff2ca
Add keyword spotting for C# (#1105)
隐藏空白字符变更
内嵌
并排对比
正在显示
21 个修改的文件
包含
368 行增加
和
37 行删除
.github/scripts/test-dot-net.sh
.github/scripts/test-offline-transducer.sh
.github/scripts/test-online-transducer.sh
.github/scripts/test-python.sh
CHANGELOG.md
CMakeLists.txt
dotnet-examples/keyword-spotting-from-files/Program.cs
dotnet-examples/keyword-spotting-from-files/keyword-spotting-from-files.csproj
dotnet-examples/keyword-spotting-from-files/run.sh
dotnet-examples/online-decode-files/run-transducer-itn.sh
dotnet-examples/online-decode-files/run-transducer.sh
dotnet-examples/sherpa-onnx.sln
dotnet-examples/speech-recognition-from-microphone/run-transducer.sh
flutter/sherpa_onnx/example/example.md
scripts/dotnet/.gitignore
scripts/dotnet/KeywordResult.cs
scripts/dotnet/KeywordSpotter.cs
scripts/dotnet/KeywordSpotterConfig.cs
sherpa-onnx/python/tests/test_keyword_spotter.py
sherpa-onnx/python/tests/test_offline_recognizer.py
sherpa-onnx/python/tests/test_online_recognizer.py
.github/scripts/test-dot-net.sh
查看文件 @
08c7585
...
...
@@ -2,7 +2,10 @@
cd
dotnet-examples/
cd
./online-decode-files
cd
./keyword-spotting-from-files
./run.sh
cd
../online-decode-files
./run-transducer-itn.sh
./run-zipformer2-ctc.sh
./run-transducer.sh
...
...
.github/scripts/test-offline-transducer.sh
查看文件 @
08c7585
...
...
@@ -139,7 +139,7 @@ time $EXE \
time
$EXE
\
--tokens
=
$repo
/tokens.txt
\
--encoder
=
$repo
/encoder-epoch-99-avg-1.int8.onnx
\
--decoder
=
$repo
/decoder-epoch-99-avg-1.
int8.
onnx
\
--decoder
=
$repo
/decoder-epoch-99-avg-1.onnx
\
--joiner
=
$repo
/joiner-epoch-99-avg-1.int8.onnx
\
--num-threads
=
2
\
$repo
/test_wavs/0.wav
\
...
...
@@ -172,7 +172,7 @@ time $EXE \
time
$EXE
\
--tokens
=
$repo
/tokens.txt
\
--encoder
=
$repo
/encoder-epoch-99-avg-1.int8.onnx
\
--decoder
=
$repo
/decoder-epoch-99-avg-1.
int8.
onnx
\
--decoder
=
$repo
/decoder-epoch-99-avg-1.onnx
\
--joiner
=
$repo
/joiner-epoch-99-avg-1.int8.onnx
\
--num-threads
=
2
\
$repo
/test_wavs/0.wav
\
...
...
.github/scripts/test-online-transducer.sh
查看文件 @
08c7585
...
...
@@ -86,7 +86,7 @@ for wave in ${waves[@]}; do
time
$EXE
\
--tokens
=
$repo
/tokens.txt
\
--encoder
=
$repo
/encoder-epoch-99-avg-1.int8.onnx
\
--decoder
=
$repo
/decoder-epoch-99-avg-1.
int8.
onnx
\
--decoder
=
$repo
/decoder-epoch-99-avg-1.onnx
\
--joiner
=
$repo
/joiner-epoch-99-avg-1.int8.onnx
\
--num-threads
=
2
\
$wave
...
...
@@ -126,7 +126,7 @@ for wave in ${waves[@]}; do
time
$EXE
\
--tokens
=
$repo
/tokens.txt
\
--encoder
=
$repo
/encoder-epoch-11-avg-1.int8.onnx
\
--decoder
=
$repo
/decoder-epoch-11-avg-1.
int8.
onnx
\
--decoder
=
$repo
/decoder-epoch-11-avg-1.onnx
\
--joiner
=
$repo
/joiner-epoch-11-avg-1.int8.onnx
\
--num-threads
=
2
\
$wave
...
...
@@ -168,7 +168,7 @@ for wave in ${waves[@]}; do
time
$EXE
\
--tokens
=
$repo
/tokens.txt
\
--encoder
=
$repo
/encoder-epoch-99-avg-1.int8.onnx
\
--decoder
=
$repo
/decoder-epoch-99-avg-1.
int8.
onnx
\
--decoder
=
$repo
/decoder-epoch-99-avg-1.onnx
\
--joiner
=
$repo
/joiner-epoch-99-avg-1.int8.onnx
\
--num-threads
=
2
\
$wave
...
...
@@ -210,7 +210,7 @@ for wave in ${waves[@]}; do
time
$EXE
\
--tokens
=
$repo
/tokens.txt
\
--encoder
=
$repo
/encoder-epoch-99-avg-1.int8.onnx
\
--decoder
=
$repo
/decoder-epoch-99-avg-1.
int8.
onnx
\
--decoder
=
$repo
/decoder-epoch-99-avg-1.onnx
\
--joiner
=
$repo
/joiner-epoch-99-avg-1.int8.onnx
\
--num-threads
=
2
\
$wave
...
...
@@ -231,7 +231,7 @@ if [ $EXE == "sherpa-onnx-ffmpeg" ]; then
time
$EXE
\
$repo
/tokens.txt
\
$repo
/encoder-epoch-99-avg-1.int8.onnx
\
$repo
/decoder-epoch-99-avg-1.
int8.
onnx
\
$repo
/decoder-epoch-99-avg-1.onnx
\
$repo
/joiner-epoch-99-avg-1.int8.onnx
\
https://huggingface.co/csukuangfj/sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/resolve/main/test_wavs/4.wav
\
2
...
...
@@ -271,7 +271,7 @@ for wave in ${waves[@]}; do
time
$EXE
\
--tokens
=
$repo
/tokens.txt
\
--encoder
=
$repo
/encoder-epoch-99-avg-1.int8.onnx
\
--decoder
=
$repo
/decoder-epoch-99-avg-1.
int8.
onnx
\
--decoder
=
$repo
/decoder-epoch-99-avg-1.onnx
\
--joiner
=
$repo
/joiner-epoch-99-avg-1.int8.onnx
\
--num-threads
=
2
\
$wave
...
...
.github/scripts/test-python.sh
查看文件 @
08c7585
...
...
@@ -125,12 +125,15 @@ for name in ${wenet_models[@]}; do
repo
=
$name
log
"Start testing
${
repo_url
}
"
python3 ./python-api-examples/offline-decode-files.py
\
--tokens
=
$repo
/tokens.txt
\
--wenet-ctc
=
$repo
/model.onnx
\
$repo
/test_wavs/0.wav
\
$repo
/test_wavs/1.wav
\
$repo
/test_wavs/8k.wav
if
false
;
then
# offline wenet ctc models are not supported by onnxruntime >= 1.18
python3 ./python-api-examples/offline-decode-files.py
\
--tokens
=
$repo
/tokens.txt
\
--wenet-ctc
=
$repo
/model.onnx
\
$repo
/test_wavs/0.wav
\
$repo
/test_wavs/1.wav
\
$repo
/test_wavs/8k.wav
fi
python3 ./python-api-examples/online-decode-files.py
\
--tokens
=
$repo
/tokens.txt
\
...
...
CHANGELOG.md
查看文件 @
08c7585
## 1.10.13
*
Update onnxruntime from 1.17.1 to 1.18.0
*
Add C# API for Keyword spotting
## 1.10.12
...
...
CMakeLists.txt
查看文件 @
08c7585
...
...
@@ -21,11 +21,6 @@ if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0")
cmake_policy
(
SET CMP0135 NEW
)
endif
()
option
(
SHERPA_ONNX_ENABLE_PYTHON
"Whether to build Python"
OFF
)
option
(
SHERPA_ONNX_ENABLE_TESTS
"Whether to build tests"
OFF
)
option
(
SHERPA_ONNX_ENABLE_CHECK
"Whether to build with assert"
OFF
)
...
...
dotnet-examples/keyword-spotting-from-files/Program.cs
0 → 100644
查看文件 @
08c7585
// Copyright (c) 2024 Xiaomi Corporation
//
// This file shows how to do keyword spotting with sherpa-onnx.
//
// 1. Download a model from
// https://github.com/k2-fsa/sherpa-onnx/releases/tag/kws-models
//
// wget https://github.com/k2-fsa/sherpa-onnx/releases/download/kws-models/sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01.tar.bz2
// tar xvf sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01.tar.bz2
//
// 2. Now run it
//
// dotnet run
using
SherpaOnnx
;
using
System.Collections.Generic
;
using
System
;
class
KeywordSpotterDemo
{
static
void
Main
(
string
[]
args
)
{
var
config
=
new
KeywordSpotterConfig
();
config
.
FeatConfig
.
SampleRate
=
16000
;
config
.
FeatConfig
.
FeatureDim
=
80
;
config
.
ModelConfig
.
Transducer
.
Encoder
=
"./sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01/encoder-epoch-12-avg-2-chunk-16-left-64.onnx"
;
config
.
ModelConfig
.
Transducer
.
Decoder
=
"./sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01/decoder-epoch-12-avg-2-chunk-16-left-64.onnx"
;
config
.
ModelConfig
.
Transducer
.
Joiner
=
"./sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01/joiner-epoch-12-avg-2-chunk-16-left-64.onnx"
;
config
.
ModelConfig
.
Tokens
=
"./sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01/tokens.txt"
;
config
.
ModelConfig
.
Provider
=
"cpu"
;
config
.
ModelConfig
.
NumThreads
=
1
;
config
.
ModelConfig
.
Debug
=
1
;
config
.
KeywordsFile
=
"./sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01/test_wavs/test_keywords.txt"
;
var
kws
=
new
KeywordSpotter
(
config
);
var
filename
=
"./sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01/test_wavs/3.wav"
;
WaveReader
waveReader
=
new
WaveReader
(
filename
);
Console
.
WriteLine
(
"----------Use pre-defined keywords----------"
);
OnlineStream
s
=
kws
.
CreateStream
();
s
.
AcceptWaveform
(
waveReader
.
SampleRate
,
waveReader
.
Samples
);
float
[]
tailPadding
=
new
float
[(
int
)(
waveReader
.
SampleRate
*
0.3
)];
s
.
AcceptWaveform
(
waveReader
.
SampleRate
,
tailPadding
);
s
.
InputFinished
();
while
(
kws
.
IsReady
(
s
))
{
kws
.
Decode
(
s
);
var
result
=
kws
.
GetResult
(
s
);
if
(
result
.
Keyword
!=
""
)
{
Console
.
WriteLine
(
"Detected: {0}"
,
result
.
Keyword
);
}
}
Console
.
WriteLine
(
"----------Use pre-defined keywords + add a new keyword----------"
);
s
=
kws
.
CreateStream
(
"y ǎn y uán @演员"
);
s
.
AcceptWaveform
(
waveReader
.
SampleRate
,
waveReader
.
Samples
);
s
.
AcceptWaveform
(
waveReader
.
SampleRate
,
tailPadding
);
s
.
InputFinished
();
while
(
kws
.
IsReady
(
s
))
{
kws
.
Decode
(
s
);
var
result
=
kws
.
GetResult
(
s
);
if
(
result
.
Keyword
!=
""
)
{
Console
.
WriteLine
(
"Detected: {0}"
,
result
.
Keyword
);
}
}
Console
.
WriteLine
(
"----------Use pre-defined keywords + add 2 new keywords----------"
);
// Note keywords are separated by /
s
=
kws
.
CreateStream
(
"y ǎn y uán @演员/zh ī m íng @知名"
);
s
.
AcceptWaveform
(
waveReader
.
SampleRate
,
waveReader
.
Samples
);
s
.
AcceptWaveform
(
waveReader
.
SampleRate
,
tailPadding
);
s
.
InputFinished
();
while
(
kws
.
IsReady
(
s
))
{
kws
.
Decode
(
s
);
var
result
=
kws
.
GetResult
(
s
);
if
(
result
.
Keyword
!=
""
)
{
Console
.
WriteLine
(
"Detected: {0}"
,
result
.
Keyword
);
}
}
}
}
...
...
dotnet-examples/keyword-spotting-from-files/keyword-spotting-from-files.csproj
0 → 100644
查看文件 @
08c7585
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<RootNamespace>keyword_spotting_from_files</RootNamespace>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Common\Common.csproj" />
</ItemGroup>
</Project>
...
...
dotnet-examples/keyword-spotting-from-files/run.sh
0 → 100755
查看文件 @
08c7585
#!/usr/bin/env bash
set
-ex
if
[
! -f ./sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01/tokens.txt
]
;
then
curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/kws-models/sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01.tar.bz2
tar xvf sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01.tar.bz2
rm sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01.tar.bz2
fi
dotnet run -c Release
...
...
dotnet-examples/online-decode-files/run-transducer-itn.sh
查看文件 @
08c7585
...
...
@@ -22,7 +22,7 @@ fi
dotnet run -c Release
\
--tokens ./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/tokens.txt
\
--encoder ./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/encoder-epoch-99-avg-1.int8.onnx
\
--decoder ./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/decoder-epoch-99-avg-1.
int8.
onnx
\
--decoder ./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/decoder-epoch-99-avg-1.onnx
\
--joiner ./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/joiner-epoch-99-avg-1.int8.onnx
\
--rule-fsts ./itn_zh_number.fst
\
--decoding-method greedy_search
\
...
...
dotnet-examples/online-decode-files/run-transducer.sh
查看文件 @
08c7585
...
...
@@ -14,7 +14,7 @@ fi
dotnet run -c Release
\
--tokens ./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/tokens.txt
\
--encoder ./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/encoder-epoch-99-avg-1.int8.onnx
\
--decoder ./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/decoder-epoch-99-avg-1.
int8.
onnx
\
--decoder ./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/decoder-epoch-99-avg-1.onnx
\
--joiner ./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/joiner-epoch-99-avg-1.int8.onnx
\
--decoding-method greedy_search
\
--files ./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/test_wavs/1.wav
\
...
...
dotnet-examples/sherpa-onnx.sln
查看文件 @
08c7585
...
...
@@ -25,6 +25,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "vad-non-streaming-asr-paraf
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common", "Common\Common.csproj", "{401E963F-E25A-43CE-987D-8DB2D4715756}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "keyword-spotting-from-files", "keyword-spotting-from-files\keyword-spotting-from-files.csproj", "{A87EDD31-D654-4C9F-AED7-F6F2825659BD}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
...
...
@@ -75,6 +77,10 @@ Global
{401E963F-E25A-43CE-987D-8DB2D4715756}.Debug|Any CPU.Build.0 = Debug|Any CPU
{401E963F-E25A-43CE-987D-8DB2D4715756}.Release|Any CPU.ActiveCfg = Release|Any CPU
{401E963F-E25A-43CE-987D-8DB2D4715756}.Release|Any CPU.Build.0 = Release|Any CPU
{A87EDD31-D654-4C9F-AED7-F6F2825659BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A87EDD31-D654-4C9F-AED7-F6F2825659BD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A87EDD31-D654-4C9F-AED7-F6F2825659BD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A87EDD31-D654-4C9F-AED7-F6F2825659BD}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
...
...
dotnet-examples/speech-recognition-from-microphone/run-transducer.sh
查看文件 @
08c7585
...
...
@@ -18,5 +18,5 @@ fi
dotnet run -c Release
\
--tokens ./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/tokens.txt
\
--encoder ./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/encoder-epoch-99-avg-1.int8.onnx
\
--decoder ./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/decoder-epoch-99-avg-1.
int8.
onnx
\
--decoder ./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/decoder-epoch-99-avg-1.onnx
\
--joiner ./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/joiner-epoch-99-avg-1.int8.onnx
...
...
flutter/sherpa_onnx/example/example.md
查看文件 @
08c7585
...
...
@@ -5,6 +5,7 @@
| Functions | URL | Supported Platforms|
|---|---|---|
|Streaming speech recognition|
[
Address
](
https://github.com/k2-fsa/sherpa-onnx/tree/master/flutter-examples/streaming_asr
)
| Android, macOS, Windows|
|Speech synthesis|
[
Address
](
https://github.com/k2-fsa/sherpa-onnx/tree/master/flutter-examples/tts
)
| Android, iOS, Linux, macOS, Windows|
## Pure dart-examples
...
...
scripts/dotnet/.gitignore
查看文件 @
08c7585
all
macos-arm64
macos-x64
linux
windows
linux-x64
linux-arm64
windows-arm64
windows-x64
windows-x86
packages
tmp
...
...
scripts/dotnet/KeywordResult.cs
0 → 100644
查看文件 @
08c7585
/// Copyright (c) 2024 Xiaomi Corporation
using
System
;
using
System.Runtime.InteropServices
;
using
System.Text
;
namespace
SherpaOnnx
{
public
class
KeywordResult
{
public
KeywordResult
(
IntPtr
handle
)
{
Impl
impl
=
(
Impl
)
Marshal
.
PtrToStructure
(
handle
,
typeof
(
Impl
));
// PtrToStringUTF8() requires .net standard 2.1
// _keyword = Marshal.PtrToStringUTF8(impl.Keyword);
int
length
=
0
;
unsafe
{
byte
*
buffer
=
(
byte
*)
impl
.
Keyword
;
while
(*
buffer
!=
0
)
{
++
buffer
;
length
+=
1
;
}
}
byte
[]
stringBuffer
=
new
byte
[
length
];
Marshal
.
Copy
(
impl
.
Keyword
,
stringBuffer
,
0
,
length
);
_keyword
=
Encoding
.
UTF8
.
GetString
(
stringBuffer
);
}
[
StructLayout
(
LayoutKind
.
Sequential
)]
struct
Impl
{
public
IntPtr
Keyword
;
}
private
String
_keyword
;
public
String
Keyword
=>
_keyword
;
}
}
...
...
scripts/dotnet/KeywordSpotter.cs
0 → 100644
查看文件 @
08c7585
/// Copyright (c) 2024 Xiaomi Corporation (authors: Fangjun Kuang)
using
System
;
using
System.Collections.Generic
;
using
System.Runtime.InteropServices
;
using
System.Text
;
namespace
SherpaOnnx
{
// please see
// https://www.mono-project.com/docs/advanced/pinvoke/#gc-safe-pinvoke-code
// https://www.mono-project.com/docs/advanced/pinvoke/#properly-disposing-of-resources
public
class
KeywordSpotter
:
IDisposable
{
public
KeywordSpotter
(
KeywordSpotterConfig
config
)
{
IntPtr
h
=
CreateKeywordSpotter
(
ref
config
);
_handle
=
new
HandleRef
(
this
,
h
);
}
public
OnlineStream
CreateStream
()
{
IntPtr
p
=
CreateKeywordStream
(
_handle
.
Handle
);
return
new
OnlineStream
(
p
);
}
public
OnlineStream
CreateStream
(
string
keywords
)
{
byte
[]
utf8Bytes
=
Encoding
.
UTF8
.
GetBytes
(
keywords
);
IntPtr
p
=
CreateKeywordStreamWithKeywords
(
_handle
.
Handle
,
utf8Bytes
);
return
new
OnlineStream
(
p
);
}
/// Return true if the passed stream is ready for decoding.
public
bool
IsReady
(
OnlineStream
stream
)
{
return
IsReady
(
_handle
.
Handle
,
stream
.
Handle
)
!=
0
;
}
/// You have to ensure that IsReady(stream) returns true before
/// you call this method
public
void
Decode
(
OnlineStream
stream
)
{
Decode
(
_handle
.
Handle
,
stream
.
Handle
);
}
// The caller should ensure all passed streams are ready for decoding.
public
void
Decode
(
IEnumerable
<
OnlineStream
>
streams
)
{
// TargetFramework=net20 does not support System.Linq
// IntPtr[] ptrs = streams.Select(s => s.Handle).ToArray();
List
<
IntPtr
>
list
=
new
List
<
IntPtr
>();
foreach
(
OnlineStream
s
in
streams
)
{
list
.
Add
(
s
.
Handle
);
}
IntPtr
[]
ptrs
=
list
.
ToArray
();
Decode
(
_handle
.
Handle
,
ptrs
,
ptrs
.
Length
);
}
public
KeywordResult
GetResult
(
OnlineStream
stream
)
{
IntPtr
h
=
GetResult
(
_handle
.
Handle
,
stream
.
Handle
);
KeywordResult
result
=
new
KeywordResult
(
h
);
DestroyResult
(
h
);
return
result
;
}
public
void
Dispose
()
{
Cleanup
();
// Prevent the object from being placed on the
// finalization queue
System
.
GC
.
SuppressFinalize
(
this
);
}
~
KeywordSpotter
()
{
Cleanup
();
}
private
void
Cleanup
()
{
DestroyKeywordSpotter
(
_handle
.
Handle
);
// Don't permit the handle to be used again.
_handle
=
new
HandleRef
(
this
,
IntPtr
.
Zero
);
}
private
HandleRef
_handle
;
[
DllImport
(
Dll
.
Filename
)]
private
static
extern
IntPtr
CreateKeywordSpotter
(
ref
KeywordSpotterConfig
config
);
[
DllImport
(
Dll
.
Filename
)]
private
static
extern
void
DestroyKeywordSpotter
(
IntPtr
handle
);
[
DllImport
(
Dll
.
Filename
)]
private
static
extern
IntPtr
CreateKeywordStream
(
IntPtr
handle
);
[
DllImport
(
Dll
.
Filename
)]
private
static
extern
IntPtr
CreateKeywordStreamWithKeywords
(
IntPtr
handle
,
[
MarshalAs
(
UnmanagedType
.
LPArray
,
ArraySubType
=
UnmanagedType
.
I1
)]
byte
[]
utf8Keywords
);
[
DllImport
(
Dll
.
Filename
,
EntryPoint
=
"IsKeywordStreamReady"
)]
private
static
extern
int
IsReady
(
IntPtr
handle
,
IntPtr
stream
);
[
DllImport
(
Dll
.
Filename
,
EntryPoint
=
"DecodeKeywordStream"
)]
private
static
extern
void
Decode
(
IntPtr
handle
,
IntPtr
stream
);
[
DllImport
(
Dll
.
Filename
,
EntryPoint
=
"DecodeMultipleKeywordStreams"
)]
private
static
extern
void
Decode
(
IntPtr
handle
,
IntPtr
[]
streams
,
int
n
);
[
DllImport
(
Dll
.
Filename
,
EntryPoint
=
"GetKeywordResult"
)]
private
static
extern
IntPtr
GetResult
(
IntPtr
handle
,
IntPtr
stream
);
[
DllImport
(
Dll
.
Filename
,
EntryPoint
=
"DestroyKeywordResult"
)]
private
static
extern
void
DestroyResult
(
IntPtr
result
);
}
}
...
...
scripts/dotnet/KeywordSpotterConfig.cs
0 → 100644
查看文件 @
08c7585
/// Copyright (c) 2024 Xiaomi Corporation
using
System.Runtime.InteropServices
;
namespace
SherpaOnnx
{
[
StructLayout
(
LayoutKind
.
Sequential
)]
public
struct
KeywordSpotterConfig
{
public
KeywordSpotterConfig
()
{
FeatConfig
=
new
FeatureConfig
();
ModelConfig
=
new
OnlineModelConfig
();
MaxActivePaths
=
4
;
NumTrailingBlanks
=
1
;
KeywordsScore
=
1.0F
;
KeywordsThreshold
=
0.25F
;
KeywordsFile
=
""
;
}
public
FeatureConfig
FeatConfig
;
public
OnlineModelConfig
ModelConfig
;
public
int
MaxActivePaths
;
public
int
NumTrailingBlanks
;
public
float
KeywordsScore
;
public
float
KeywordsThreshold
;
[
MarshalAs
(
UnmanagedType
.
LPStr
)]
public
string
KeywordsFile
;
}
}
...
...
sherpa-onnx/python/tests/test_keyword_spotter.py
查看文件 @
08c7585
...
...
@@ -50,12 +50,12 @@ class TestKeywordSpotter(unittest.TestCase):
for
use_int8
in
[
True
,
False
]:
if
use_int8
:
encoder
=
f
"{d}/sherpa-onnx-kws-zipformer-gigaspeech-3.3M-2024-01-01/encoder-epoch-12-avg-2-chunk-16-left-64.int8.onnx"
decoder
=
f
"{d}/sherpa-onnx-kws-zipformer-gigaspeech-3.3M-2024-01-01/decoder-epoch-12-avg-2-chunk-16-left-64.
int8.
onnx"
decoder
=
f
"{d}/sherpa-onnx-kws-zipformer-gigaspeech-3.3M-2024-01-01/decoder-epoch-12-avg-2-chunk-16-left-64.onnx"
joiner
=
f
"{d}/sherpa-onnx-kws-zipformer-gigaspeech-3.3M-2024-01-01/joiner-epoch-12-avg-2-chunk-16-left-64.int8.onnx"
else
:
encoder
=
f
"{d}/sherpa-onnx-kws-zipformer-gigaspeech-3.3M-2024-01-01/encoder-epoch-12-avg-2-chunk-16-left-64.int8.onnx"
decoder
=
f
"{d}/sherpa-onnx-kws-zipformer-gigaspeech-3.3M-2024-01-01/decoder-epoch-12-avg-2-chunk-16-left-64.int8.onnx"
joiner
=
f
"{d}/sherpa-onnx-kws-zipformer-gigaspeech-3.3M-2024-01-01/joiner-epoch-12-avg-2-chunk-16-left-64.int8.onnx"
encoder
=
f
"{d}/sherpa-onnx-kws-zipformer-gigaspeech-3.3M-2024-01-01/encoder-epoch-12-avg-2-chunk-16-left-64.onnx"
decoder
=
f
"{d}/sherpa-onnx-kws-zipformer-gigaspeech-3.3M-2024-01-01/decoder-epoch-12-avg-2-chunk-16-left-64.onnx"
joiner
=
f
"{d}/sherpa-onnx-kws-zipformer-gigaspeech-3.3M-2024-01-01/joiner-epoch-12-avg-2-chunk-16-left-64.onnx"
tokens
=
(
f
"{d}/sherpa-onnx-kws-zipformer-gigaspeech-3.3M-2024-01-01/tokens.txt"
...
...
@@ -109,12 +109,12 @@ class TestKeywordSpotter(unittest.TestCase):
for
use_int8
in
[
True
,
False
]:
if
use_int8
:
encoder
=
f
"{d}/sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01/encoder-epoch-12-avg-2-chunk-16-left-64.int8.onnx"
decoder
=
f
"{d}/sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01/decoder-epoch-12-avg-2-chunk-16-left-64.
int8.
onnx"
decoder
=
f
"{d}/sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01/decoder-epoch-12-avg-2-chunk-16-left-64.onnx"
joiner
=
f
"{d}/sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01/joiner-epoch-12-avg-2-chunk-16-left-64.int8.onnx"
else
:
encoder
=
f
"{d}/sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01/encoder-epoch-12-avg-2-chunk-16-left-64.int8.onnx"
decoder
=
f
"{d}/sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01/decoder-epoch-12-avg-2-chunk-16-left-64.int8.onnx"
joiner
=
f
"{d}/sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01/joiner-epoch-12-avg-2-chunk-16-left-64.int8.onnx"
encoder
=
f
"{d}/sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01/encoder-epoch-12-avg-2-chunk-16-left-64.onnx"
decoder
=
f
"{d}/sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01/decoder-epoch-12-avg-2-chunk-16-left-64.onnx"
joiner
=
f
"{d}/sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01/joiner-epoch-12-avg-2-chunk-16-left-64.onnx"
tokens
=
(
f
"{d}/sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01/tokens.txt"
...
...
sherpa-onnx/python/tests/test_offline_recognizer.py
查看文件 @
08c7585
...
...
@@ -52,7 +52,7 @@ class TestOfflineRecognizer(unittest.TestCase):
for
use_int8
in
[
True
,
False
]:
if
use_int8
:
encoder
=
f
"{d}/sherpa-onnx-zipformer-en-2023-04-01/encoder-epoch-99-avg-1.int8.onnx"
decoder
=
f
"{d}/sherpa-onnx-zipformer-en-2023-04-01/decoder-epoch-99-avg-1.
int8.
onnx"
decoder
=
f
"{d}/sherpa-onnx-zipformer-en-2023-04-01/decoder-epoch-99-avg-1.onnx"
joiner
=
f
"{d}/sherpa-onnx-zipformer-en-2023-04-01/joiner-epoch-99-avg-1.int8.onnx"
else
:
encoder
=
f
"{d}/sherpa-onnx-zipformer-en-2023-04-01/encoder-epoch-99-avg-1.onnx"
...
...
@@ -85,7 +85,7 @@ class TestOfflineRecognizer(unittest.TestCase):
for
use_int8
in
[
True
,
False
]:
if
use_int8
:
encoder
=
f
"{d}/sherpa-onnx-zipformer-en-2023-04-01/encoder-epoch-99-avg-1.int8.onnx"
decoder
=
f
"{d}/sherpa-onnx-zipformer-en-2023-04-01/decoder-epoch-99-avg-1.
int8.
onnx"
decoder
=
f
"{d}/sherpa-onnx-zipformer-en-2023-04-01/decoder-epoch-99-avg-1.onnx"
joiner
=
f
"{d}/sherpa-onnx-zipformer-en-2023-04-01/joiner-epoch-99-avg-1.int8.onnx"
else
:
encoder
=
f
"{d}/sherpa-onnx-zipformer-en-2023-04-01/encoder-epoch-99-avg-1.onnx"
...
...
sherpa-onnx/python/tests/test_online_recognizer.py
查看文件 @
08c7585
...
...
@@ -50,7 +50,7 @@ class TestOnlineRecognizer(unittest.TestCase):
for
use_int8
in
[
True
,
False
]:
if
use_int8
:
encoder
=
f
"{d}/sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/encoder-epoch-99-avg-1.int8.onnx"
decoder
=
f
"{d}/sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/decoder-epoch-99-avg-1.
int8.
onnx"
decoder
=
f
"{d}/sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/decoder-epoch-99-avg-1.onnx"
joiner
=
f
"{d}/sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/joiner-epoch-99-avg-1.int8.onnx"
else
:
encoder
=
f
"{d}/sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/encoder-epoch-99-avg-1.onnx"
...
...
@@ -90,7 +90,7 @@ class TestOnlineRecognizer(unittest.TestCase):
for
use_int8
in
[
True
,
False
]:
if
use_int8
:
encoder
=
f
"{d}/sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/encoder-epoch-99-avg-1.int8.onnx"
decoder
=
f
"{d}/sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/decoder-epoch-99-avg-1.
int8.
onnx"
decoder
=
f
"{d}/sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/decoder-epoch-99-avg-1.onnx"
joiner
=
f
"{d}/sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/joiner-epoch-99-avg-1.int8.onnx"
else
:
encoder
=
f
"{d}/sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/encoder-epoch-99-avg-1.onnx"
...
...
请
注册
或
登录
后发表评论