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>
正在显示
1 个修改的文件
包含
154 行增加
和
54 行删除
| @@ -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) |
-
请 注册 或 登录 后发表评论