Add Pascal/Go/C#/Dart API for NeMo Canary ASR models (#2367)

Add support for the new NeMo Canary ASR model across multiple language bindings by introducing a Canary model configuration and setter method on the offline recognizer.

- Define Canary model config in Pascal, Go, C#, Dart and update converter functions
- Add SetConfig API for offline recognizer (Pascal, Go, C#, Dart)
- Extend CI/workflows and example scripts to test non-streaming Canary decoding
This commit is contained in:
Fangjun Kuang
2025-07-10 14:53:33 +08:00
committed by GitHub
parent e2b2d5ea57
commit fd9a687ec2
27 changed files with 779 additions and 8 deletions

View File

@@ -0,0 +1,5 @@
module non-streaming-canary-decode-files
go 1.17
replace github.com/k2-fsa/sherpa-onnx-go/sherpa_onnx => ../

View File

@@ -0,0 +1 @@
../../../../go-api-examples/non-streaming-canary-decode-files/main.go

View File

@@ -0,0 +1 @@
../../../../go-api-examples/non-streaming-canary-decode-files/run.sh

View File

@@ -414,6 +414,14 @@ type OfflineWhisperModelConfig struct {
TailPaddings int
}
type OfflineCanaryModelConfig struct {
Encoder string
Decoder string
SrcLang string
TgtLang string
UsePnc int
}
type OfflineFireRedAsrModelConfig struct {
Encoder string
Decoder string
@@ -453,6 +461,7 @@ type OfflineModelConfig struct {
FireRedAsr OfflineFireRedAsrModelConfig
Dolphin OfflineDolphinModelConfig
ZipformerCtc OfflineZipformerCtcModelConfig
Canary OfflineCanaryModelConfig
Tokens string // Path to tokens.txt
// Number of threads to use for neural network computation
@@ -547,6 +556,12 @@ func newCOfflineRecognizerConfig(config *OfflineRecognizerConfig) *C.struct_Sher
c.model_config.dolphin.model = C.CString(config.ModelConfig.Dolphin.Model)
c.model_config.zipformer_ctc.model = C.CString(config.ModelConfig.ZipformerCtc.Model)
c.model_config.canary.encoder = C.CString(config.ModelConfig.Canary.Encoder)
c.model_config.canary.decoder = C.CString(config.ModelConfig.Canary.Decoder)
c.model_config.canary.src_lang = C.CString(config.ModelConfig.Canary.SrcLang)
c.model_config.canary.tgt_lang = C.CString(config.ModelConfig.Canary.TgtLang)
c.model_config.canary.use_pnc = C.int(config.ModelConfig.Canary.UsePnc)
c.model_config.tokens = C.CString(config.ModelConfig.Tokens)
c.model_config.num_threads = C.int(config.ModelConfig.NumThreads)
@@ -675,6 +690,26 @@ func freeCOfflineRecognizerConfig(c *C.struct_SherpaOnnxOfflineRecognizerConfig)
c.model_config.zipformer_ctc.model = nil
}
if c.model_config.canary.encoder != nil {
C.free(unsafe.Pointer(c.model_config.canary.encoder))
c.model_config.canary.encoder = nil
}
if c.model_config.canary.decoder != nil {
C.free(unsafe.Pointer(c.model_config.canary.decoder))
c.model_config.canary.decoder = nil
}
if c.model_config.canary.src_lang != nil {
C.free(unsafe.Pointer(c.model_config.canary.src_lang))
c.model_config.canary.src_lang = nil
}
if c.model_config.canary.tgt_lang != nil {
C.free(unsafe.Pointer(c.model_config.canary.tgt_lang))
c.model_config.canary.tgt_lang = nil
}
if c.model_config.tokens != nil {
C.free(unsafe.Pointer(c.model_config.tokens))
c.model_config.tokens = nil