Metadata-Version: 2.4
Name: cjm-media-plugin-silero-vad
Version: 0.0.2
Summary: A local, persistent Voice Activity Detection (VAD) worker for the cjm-plugin-system that provides high-accuracy speech segmentation using Silero VAD with SQLite result caching.
Home-page: https://github.com/cj-mills/cjm-media-plugin-silero-vad
Author: Christian J. Mills
Author-email: 9126128+cj-mills@users.noreply.github.com
License: Apache-2.0
Keywords: nbdev jupyter notebook python
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Natural Language :: English
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Requires-Python: >=3.12
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: cjm_media_plugin_system
Requires-Dist: silero-vad
Requires-Dist: onnxruntime
Requires-Dist: librosa
Requires-Dist: numpy
Requires-Dist: soundfile
Provides-Extra: dev
Dynamic: author
Dynamic: author-email
Dynamic: classifier
Dynamic: description
Dynamic: description-content-type
Dynamic: home-page
Dynamic: keywords
Dynamic: license
Dynamic: license-file
Dynamic: provides-extra
Dynamic: requires-dist
Dynamic: requires-python
Dynamic: summary

# cjm-media-plugin-silero-vad


<!-- WARNING: THIS FILE WAS AUTOGENERATED! DO NOT EDIT! -->

## Install

``` bash
pip install cjm_media_plugin_silero_vad
```

## Project Structure

    nbs/
    ├── meta.ipynb   # Metadata introspection for the Silero VAD plugin used by cjm-ctl to generate the registration manifest.
    └── plugin.ipynb # Plugin implementation for Voice Activity Detection using Silero VAD with SQLite result caching.

Total: 2 notebooks

## Module Dependencies

``` mermaid
graph LR
    meta[meta<br/>Metadata]
    plugin[plugin<br/>Silero VAD Plugin]

    plugin --> meta
```

*1 cross-module dependencies detected*

## CLI Reference

No CLI commands found in this project.

## Module Overview

Detailed documentation for each module in the project:

### Metadata (`meta.ipynb`)

> Metadata introspection for the Silero VAD plugin used by cjm-ctl to
> generate the registration manifest.

#### Import

``` python
from cjm_media_plugin_silero_vad.meta import (
    get_plugin_metadata
)
```

#### Functions

``` python
def get_plugin_metadata() -> Dict[str, Any]:  # Plugin metadata for manifest generation
    """Return metadata required to register this plugin with the PluginManager."""
    # Fallback base path (current behavior for backward compatibility)
    base_path = os.path.dirname(os.path.dirname(sys.executable))
    
    # Use CJM config if available
    cjm_data_dir = os.environ.get("CJM_DATA_DIR")
    
    # Plugin data directory
    plugin_name = "cjm-media-plugin-silero-vad"
    if cjm_data_dir
    "Return metadata required to register this plugin with the PluginManager."
```

### Silero VAD Plugin (`plugin.ipynb`)

> Plugin implementation for Voice Activity Detection using Silero VAD
> with SQLite result caching.

#### Import

``` python
from cjm_media_plugin_silero_vad.plugin import (
    SileroVADConfig,
    SileroVADPlugin
)
```

#### Classes

``` python
@dataclass
class SileroVADConfig:
    "Configuration for Silero VAD parameters."
    
    threshold: float = field(...)
    min_speech_duration_ms: int = field(...)
    min_silence_duration_ms: int = field(...)
    speech_pad_ms: int = field(...)
    sampling_rate: int = field(...)
    use_onnx: bool = field(...)
```

``` python
class SileroVADPlugin:
    def __init__(self):
        """Initialize the Silero VAD plugin."""
        self.logger = logging.getLogger(f"{__name__}.{type(self).__name__}")
        self.config: SileroVADConfig = None
    "Voice Activity Detection plugin using Silero VAD."
    
    def __init__(self):
            """Initialize the Silero VAD plugin."""
            self.logger = logging.getLogger(f"{__name__}.{type(self).__name__}")
            self.config: SileroVADConfig = None
        "Initialize the Silero VAD plugin."
    
    def name(self) -> str:  # Plugin name identifier
            """Get the plugin name identifier."""
            return "silero-vad"
        
        @property
        def version(self) -> str:  # Plugin version string
        "Get the plugin name identifier."
    
    def version(self) -> str:  # Plugin version string
            """Get the plugin version string."""
            return "1.0.0"
        
        @property
        def supported_media_types(self) -> List[str]:  # Supported media types
        "Get the plugin version string."
    
    def supported_media_types(self) -> List[str]:  # Supported media types
            """Get the list of supported media types."""
            return ["audio", "video"]
    
        def get_current_config(self) -> Dict[str, Any]:  # Current configuration as dictionary
        "Get the list of supported media types."
    
    def get_current_config(self) -> Dict[str, Any]:  # Current configuration as dictionary
            """Return current configuration state."""
            return config_to_dict(self.config) if self.config else {}
    
        def get_config_schema(self) -> Dict[str, Any]:  # JSON Schema for configuration
        "Return current configuration state."
    
    def get_config_schema(self) -> Dict[str, Any]:  # JSON Schema for configuration
            """Return JSON Schema for UI generation."""
            return dataclass_to_jsonschema(SileroVADConfig)
    
        def initialize(
            self,
            config: Optional[Any] = None  # Configuration dataclass, dict, or None
        ) -> None
        "Return JSON Schema for UI generation."
    
    def initialize(
            self,
            config: Optional[Any] = None  # Configuration dataclass, dict, or None
        ) -> None
        "Initialize or re-configure the plugin (idempotent)."
    
    def execute(
            self,
            media_path: Union[str, Path],  # Path to media file to analyze
            force: bool = False,           # If True, ignore cache and re-run
            **kwargs                       # Override config parameters for this run
        ) -> MediaAnalysisResult:  # Analysis result with detected speech segments
        "Run VAD on the audio file."
    
    def is_available(self) -> bool:  # True if Silero VAD is available
            """Check if Silero VAD is available."""
            return SILERO_AVAILABLE
    
        def cleanup(self) -> None
        "Check if Silero VAD is available."
    
    def cleanup(self) -> None:
            """Clean up resources."""
            if self._model is not None
        "Clean up resources."
```
