@@ -558,4 +558,114 @@ int32_t OfflineSpeechDenoiser::GetSampleRate() const {
558558 return SherpaOnnxOfflineSpeechDenoiserGetSampleRate (p_);
559559}
560560
561+ CircularBuffer CircularBuffer::Create (int32_t capacity) {
562+ auto p = SherpaOnnxCreateCircularBuffer (capacity);
563+ return CircularBuffer (p);
564+ }
565+
566+ CircularBuffer::CircularBuffer (const SherpaOnnxCircularBuffer *p)
567+ : MoveOnly<CircularBuffer, SherpaOnnxCircularBuffer>(p) {}
568+
569+ void CircularBuffer::Destroy (const SherpaOnnxCircularBuffer *p) const {
570+ SherpaOnnxDestroyCircularBuffer (p);
571+ }
572+
573+ void CircularBuffer::Push (const float *samples, int32_t n) const {
574+ SherpaOnnxCircularBufferPush (p_, samples, n);
575+ }
576+
577+ std::vector<float > CircularBuffer::Get (int32_t start_index, int32_t n) const {
578+ const float *samples = SherpaOnnxCircularBufferGet (p_, start_index, n);
579+ std::vector<float > ans (n);
580+ std::copy (samples, samples + n, ans.begin ());
581+
582+ SherpaOnnxCircularBufferFree (samples);
583+ return ans;
584+ }
585+
586+ void CircularBuffer::Pop (int32_t n) const {
587+ SherpaOnnxCircularBufferPop (p_, n);
588+ }
589+
590+ int32_t CircularBuffer::Size () const {
591+ return SherpaOnnxCircularBufferSize (p_);
592+ }
593+
594+ int32_t CircularBuffer::Head () const {
595+ return SherpaOnnxCircularBufferHead (p_);
596+ }
597+
598+ void CircularBuffer::Reset () const { SherpaOnnxCircularBufferReset (p_); }
599+
600+ VoiceActivityDetector VoiceActivityDetector::Create (
601+ const VadModelConfig &config, float buffer_size_in_seconds) {
602+ struct SherpaOnnxVadModelConfig c;
603+ memset (&c, 0 , sizeof (c));
604+
605+ c.silero_vad .model = config.silero_vad .model .c_str ();
606+ c.silero_vad .threshold = config.silero_vad .threshold ;
607+ c.silero_vad .min_silence_duration = config.silero_vad .min_silence_duration ;
608+ c.silero_vad .min_speech_duration = config.silero_vad .min_speech_duration ;
609+ c.silero_vad .window_size = config.silero_vad .window_size ;
610+ c.silero_vad .max_speech_duration = config.silero_vad .max_speech_duration ;
611+
612+ c.sample_rate = config.sample_rate ;
613+ c.num_threads = config.num_threads ;
614+ c.provider = config.provider .c_str ();
615+ c.debug = config.debug ;
616+
617+ auto p = SherpaOnnxCreateVoiceActivityDetector (&c, buffer_size_in_seconds);
618+ return VoiceActivityDetector (p);
619+ }
620+
621+ VoiceActivityDetector::VoiceActivityDetector (
622+ const SherpaOnnxVoiceActivityDetector *p)
623+ : MoveOnly<VoiceActivityDetector, SherpaOnnxVoiceActivityDetector>(p) {}
624+
625+ void VoiceActivityDetector::Destroy (
626+ const SherpaOnnxVoiceActivityDetector *p) const {
627+ SherpaOnnxDestroyVoiceActivityDetector (p);
628+ }
629+
630+ void VoiceActivityDetector::AcceptWaveform (const float *samples,
631+ int32_t n) const {
632+ SherpaOnnxVoiceActivityDetectorAcceptWaveform (p_, samples, n);
633+ }
634+
635+ bool VoiceActivityDetector::IsEmpty () const {
636+ return SherpaOnnxVoiceActivityDetectorEmpty (p_);
637+ }
638+
639+ bool VoiceActivityDetector ::IsDetected () const {
640+ return SherpaOnnxVoiceActivityDetectorDetected (p_);
641+ }
642+
643+ void VoiceActivityDetector::Pop () const {
644+ SherpaOnnxVoiceActivityDetectorPop (p_);
645+ }
646+
647+ void VoiceActivityDetector::Clear () const {
648+ SherpaOnnxVoiceActivityDetectorClear (p_);
649+ }
650+
651+ SpeechSegment VoiceActivityDetector::Front () const {
652+ auto f = SherpaOnnxVoiceActivityDetectorFront (p_);
653+
654+ SpeechSegment segment;
655+ segment.start = f->start ;
656+ segment.samples = std::vector<float >{f->samples , f->samples + f->n };
657+
658+ SherpaOnnxDestroySpeechSegment (f);
659+
660+ return segment;
661+ }
662+
663+ void VoiceActivityDetector::Reset () const {
664+ SherpaOnnxVoiceActivityDetectorReset (p_);
665+ }
666+
667+ void VoiceActivityDetector::Flush () const {
668+ SherpaOnnxVoiceActivityDetectorFlush (p_);
669+ }
670+
561671} // namespace sherpa_onnx::cxx
0 commit comments