Fangjun Kuang
Committed by GitHub

Add C# API for SenseVoice models (#1151)

@@ -2,16 +2,8 @@ @@ -2,16 +2,8 @@
2 2
3 cd dotnet-examples/ 3 cd dotnet-examples/
4 4
5 -cd ./keyword-spotting-from-files  
6 -./run.sh  
7 -  
8 -cd ../online-decode-files  
9 -./run-transducer-itn.sh  
10 -./run-zipformer2-ctc.sh  
11 -./run-transducer.sh  
12 -./run-paraformer.sh  
13 -  
14 -cd ../offline-decode-files 5 +cd ./offline-decode-files
  6 +./run-sense-voice-ctc.sh
15 ./run-paraformer-itn.sh 7 ./run-paraformer-itn.sh
16 ./run-telespeech-ctc.sh 8 ./run-telespeech-ctc.sh
17 ./run-nemo-ctc.sh 9 ./run-nemo-ctc.sh
@@ -21,6 +13,15 @@ cd ../offline-decode-files @@ -21,6 +13,15 @@ cd ../offline-decode-files
21 ./run-whisper.sh 13 ./run-whisper.sh
22 ./run-tdnn-yesno.sh 14 ./run-tdnn-yesno.sh
23 15
  16 +cd ../keyword-spotting-from-files
  17 +./run.sh
  18 +
  19 +cd ../online-decode-files
  20 +./run-transducer-itn.sh
  21 +./run-zipformer2-ctc.sh
  22 +./run-transducer.sh
  23 +./run-paraformer.sh
  24 +
24 cd ../vad-non-streaming-asr-paraformer 25 cd ../vad-non-streaming-asr-paraformer
25 ./run.sh 26 ./run.sh
26 27
@@ -61,6 +61,12 @@ class OfflineDecodeFiles @@ -61,6 +61,12 @@ class OfflineDecodeFiles
61 [Option("telespeech-ctc", Required = false, HelpText = "Path to model.onnx. Used only for TeleSpeech CTC models")] 61 [Option("telespeech-ctc", Required = false, HelpText = "Path to model.onnx. Used only for TeleSpeech CTC models")]
62 public string TeleSpeechCtc { get; set; } = ""; 62 public string TeleSpeechCtc { get; set; } = "";
63 63
  64 + [Option("sense-voice-model", Required = false, HelpText = "Path to model.onnx. Used only for SenseVoice CTC models")]
  65 + public string SenseVoiceModel { get; set; } = "";
  66 +
  67 + [Option("sense-voice-use-itn", Required = false, HelpText = "1 to use inverse text normalization for sense voice.")]
  68 + public int SenseVoiceUseItn { get; set; } = 1;
  69 +
64 [Option("num-threads", Required = false, Default = 1, HelpText = "Number of threads for computation")] 70 [Option("num-threads", Required = false, Default = 1, HelpText = "Number of threads for computation")]
65 public int NumThreads { get; set; } = 1; 71 public int NumThreads { get; set; } = 1;
66 72
@@ -225,6 +231,11 @@ to download pre-trained Tdnn models. @@ -225,6 +231,11 @@ to download pre-trained Tdnn models.
225 { 231 {
226 config.ModelConfig.Tdnn.Model = options.TdnnModel; 232 config.ModelConfig.Tdnn.Model = options.TdnnModel;
227 } 233 }
  234 + else if (!String.IsNullOrEmpty(options.SenseVoiceModel))
  235 + {
  236 + config.ModelConfig.SenseVoice.Model = options.SenseVoiceModel;
  237 + config.ModelConfig.SenseVoice.UseInverseTextNormalization = options.SenseVoiceUseItn;
  238 + }
228 else 239 else
229 { 240 {
230 Console.WriteLine("Please provide a model"); 241 Console.WriteLine("Please provide a model");
  1 +#!/usr/bin/env bash
  2 +
  3 +set -ex
  4 +
  5 +if [ ! -d ./sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17 ]; then
  6 + curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17.tar.bz2
  7 + tar xvf sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17.tar.bz2
  8 + rm sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17.tar.bz2
  9 +fi
  10 +
  11 +dotnet run \
  12 + --sense-voice-model=./sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17/model.int8.onnx \
  13 + --tokens=./sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17/tokens.txt \
  14 + --files ./sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17/test_wavs/zh.wav
@@ -36,7 +36,7 @@ windows_x64_wheel=$src_dir/$windows_x64_wheel_filename @@ -36,7 +36,7 @@ windows_x64_wheel=$src_dir/$windows_x64_wheel_filename
36 function process_linux() { 36 function process_linux() {
37 mkdir -p t 37 mkdir -p t
38 cd t 38 cd t
39 - curl -OL https://$HF_MIRROR/csukuangfj/sherpa-onnx-wheels/resolve/main/$linux_wheel_filename 39 + curl -OL https://$HF_MIRROR/csukuangfj/sherpa-onnx-wheels/resolve/main/cpu/$SHERPA_ONNX_VERSION/$linux_wheel_filename
40 unzip $linux_wheel_filename 40 unzip $linux_wheel_filename
41 cp -v sherpa_onnx/lib/*.so* ../linux 41 cp -v sherpa_onnx/lib/*.so* ../linux
42 cd .. 42 cd ..
@@ -50,7 +50,7 @@ function process_linux() { @@ -50,7 +50,7 @@ function process_linux() {
50 function process_windows_x64() { 50 function process_windows_x64() {
51 mkdir -p t 51 mkdir -p t
52 cd t 52 cd t
53 - curl -OL https://$HF_MIRROR/csukuangfj/sherpa-onnx-wheels/resolve/main/$windows_x64_wheel_filename 53 + curl -OL https://$HF_MIRROR/csukuangfj/sherpa-onnx-wheels/resolve/main/cpu/$SHERPA_ONNX_VERSION/$windows_x64_wheel_filename
54 unzip $windows_x64_wheel_filename 54 unzip $windows_x64_wheel_filename
55 cp -v sherpa_onnx-${SHERPA_ONNX_VERSION}.data/data/bin/*.dll ../windows 55 cp -v sherpa_onnx-${SHERPA_ONNX_VERSION}.data/data/bin/*.dll ../windows
56 cd .. 56 cd ..
@@ -60,7 +60,7 @@ function process_windows_x64() { @@ -60,7 +60,7 @@ function process_windows_x64() {
60 function process_macos() { 60 function process_macos() {
61 mkdir -p t 61 mkdir -p t
62 cd t 62 cd t
63 - curl -OL https://$HF_MIRROR/csukuangfj/sherpa-onnx-wheels/resolve/main/$macos_wheel_filename 63 + curl -OL https://$HF_MIRROR/csukuangfj/sherpa-onnx-wheels/resolve/main/cpu/$SHERPA_ONNX_VERSION/$macos_wheel_filename
64 unzip $macos_wheel_filename 64 unzip $macos_wheel_filename
65 cp -v sherpa_onnx/lib/*.dylib ../macos 65 cp -v sherpa_onnx/lib/*.dylib ../macos
66 cd .. 66 cd ..
@@ -23,6 +23,7 @@ namespace SherpaOnnx @@ -23,6 +23,7 @@ namespace SherpaOnnx
23 ModelingUnit = "cjkchar"; 23 ModelingUnit = "cjkchar";
24 BpeVocab = ""; 24 BpeVocab = "";
25 TeleSpeechCtc = ""; 25 TeleSpeechCtc = "";
  26 + SenseVoice = new OfflineSenseVoiceModelConfig();
26 } 27 }
27 public OfflineTransducerModelConfig Transducer; 28 public OfflineTransducerModelConfig Transducer;
28 public OfflineParaformerModelConfig Paraformer; 29 public OfflineParaformerModelConfig Paraformer;
@@ -51,7 +52,7 @@ namespace SherpaOnnx @@ -51,7 +52,7 @@ namespace SherpaOnnx
51 52
52 [MarshalAs(UnmanagedType.LPStr)] 53 [MarshalAs(UnmanagedType.LPStr)]
53 public string TeleSpeechCtc; 54 public string TeleSpeechCtc;
54 - }  
55 -  
56 55
57 -}  
  56 + public OfflineSenseVoiceModelConfig SenseVoice;
  57 + }
  58 +}
  1 +/// Copyright (c) 2024 Xiaomi Corporation (authors: Fangjun Kuang)
  2 +
  3 +using System.Runtime.InteropServices;
  4 +
  5 +namespace SherpaOnnx
  6 +{
  7 + [StructLayout(LayoutKind.Sequential)]
  8 + public struct OfflineSenseVoiceModelConfig
  9 + {
  10 + public OfflineSenseVoiceModelConfig()
  11 + {
  12 + Model = "";
  13 + Language = "";
  14 + UseInverseTextNormalization = 0;
  15 + }
  16 + [MarshalAs(UnmanagedType.LPStr)]
  17 + public string Model;
  18 +
  19 + [MarshalAs(UnmanagedType.LPStr)]
  20 + public string Language;
  21 +
  22 + public int UseInverseTextNormalization;
  23 + }
  24 +}
@@ -55,7 +55,7 @@ if [ ! -f $src_dir/linux-x64/libsherpa-onnx-c-api.so ]; then @@ -55,7 +55,7 @@ if [ ! -f $src_dir/linux-x64/libsherpa-onnx-c-api.so ]; then
55 if [ -f $linux_x64_wheel ]; then 55 if [ -f $linux_x64_wheel ]; then
56 cp -v $linux_x64_wheel . 56 cp -v $linux_x64_wheel .
57 else 57 else
58 - curl -OL https://$HF_MIRROR/csukuangfj/sherpa-onnx-wheels/resolve/main/$linux_x64_wheel_filename 58 + curl -OL https://$HF_MIRROR/csukuangfj/sherpa-onnx-wheels/resolve/main/cpu/$SHERPA_ONNX_VERSION/$linux_x64_wheel_filename
59 fi 59 fi
60 unzip $linux_x64_wheel_filename 60 unzip $linux_x64_wheel_filename
61 cp -v sherpa_onnx/lib/*.so* ../ 61 cp -v sherpa_onnx/lib/*.so* ../
@@ -73,7 +73,7 @@ if [ ! -f $src_dir/linux-arm64/libsherpa-onnx-c-api.so ]; then @@ -73,7 +73,7 @@ if [ ! -f $src_dir/linux-arm64/libsherpa-onnx-c-api.so ]; then
73 if [ -f $linux_arm64_wheel ]; then 73 if [ -f $linux_arm64_wheel ]; then
74 cp -v $linux_arm64_wheel . 74 cp -v $linux_arm64_wheel .
75 else 75 else
76 - curl -OL https://$HF_MIRROR/csukuangfj/sherpa-onnx-wheels/resolve/main/$linux_arm64_wheel_filename 76 + curl -OL https://$HF_MIRROR/csukuangfj/sherpa-onnx-wheels/resolve/main/cpu/$SHERPA_ONNX_VERSION/$linux_arm64_wheel_filename
77 fi 77 fi
78 unzip $linux_arm64_wheel_filename 78 unzip $linux_arm64_wheel_filename
79 cp -v sherpa_onnx/lib/*.so* ../ 79 cp -v sherpa_onnx/lib/*.so* ../
@@ -91,7 +91,7 @@ if [ ! -f $src_dir/macos-x64/libsherpa-onnx-c-api.dylib ]; then @@ -91,7 +91,7 @@ if [ ! -f $src_dir/macos-x64/libsherpa-onnx-c-api.dylib ]; then
91 if [ -f $macos_x64_wheel ]; then 91 if [ -f $macos_x64_wheel ]; then
92 cp -v $macos_x64_wheel . 92 cp -v $macos_x64_wheel .
93 else 93 else
94 - curl -OL https://$HF_MIRROR/csukuangfj/sherpa-onnx-wheels/resolve/main/$macos_x64_wheel_filename 94 + curl -OL https://$HF_MIRROR/csukuangfj/sherpa-onnx-wheels/resolve/main/cpu/$SHERPA_ONNX_VERSION/$macos_x64_wheel_filename
95 fi 95 fi
96 unzip $macos_x64_wheel_filename 96 unzip $macos_x64_wheel_filename
97 cp -v sherpa_onnx/lib/*.dylib ../ 97 cp -v sherpa_onnx/lib/*.dylib ../
@@ -111,7 +111,7 @@ if [ ! -f $src_dir/macos-arm64/libsherpa-onnx-c-api.dylib ]; then @@ -111,7 +111,7 @@ if [ ! -f $src_dir/macos-arm64/libsherpa-onnx-c-api.dylib ]; then
111 if [ -f $macos_arm64_wheel ]; then 111 if [ -f $macos_arm64_wheel ]; then
112 cp -v $macos_arm64_wheel . 112 cp -v $macos_arm64_wheel .
113 else 113 else
114 - curl -OL https://$HF_MIRROR/csukuangfj/sherpa-onnx-wheels/resolve/main/$macos_arm64_wheel_filename 114 + curl -OL https://$HF_MIRROR/csukuangfj/sherpa-onnx-wheels/resolve/main/cpu/$SHERPA_ONNX_VERSION/$macos_arm64_wheel_filename
115 fi 115 fi
116 unzip $macos_arm64_wheel_filename 116 unzip $macos_arm64_wheel_filename
117 cp -v sherpa_onnx/lib/*.dylib ../ 117 cp -v sherpa_onnx/lib/*.dylib ../
@@ -131,7 +131,7 @@ if [ ! -f $src_dir/windows-x64/sherpa-onnx-c-api.dll ]; then @@ -131,7 +131,7 @@ if [ ! -f $src_dir/windows-x64/sherpa-onnx-c-api.dll ]; then
131 if [ -f $windows_x64_wheel ]; then 131 if [ -f $windows_x64_wheel ]; then
132 cp -v $windows_x64_wheel . 132 cp -v $windows_x64_wheel .
133 else 133 else
134 - curl -OL https://$HF_MIRROR/csukuangfj/sherpa-onnx-wheels/resolve/main/$windows_x64_wheel_filename 134 + curl -OL https://$HF_MIRROR/csukuangfj/sherpa-onnx-wheels/resolve/main/cpu/$SHERPA_ONNX_VERSION/$windows_x64_wheel_filename
135 fi 135 fi
136 unzip $windows_x64_wheel_filename 136 unzip $windows_x64_wheel_filename
137 cp -v sherpa_onnx-${SHERPA_ONNX_VERSION}.data/data/bin/*.dll ../ 137 cp -v sherpa_onnx-${SHERPA_ONNX_VERSION}.data/data/bin/*.dll ../
@@ -27,7 +27,7 @@ function linux() { @@ -27,7 +27,7 @@ function linux() {
27 dst=$(realpath sherpa-onnx-go-linux/lib/x86_64-unknown-linux-gnu) 27 dst=$(realpath sherpa-onnx-go-linux/lib/x86_64-unknown-linux-gnu)
28 mkdir t 28 mkdir t
29 cd t 29 cd t
30 - wget -q https://huggingface.co/csukuangfj/sherpa-onnx-wheels/resolve/main/sherpa_onnx-${SHERPA_ONNX_VERSION}-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 30 + wget -q https://huggingface.co/csukuangfj/sherpa-onnx-wheels/resolve/main/cpu/$SHERPA_ONNX_VERSION/sherpa_onnx-${SHERPA_ONNX_VERSION}-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
31 unzip ./sherpa_onnx-${SHERPA_ONNX_VERSION}-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 31 unzip ./sherpa_onnx-${SHERPA_ONNX_VERSION}-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
32 32
33 cp -v sherpa_onnx/lib/*.so* $dst 33 cp -v sherpa_onnx/lib/*.so* $dst
@@ -39,7 +39,7 @@ function linux() { @@ -39,7 +39,7 @@ function linux() {
39 dst=$(realpath sherpa-onnx-go-linux/lib/aarch64-unknown-linux-gnu) 39 dst=$(realpath sherpa-onnx-go-linux/lib/aarch64-unknown-linux-gnu)
40 mkdir t 40 mkdir t
41 cd t 41 cd t
42 - wget -q https://huggingface.co/csukuangfj/sherpa-onnx-wheels/resolve/main/sherpa_onnx-${SHERPA_ONNX_VERSION}-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl 42 + wget -q https://huggingface.co/csukuangfj/sherpa-onnx-wheels/resolve/main/cpu/$SHERPA_ONNX_VERSION/sherpa_onnx-${SHERPA_ONNX_VERSION}-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
43 unzip ./sherpa_onnx-${SHERPA_ONNX_VERSION}-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl 43 unzip ./sherpa_onnx-${SHERPA_ONNX_VERSION}-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
44 44
45 cp -v sherpa_onnx/lib/*.so* $dst 45 cp -v sherpa_onnx/lib/*.so* $dst
@@ -51,7 +51,7 @@ function linux() { @@ -51,7 +51,7 @@ function linux() {
51 dst=$(realpath sherpa-onnx-go-linux/lib/arm-unknown-linux-gnueabihf) 51 dst=$(realpath sherpa-onnx-go-linux/lib/arm-unknown-linux-gnueabihf)
52 mkdir t 52 mkdir t
53 cd t 53 cd t
54 - wget -q https://huggingface.co/csukuangfj/sherpa-onnx-wheels/resolve/main/sherpa_onnx-${SHERPA_ONNX_VERSION}-cp38-cp38-linux_armv7l.whl 54 + wget -q https://huggingface.co/csukuangfj/sherpa-onnx-wheels/resolve/main/cpu/$SHERPA_ONNX_VERSION/sherpa_onnx-${SHERPA_ONNX_VERSION}-cp38-cp38-linux_armv7l.whl
55 unzip ./sherpa_onnx-${SHERPA_ONNX_VERSION}-cp38-cp38-linux_armv7l.whl 55 unzip ./sherpa_onnx-${SHERPA_ONNX_VERSION}-cp38-cp38-linux_armv7l.whl
56 56
57 cp -v sherpa_onnx/lib/*.so* $dst 57 cp -v sherpa_onnx/lib/*.so* $dst
@@ -84,7 +84,7 @@ function osx() { @@ -84,7 +84,7 @@ function osx() {
84 84
85 mkdir t 85 mkdir t
86 cd t 86 cd t
87 - wget -q https://huggingface.co/csukuangfj/sherpa-onnx-wheels/resolve/main/sherpa_onnx-${SHERPA_ONNX_VERSION}-cp39-cp39-macosx_11_0_x86_64.whl 87 + wget -q https://huggingface.co/csukuangfj/sherpa-onnx-wheels/resolve/main/cpu/$SHERPA_ONNX_VERSION/sherpa_onnx-${SHERPA_ONNX_VERSION}-cp39-cp39-macosx_11_0_x86_64.whl
88 unzip ./sherpa_onnx-${SHERPA_ONNX_VERSION}-cp39-cp39-macosx_11_0_x86_64.whl 88 unzip ./sherpa_onnx-${SHERPA_ONNX_VERSION}-cp39-cp39-macosx_11_0_x86_64.whl
89 89
90 cp -v sherpa_onnx/lib/*.dylib $dst/ 90 cp -v sherpa_onnx/lib/*.dylib $dst/
@@ -102,7 +102,7 @@ function osx() { @@ -102,7 +102,7 @@ function osx() {
102 102
103 mkdir t 103 mkdir t
104 cd t 104 cd t
105 - wget -q https://huggingface.co/csukuangfj/sherpa-onnx-wheels/resolve/main/sherpa_onnx-${SHERPA_ONNX_VERSION}-cp39-cp39-macosx_11_0_arm64.whl 105 + wget -q https://huggingface.co/csukuangfj/sherpa-onnx-wheels/resolve/main/cpu/$SHERPA_ONNX_VERSION/sherpa_onnx-${SHERPA_ONNX_VERSION}-cp39-cp39-macosx_11_0_arm64.whl
106 unzip ./sherpa_onnx-${SHERPA_ONNX_VERSION}-cp39-cp39-macosx_11_0_arm64.whl 106 unzip ./sherpa_onnx-${SHERPA_ONNX_VERSION}-cp39-cp39-macosx_11_0_arm64.whl
107 107
108 cp -v sherpa_onnx/lib/*.dylib $dst/ 108 cp -v sherpa_onnx/lib/*.dylib $dst/
@@ -137,7 +137,7 @@ function windows() { @@ -137,7 +137,7 @@ function windows() {
137 dst=$(realpath sherpa-onnx-go-windows/lib/x86_64-pc-windows-gnu) 137 dst=$(realpath sherpa-onnx-go-windows/lib/x86_64-pc-windows-gnu)
138 mkdir t 138 mkdir t
139 cd t 139 cd t
140 - wget -q https://huggingface.co/csukuangfj/sherpa-onnx-wheels/resolve/main/sherpa_onnx-${SHERPA_ONNX_VERSION}-cp38-cp38-win_amd64.whl 140 + wget -q https://huggingface.co/csukuangfj/sherpa-onnx-wheels/resolve/main/cpu/$SHERPA_ONNX_VERSION/sherpa_onnx-${SHERPA_ONNX_VERSION}-cp38-cp38-win_amd64.whl
141 unzip ./sherpa_onnx-${SHERPA_ONNX_VERSION}-cp38-cp38-win_amd64.whl 141 unzip ./sherpa_onnx-${SHERPA_ONNX_VERSION}-cp38-cp38-win_amd64.whl
142 142
143 cp -v sherpa_onnx-${SHERPA_ONNX_VERSION}.data/data/bin/*.dll $dst 143 cp -v sherpa_onnx-${SHERPA_ONNX_VERSION}.data/data/bin/*.dll $dst
@@ -149,7 +149,7 @@ function windows() { @@ -149,7 +149,7 @@ function windows() {
149 dst=$(realpath sherpa-onnx-go-windows/lib/i686-pc-windows-gnu) 149 dst=$(realpath sherpa-onnx-go-windows/lib/i686-pc-windows-gnu)
150 mkdir t 150 mkdir t
151 cd t 151 cd t
152 - wget -q https://huggingface.co/csukuangfj/sherpa-onnx-wheels/resolve/main/sherpa_onnx-${SHERPA_ONNX_VERSION}-cp38-cp38-win32.whl 152 + wget -q https://huggingface.co/csukuangfj/sherpa-onnx-wheels/resolve/main/cpu/$SHERPA_ONNX_VERSION/sherpa_onnx-${SHERPA_ONNX_VERSION}-cp38-cp38-win32.whl
153 unzip ./sherpa_onnx-${SHERPA_ONNX_VERSION}-cp38-cp38-win32.whl 153 unzip ./sherpa_onnx-${SHERPA_ONNX_VERSION}-cp38-cp38-win32.whl
154 154
155 cp -v sherpa_onnx-${SHERPA_ONNX_VERSION}.data/data/bin/*.dll $dst 155 cp -v sherpa_onnx-${SHERPA_ONNX_VERSION}.data/data/bin/*.dll $dst