Add Go API for homophone replacer (#2168)

This commit is contained in:
Fangjun Kuang
2025-04-30 23:47:38 +08:00
committed by GitHub
parent 85df96d528
commit fcb4c4eb2c
8 changed files with 157 additions and 48 deletions

View File

@@ -0,0 +1 @@
../../../../go-api-examples/non-streaming-decode-files/run-sense-voice-small-with-hr.sh

View File

@@ -0,0 +1 @@
../../../../go-api-examples/streaming-decode-files/run-zipformer2-ctc-with-hr.sh

View File

@@ -108,6 +108,12 @@ type OnlineCtcFstDecoderConfig struct {
MaxActive int
}
type HomophoneReplacerConfig struct {
DictDir string
Lexicon string
RuleFsts string
}
// Configuration for the online/streaming recognizer.
type OnlineRecognizerConfig struct {
FeatConfig FeatureConfig
@@ -137,6 +143,7 @@ type OnlineRecognizerConfig struct {
RuleFars string
HotwordsBuf string
HotwordsBufSize int
Hr HomophoneReplacerConfig
}
// It contains the recognition result for a online stream.
@@ -239,6 +246,15 @@ func NewOnlineRecognizer(config *OnlineRecognizerConfig) *OnlineRecognizer {
defer C.free(unsafe.Pointer(c.ctc_fst_decoder_config.graph))
c.ctc_fst_decoder_config.max_active = C.int(config.CtcFstDecoderConfig.MaxActive)
c.hr.dict_dir = C.CString(config.Hr.DictDir)
defer C.free(unsafe.Pointer(c.hr.dict_dir))
c.hr.lexicon = C.CString(config.Hr.Lexicon)
defer C.free(unsafe.Pointer(c.hr.lexicon))
c.hr.rule_fsts = C.CString(config.Hr.RuleFsts)
defer C.free(unsafe.Pointer(c.hr.rule_fsts))
impl := C.SherpaOnnxCreateOnlineRecognizer(&c)
if impl == nil {
return nil
@@ -462,6 +478,7 @@ type OfflineRecognizerConfig struct {
BlankPenalty float32
RuleFsts string
RuleFars string
Hr HomophoneReplacerConfig
}
// It wraps a pointer from C
@@ -549,6 +566,10 @@ func newCOfflineRecognizerConfig(config *OfflineRecognizerConfig) *C.struct_Sher
c.rule_fsts = C.CString(config.RuleFsts)
c.rule_fars = C.CString(config.RuleFars)
c.hr.dict_dir = C.CString(config.Hr.DictDir)
c.hr.lexicon = C.CString(config.Hr.Lexicon)
c.hr.rule_fsts = C.CString(config.Hr.RuleFsts)
return &c
}
func freeCOfflineRecognizerConfig(c *C.struct_SherpaOnnxOfflineRecognizerConfig) {
@@ -676,10 +697,26 @@ func freeCOfflineRecognizerConfig(c *C.struct_SherpaOnnxOfflineRecognizerConfig)
C.free(unsafe.Pointer(c.rule_fsts))
c.rule_fsts = nil
}
if c.rule_fars != nil {
C.free(unsafe.Pointer(c.rule_fars))
c.rule_fars = nil
}
if c.hr.dict_dir != nil {
C.free(unsafe.Pointer(c.hr.dict_dir))
c.hr.dict_dir = nil
}
if c.hr.lexicon != nil {
C.free(unsafe.Pointer(c.hr.lexicon))
c.hr.lexicon = nil
}
if c.hr.rule_fsts != nil {
C.free(unsafe.Pointer(c.hr.rule_fsts))
c.hr.rule_fsts = nil
}
}
// Frees the internal pointer of the recognition to avoid memory leak.