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,32 @@
/// Copyright (c) 2024.5 by 东风破
using System.Runtime.InteropServices;
namespace SherpaOnnx
{
[StructLayout(LayoutKind.Sequential)]
public struct OfflineCanaryModelConfig
{
public OfflineCanaryModelConfig()
{
Encoder = "";
Decoder = "";
SrcLang = "en";
TgtLang = "en";
UsePnc = 1;
}
[MarshalAs(UnmanagedType.LPStr)]
public string Encoder;
[MarshalAs(UnmanagedType.LPStr)]
public string Decoder;
[MarshalAs(UnmanagedType.LPStr)]
public string SrcLang;
[MarshalAs(UnmanagedType.LPStr)]
public string TgtLang;
public int UsePnc;
}
}

View File

@@ -28,6 +28,7 @@ namespace SherpaOnnx
FireRedAsr = new OfflineFireRedAsrModelConfig();
Dolphin = new OfflineDolphinModelConfig();
ZipformerCtc = new OfflineZipformerCtcModelConfig();
Canary = new OfflineCanaryModelConfig();
}
public OfflineTransducerModelConfig Transducer;
public OfflineParaformerModelConfig Paraformer;
@@ -62,5 +63,6 @@ namespace SherpaOnnx
public OfflineFireRedAsrModelConfig FireRedAsr;
public OfflineDolphinModelConfig Dolphin;
public OfflineZipformerCtcModelConfig ZipformerCtc;
public OfflineCanaryModelConfig Canary;
}
}

View File

@@ -14,6 +14,11 @@ namespace SherpaOnnx
_handle = new HandleRef(this, h);
}
public void SetConfig(OfflineRecognizerConfig config)
{
SherpaOnnxOfflineRecognizerSetConfig(_handle.Handle, ref config);
}
public OfflineStream CreateStream()
{
IntPtr p = SherpaOnnxCreateOfflineStream(_handle.Handle);
@@ -65,6 +70,9 @@ namespace SherpaOnnx
[DllImport(Dll.Filename)]
private static extern IntPtr SherpaOnnxCreateOfflineRecognizer(ref OfflineRecognizerConfig config);
[DllImport(Dll.Filename)]
private static extern void SherpaOnnxOfflineRecognizerSetConfig(IntPtr handle, ref OfflineRecognizerConfig config);
[DllImport(Dll.Filename)]
private static extern void SherpaOnnxDestroyOfflineRecognizer(IntPtr handle);

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