from asr_data import Audio, AudioChunk
from asr_data.annotation import AudioActivity
from .vad_burn import (
FireRedVadDetection,
FireRedVadModel,
FireRedVadSession,
FireRedVadTiming,
FsmnVadModel,
FsmnVadSession,
VadDetection,
VadOptions,
VadSegment,
VadTiming,
)
__all__ = [
"FireRedVadDetection",
"FireRedVadModel",
"FireRedVadSession",
"FireRedVadTiming",
"FsmnVadModel",
"FsmnVadSession",
"VadDetection",
"VadOptions",
"VadSegment",
"VadTiming",
]
_VAD_SAMPLE_RATE = 16000
def _write_spans(timeline, spans) -> None:
for span in spans:
timeline.annotate_span(
span.start_ms,
span.end_ms,
AudioActivity(event=span.event, confidence=span.confidence),
is_reference=False,
source=span.source,
)
def _annotate(self, audio: Audio, options: VadOptions | None = None) -> Audio:
for timeline in audio.timelines.values():
wave = timeline.as_waveform()
if wave.sample_rate != _VAD_SAMPLE_RATE:
wave = wave.resample(_VAD_SAMPLE_RATE)
_write_spans(
timeline, self.detect(list(wave.samples), wave.sample_rate, options)
)
return audio
def _annotate_chunk(self, chunk: AudioChunk) -> list:
spans_all = []
for name, timeline in chunk.timelines.items():
wave = chunk.as_waveform(name)
spans = self.annotate_waveform(
list(wave.samples), int(wave.sample_rate), name, chunk.is_final
)
_write_spans(timeline, spans)
spans_all.extend(spans)
return spans_all
FsmnVadModel.annotate = _annotate
FireRedVadModel.annotate = _annotate
FsmnVadSession.annotate = _annotate_chunk
FireRedVadSession.annotate = _annotate_chunk