franck-li
Committed by GitHub

add SherpaOnnxOfflineRecognizerSetConfig binding for go, and optimize the new/fr…

…ee for C.struct_SherpaOnnxOfflineRecognizerConfig ptr (#1976)

Co-authored-by: liyuzhi <liyuzhi@info.easeus.com.cn>
@@ -479,123 +479,215 @@ type OfflineRecognizerResult struct { @@ -479,123 +479,215 @@ type OfflineRecognizerResult struct {
479 Event string 479 Event string
480 } 480 }
481 481
482 -// Frees the internal pointer of the recognition to avoid memory leak.  
483 -func DeleteOfflineRecognizer(recognizer *OfflineRecognizer) {  
484 - C.SherpaOnnxDestroyOfflineRecognizer(recognizer.impl)  
485 - recognizer.impl = nil  
486 -}  
487 -  
488 -// The user is responsible to invoke [DeleteOfflineRecognizer]() to free  
489 -// the returned recognizer to avoid memory leak  
490 -func NewOfflineRecognizer(config *OfflineRecognizerConfig) *OfflineRecognizer { 482 +func newCOfflineRecognizerConfig(config *OfflineRecognizerConfig) *C.struct_SherpaOnnxOfflineRecognizerConfig {
491 c := C.struct_SherpaOnnxOfflineRecognizerConfig{} 483 c := C.struct_SherpaOnnxOfflineRecognizerConfig{}
492 c.feat_config.sample_rate = C.int(config.FeatConfig.SampleRate) 484 c.feat_config.sample_rate = C.int(config.FeatConfig.SampleRate)
493 c.feat_config.feature_dim = C.int(config.FeatConfig.FeatureDim) 485 c.feat_config.feature_dim = C.int(config.FeatConfig.FeatureDim)
494 486
495 c.model_config.transducer.encoder = C.CString(config.ModelConfig.Transducer.Encoder) 487 c.model_config.transducer.encoder = C.CString(config.ModelConfig.Transducer.Encoder)
496 - defer C.free(unsafe.Pointer(c.model_config.transducer.encoder))  
497 -  
498 c.model_config.transducer.decoder = C.CString(config.ModelConfig.Transducer.Decoder) 488 c.model_config.transducer.decoder = C.CString(config.ModelConfig.Transducer.Decoder)
499 - defer C.free(unsafe.Pointer(c.model_config.transducer.decoder))  
500 -  
501 c.model_config.transducer.joiner = C.CString(config.ModelConfig.Transducer.Joiner) 489 c.model_config.transducer.joiner = C.CString(config.ModelConfig.Transducer.Joiner)
502 - defer C.free(unsafe.Pointer(c.model_config.transducer.joiner))  
503 490
504 c.model_config.paraformer.model = C.CString(config.ModelConfig.Paraformer.Model) 491 c.model_config.paraformer.model = C.CString(config.ModelConfig.Paraformer.Model)
505 - defer C.free(unsafe.Pointer(c.model_config.paraformer.model))  
506 492
507 c.model_config.nemo_ctc.model = C.CString(config.ModelConfig.NemoCTC.Model) 493 c.model_config.nemo_ctc.model = C.CString(config.ModelConfig.NemoCTC.Model)
508 - defer C.free(unsafe.Pointer(c.model_config.nemo_ctc.model))  
509 494
510 c.model_config.whisper.encoder = C.CString(config.ModelConfig.Whisper.Encoder) 495 c.model_config.whisper.encoder = C.CString(config.ModelConfig.Whisper.Encoder)
511 - defer C.free(unsafe.Pointer(c.model_config.whisper.encoder))  
512 -  
513 c.model_config.whisper.decoder = C.CString(config.ModelConfig.Whisper.Decoder) 496 c.model_config.whisper.decoder = C.CString(config.ModelConfig.Whisper.Decoder)
514 - defer C.free(unsafe.Pointer(c.model_config.whisper.decoder))  
515 -  
516 c.model_config.whisper.language = C.CString(config.ModelConfig.Whisper.Language) 497 c.model_config.whisper.language = C.CString(config.ModelConfig.Whisper.Language)
517 - defer C.free(unsafe.Pointer(c.model_config.whisper.language))  
518 -  
519 c.model_config.whisper.task = C.CString(config.ModelConfig.Whisper.Task) 498 c.model_config.whisper.task = C.CString(config.ModelConfig.Whisper.Task)
520 - defer C.free(unsafe.Pointer(c.model_config.whisper.task))  
521 -  
522 c.model_config.whisper.tail_paddings = C.int(config.ModelConfig.Whisper.TailPaddings) 499 c.model_config.whisper.tail_paddings = C.int(config.ModelConfig.Whisper.TailPaddings)
523 500
524 c.model_config.tdnn.model = C.CString(config.ModelConfig.Tdnn.Model) 501 c.model_config.tdnn.model = C.CString(config.ModelConfig.Tdnn.Model)
525 - defer C.free(unsafe.Pointer(c.model_config.tdnn.model))  
526 502
527 c.model_config.sense_voice.model = C.CString(config.ModelConfig.SenseVoice.Model) 503 c.model_config.sense_voice.model = C.CString(config.ModelConfig.SenseVoice.Model)
528 - defer C.free(unsafe.Pointer(c.model_config.sense_voice.model))  
529 -  
530 c.model_config.sense_voice.language = C.CString(config.ModelConfig.SenseVoice.Language) 504 c.model_config.sense_voice.language = C.CString(config.ModelConfig.SenseVoice.Language)
531 - defer C.free(unsafe.Pointer(c.model_config.sense_voice.language))  
532 -  
533 c.model_config.sense_voice.use_itn = C.int(config.ModelConfig.SenseVoice.UseInverseTextNormalization) 505 c.model_config.sense_voice.use_itn = C.int(config.ModelConfig.SenseVoice.UseInverseTextNormalization)
534 506
535 c.model_config.moonshine.preprocessor = C.CString(config.ModelConfig.Moonshine.Preprocessor) 507 c.model_config.moonshine.preprocessor = C.CString(config.ModelConfig.Moonshine.Preprocessor)
536 - defer C.free(unsafe.Pointer(c.model_config.moonshine.preprocessor))  
537 -  
538 c.model_config.moonshine.encoder = C.CString(config.ModelConfig.Moonshine.Encoder) 508 c.model_config.moonshine.encoder = C.CString(config.ModelConfig.Moonshine.Encoder)
539 - defer C.free(unsafe.Pointer(c.model_config.moonshine.encoder))  
540 -  
541 c.model_config.moonshine.uncached_decoder = C.CString(config.ModelConfig.Moonshine.UncachedDecoder) 509 c.model_config.moonshine.uncached_decoder = C.CString(config.ModelConfig.Moonshine.UncachedDecoder)
542 - defer C.free(unsafe.Pointer(c.model_config.moonshine.uncached_decoder))  
543 -  
544 c.model_config.moonshine.cached_decoder = C.CString(config.ModelConfig.Moonshine.CachedDecoder) 510 c.model_config.moonshine.cached_decoder = C.CString(config.ModelConfig.Moonshine.CachedDecoder)
545 - defer C.free(unsafe.Pointer(c.model_config.moonshine.cached_decoder))  
546 511
547 c.model_config.fire_red_asr.encoder = C.CString(config.ModelConfig.FireRedAsr.Encoder) 512 c.model_config.fire_red_asr.encoder = C.CString(config.ModelConfig.FireRedAsr.Encoder)
548 - defer C.free(unsafe.Pointer(c.model_config.fire_red_asr.encoder))  
549 -  
550 c.model_config.fire_red_asr.decoder = C.CString(config.ModelConfig.FireRedAsr.Decoder) 513 c.model_config.fire_red_asr.decoder = C.CString(config.ModelConfig.FireRedAsr.Decoder)
551 - defer C.free(unsafe.Pointer(c.model_config.fire_red_asr.decoder))  
552 514
553 c.model_config.tokens = C.CString(config.ModelConfig.Tokens) 515 c.model_config.tokens = C.CString(config.ModelConfig.Tokens)
554 - defer C.free(unsafe.Pointer(c.model_config.tokens))  
555 516
556 c.model_config.num_threads = C.int(config.ModelConfig.NumThreads) 517 c.model_config.num_threads = C.int(config.ModelConfig.NumThreads)
557 518
558 c.model_config.debug = C.int(config.ModelConfig.Debug) 519 c.model_config.debug = C.int(config.ModelConfig.Debug)
559 520
560 c.model_config.provider = C.CString(config.ModelConfig.Provider) 521 c.model_config.provider = C.CString(config.ModelConfig.Provider)
561 - defer C.free(unsafe.Pointer(c.model_config.provider))  
562 522
563 c.model_config.model_type = C.CString(config.ModelConfig.ModelType) 523 c.model_config.model_type = C.CString(config.ModelConfig.ModelType)
564 - defer C.free(unsafe.Pointer(c.model_config.model_type))  
565 524
566 c.model_config.modeling_unit = C.CString(config.ModelConfig.ModelingUnit) 525 c.model_config.modeling_unit = C.CString(config.ModelConfig.ModelingUnit)
567 - defer C.free(unsafe.Pointer(c.model_config.modeling_unit))  
568 526
569 c.model_config.bpe_vocab = C.CString(config.ModelConfig.BpeVocab) 527 c.model_config.bpe_vocab = C.CString(config.ModelConfig.BpeVocab)
570 - defer C.free(unsafe.Pointer(c.model_config.bpe_vocab))  
571 528
572 c.model_config.telespeech_ctc = C.CString(config.ModelConfig.TeleSpeechCtc) 529 c.model_config.telespeech_ctc = C.CString(config.ModelConfig.TeleSpeechCtc)
573 - defer C.free(unsafe.Pointer(c.model_config.telespeech_ctc))  
574 530
575 c.lm_config.model = C.CString(config.LmConfig.Model) 531 c.lm_config.model = C.CString(config.LmConfig.Model)
576 - defer C.free(unsafe.Pointer(c.lm_config.model))  
577 -  
578 c.lm_config.scale = C.float(config.LmConfig.Scale) 532 c.lm_config.scale = C.float(config.LmConfig.Scale)
579 533
580 c.decoding_method = C.CString(config.DecodingMethod) 534 c.decoding_method = C.CString(config.DecodingMethod)
581 - defer C.free(unsafe.Pointer(c.decoding_method))  
582 535
583 c.max_active_paths = C.int(config.MaxActivePaths) 536 c.max_active_paths = C.int(config.MaxActivePaths)
584 537
585 c.hotwords_file = C.CString(config.HotwordsFile) 538 c.hotwords_file = C.CString(config.HotwordsFile)
586 - defer C.free(unsafe.Pointer(c.hotwords_file))  
587 -  
588 c.hotwords_score = C.float(config.HotwordsScore) 539 c.hotwords_score = C.float(config.HotwordsScore)
589 540
590 c.blank_penalty = C.float(config.BlankPenalty) 541 c.blank_penalty = C.float(config.BlankPenalty)
591 542
592 c.rule_fsts = C.CString(config.RuleFsts) 543 c.rule_fsts = C.CString(config.RuleFsts)
593 - defer C.free(unsafe.Pointer(c.rule_fsts))  
594 -  
595 c.rule_fars = C.CString(config.RuleFars) 544 c.rule_fars = C.CString(config.RuleFars)
596 - defer C.free(unsafe.Pointer(c.rule_fars)) 545 + return &c
  546 +}
  547 +func freeCOfflineRecognizerConfig(c *C.struct_SherpaOnnxOfflineRecognizerConfig) {
  548 + if c.model_config.transducer.encoder != nil {
  549 + C.free(unsafe.Pointer(c.model_config.transducer.encoder))
  550 + c.model_config.transducer.encoder = nil
  551 + }
  552 + if c.model_config.transducer.decoder != nil {
  553 + C.free(unsafe.Pointer(c.model_config.transducer.decoder))
  554 + c.model_config.transducer.decoder = nil
  555 + }
  556 + if c.model_config.transducer.joiner != nil {
  557 + C.free(unsafe.Pointer(c.model_config.transducer.joiner))
  558 + c.model_config.transducer.joiner = nil
  559 + }
  560 +
  561 + if c.model_config.paraformer.model != nil {
  562 + C.free(unsafe.Pointer(c.model_config.paraformer.model))
  563 + c.model_config.paraformer.model = nil
  564 + }
  565 +
  566 + if c.model_config.nemo_ctc.model != nil {
  567 + C.free(unsafe.Pointer(c.model_config.nemo_ctc.model))
  568 + c.model_config.nemo_ctc.model = nil
  569 + }
  570 +
  571 + if c.model_config.whisper.encoder != nil {
  572 + C.free(unsafe.Pointer(c.model_config.whisper.encoder))
  573 + c.model_config.whisper.encoder = nil
  574 + }
  575 + if c.model_config.whisper.decoder != nil {
  576 + C.free(unsafe.Pointer(c.model_config.whisper.decoder))
  577 + c.model_config.whisper.decoder = nil
  578 + }
  579 + if c.model_config.whisper.language != nil {
  580 + C.free(unsafe.Pointer(c.model_config.whisper.language))
  581 + c.model_config.whisper.language = nil
  582 + }
  583 + if c.model_config.whisper.task != nil {
  584 + C.free(unsafe.Pointer(c.model_config.whisper.task))
  585 + c.model_config.whisper.task = nil
  586 + }
  587 +
  588 + if c.model_config.tdnn.model != nil {
  589 + C.free(unsafe.Pointer(c.model_config.tdnn.model))
  590 + c.model_config.tdnn.model = nil
  591 + }
  592 +
  593 + if c.model_config.sense_voice.model != nil {
  594 + C.free(unsafe.Pointer(c.model_config.sense_voice.model))
  595 + c.model_config.sense_voice.model = nil
  596 + }
  597 + if c.model_config.sense_voice.language != nil {
  598 + C.free(unsafe.Pointer(c.model_config.sense_voice.language))
  599 + c.model_config.sense_voice.language = nil
  600 + }
  601 +
  602 + if c.model_config.moonshine.preprocessor != nil {
  603 + C.free(unsafe.Pointer(c.model_config.moonshine.preprocessor))
  604 + c.model_config.moonshine.preprocessor = nil
  605 + }
  606 + if c.model_config.moonshine.encoder != nil {
  607 + C.free(unsafe.Pointer(c.model_config.moonshine.encoder))
  608 + c.model_config.moonshine.encoder = nil
  609 + }
  610 + if c.model_config.moonshine.uncached_decoder != nil {
  611 + C.free(unsafe.Pointer(c.model_config.moonshine.uncached_decoder))
  612 + c.model_config.moonshine.uncached_decoder = nil
  613 + }
  614 + if c.model_config.moonshine.cached_decoder != nil {
  615 + C.free(unsafe.Pointer(c.model_config.moonshine.cached_decoder))
  616 + c.model_config.moonshine.cached_decoder = nil
  617 + }
  618 +
  619 + if c.model_config.fire_red_asr.encoder != nil {
  620 + C.free(unsafe.Pointer(c.model_config.fire_red_asr.encoder))
  621 + c.model_config.fire_red_asr.encoder = nil
  622 + }
  623 + if c.model_config.fire_red_asr.decoder != nil {
  624 + C.free(unsafe.Pointer(c.model_config.fire_red_asr.decoder))
  625 + c.model_config.fire_red_asr.decoder = nil
  626 + }
  627 +
  628 + if c.model_config.tokens != nil {
  629 + C.free(unsafe.Pointer(c.model_config.tokens))
  630 + c.model_config.tokens = nil
  631 + }
  632 + if c.model_config.provider != nil {
  633 + C.free(unsafe.Pointer(c.model_config.provider))
  634 + c.model_config.provider = nil
  635 + }
  636 + if c.model_config.model_type != nil {
  637 + C.free(unsafe.Pointer(c.model_config.model_type))
  638 + c.model_config.model_type = nil
  639 + }
  640 + if c.model_config.modeling_unit != nil {
  641 + C.free(unsafe.Pointer(c.model_config.modeling_unit))
  642 + c.model_config.modeling_unit = nil
  643 + }
  644 + if c.model_config.bpe_vocab != nil {
  645 + C.free(unsafe.Pointer(c.model_config.bpe_vocab))
  646 + c.model_config.bpe_vocab = nil
  647 + }
  648 + if c.model_config.telespeech_ctc != nil {
  649 + C.free(unsafe.Pointer(c.model_config.telespeech_ctc))
  650 + c.model_config.telespeech_ctc = nil
  651 + }
597 652
598 - impl := C.SherpaOnnxCreateOfflineRecognizer(&c) 653 + if c.lm_config.model != nil {
  654 + C.free(unsafe.Pointer(c.lm_config.model))
  655 + c.lm_config.model = nil
  656 + }
  657 +
  658 + if c.decoding_method != nil {
  659 + C.free(unsafe.Pointer(c.decoding_method))
  660 + c.decoding_method = nil
  661 + }
  662 +
  663 + if c.hotwords_file != nil {
  664 + C.free(unsafe.Pointer(c.hotwords_file))
  665 + c.hotwords_file = nil
  666 + }
  667 +
  668 + if c.rule_fsts != nil {
  669 + C.free(unsafe.Pointer(c.rule_fsts))
  670 + c.rule_fsts = nil
  671 + }
  672 + if c.rule_fars != nil {
  673 + C.free(unsafe.Pointer(c.rule_fars))
  674 + c.rule_fars = nil
  675 + }
  676 +}
  677 +
  678 +// Frees the internal pointer of the recognition to avoid memory leak.
  679 +func DeleteOfflineRecognizer(recognizer *OfflineRecognizer) {
  680 + C.SherpaOnnxDestroyOfflineRecognizer(recognizer.impl)
  681 + recognizer.impl = nil
  682 +}
  683 +
  684 +// The user is responsible to invoke [DeleteOfflineRecognizer]() to free
  685 +// the returned recognizer to avoid memory leak
  686 +func NewOfflineRecognizer(config *OfflineRecognizerConfig) *OfflineRecognizer {
  687 + c := newCOfflineRecognizerConfig(config)
  688 + defer freeCOfflineRecognizerConfig(c)
  689 +
  690 + impl := C.SherpaOnnxCreateOfflineRecognizer(c)
599 if impl == nil { 691 if impl == nil {
600 return nil 692 return nil
601 } 693 }
@@ -605,6 +697,14 @@ func NewOfflineRecognizer(config *OfflineRecognizerConfig) *OfflineRecognizer { @@ -605,6 +697,14 @@ func NewOfflineRecognizer(config *OfflineRecognizerConfig) *OfflineRecognizer {
605 return recognizer 697 return recognizer
606 } 698 }
607 699
  700 +// Set new config to replace
  701 +func (r *OfflineRecognizer) SetConfig(config *OfflineRecognizerConfig) {
  702 + c := newCOfflineRecognizerConfig(config)
  703 + defer freeCOfflineRecognizerConfig(c)
  704 +
  705 + C.SherpaOnnxOfflineRecognizerSetConfig(r.impl, c)
  706 +}
  707 +
608 // Frees the internal pointer of the stream to avoid memory leak. 708 // Frees the internal pointer of the stream to avoid memory leak.
609 func DeleteOfflineStream(stream *OfflineStream) { 709 func DeleteOfflineStream(stream *OfflineStream) {
610 C.SherpaOnnxDestroyOfflineStream(stream.impl) 710 C.SherpaOnnxDestroyOfflineStream(stream.impl)