Skip to main content

inaVAMOS: Voice And Music Open Segmenter

Speech (voice activity) and music detection for audio and video files, based on self-supervised (SSL) models from INA.

inaVAMOS splits an audio stream into homogeneous segments labelled speech, music, speech+music or other. It wraps two models published on the HuggingFace Hub:

Detector Model Task
speech ina-foss/ssl-vad-music2vec Voice activity detection (VAD)
music ina-foss/ssl-music-detection-music2vec Music detection

Both models use the CNN and the first transformer layer of the music2vec SSL encoder, followed by an MLP classifier and Viterbi smoothing. They share the same encoder, which is computed only once when both detectors are used.

Output labels

The two detectors make independent decisions every 20 ms, which are combined into a single timeline:

speech music label
yes no speech
no yes music
yes yes speech+music
no no other

other covers everything that is neither speech nor music: silence, background noise, applause, sound effects... When a single detector is run, other means "not detected" by that detector: with -d speech, it is non-speech and can include music; with -d music, it is non-music and can include speech.

The segments of each detector are also available separately (see Python usage, and the json and textgrid output formats).

Installation

pip install inaVAMOS

The development version can be installed with pip install git+https://github.com/ina-foss/inaVAMOS.git.

ffmpeg is recommended to read any audio or video format (apt install ffmpeg, brew install ffmpeg or conda install ffmpeg). Without it, files are read with librosa (wav, flac, ogg, mp3…).

To use a GPU, install the PyTorch build matching your CUDA version before installing inaVAMOS.

The models (about 80 MB) are downloaded from the HuggingFace Hub on first use and cached. Afterwards, HF_HUB_OFFLINE=1 can be set to work offline.

Command line usage

# Print the segmentation of a file as CSV
ina-vamos -i media.mp3

# Process several files and write one result per file in a directory
ina-vamos -i *.mp4 -o results/ -f textgrid

# Voice activity detection only, on a GPU, on the first 10 minutes
ina-vamos -i media.wav -d speech --device cuda --stop 600

Output example (CSV):

label,start,stop
music,0.000,23.900
other,23.900,32.060
...
speech,63.380,65.300
other,65.300,65.980
speech,65.980,68.200

Main options (see ina-vamos --help):

Option Description
-i input files, in any format readable by ffmpeg
-o output directory (default: standard output). Existing results are skipped unless --overwrite is given, so interrupted batches can be resumed
-f output format: csv, tsv, json, textgrid (Praat) or audacity (label track)
-d detectors to run: speech and/or music (default: both)
--device cpu, cuda, cuda:1… (default: GPU if available)
--start, --stop process only a portion of the files (seconds)

python -m inavamos is equivalent to ina-vamos.

Python usage

from inavamos import Segmenter

seg = Segmenter()  # or Segmenter(detectors=["speech"]), Segmenter(device="cuda")...

# Combined timeline: a list of (label, start, stop) tuples covering the whole file
for label, start, stop in seg("media.mp3"):
    print(label, start, stop)

Segmenter.process returns a Result object with more detailed outputs:

result = seg.process("media.mp3", start=60, stop=120)

result.segments("speech")    # [Segment(label='speech', start=63.38, stop=65.3), ...]
result.segments("music")     # segments where music is detected
result.timeline()            # combined timeline, as returned by seg("media.mp3")
result.probabilities["music"]  # frame-level probabilities (numpy array, one frame every 20 ms)
result.decisions["music"]      # frame-level boolean decisions after Viterbi smoothing
result.frame_duration          # 0.02

Signals can also be given directly, as 1-D numpy arrays or torch tensors:

import librosa

audio, sr = librosa.load("media.wav", sr=16000)
result = seg.process(audio, sampling_rate=sr)

Results can be exported with inavamos.export.export(result, "textgrid").

Options

Argument Default Description
detectors ("speech", "music") detectors to run
device GPU if available torch device
window_duration 30.0 audio is processed by overlapping windows of this duration (seconds), matching the slices used to train the models. None processes a signal at once, like the code published on the model cards; memory then grows quadratically with the duration
context_duration 2.5 overlap on each side of the windows (seconds)
batch_size 8 number of windows processed together
transitions {"speech": 0.99, "music": 0.95} Viterbi self-transition probabilities. Higher values produce fewer, longer segments
token None HuggingFace token, only needed for private repositories
revision None model revision on the Hub (branch, tag or commit), to pin a version
repo_ids None alternative model repositories or local directories, e.g. {"speech": "/models/ssl-vad-music2vec"}

Performance

About 30× faster than real time on a laptop CPU (an hour of audio in about 2 minutes), and much faster on a GPU.

Development

pip install -e ".[test]"
pytest                    # all tests (downloads the models on first run)
pytest -m "not models"    # unit tests only, without the models

The models tests check, among others, that the output is identical to the reference code published on the model cards.

To release a new version: update __version__ in src/inavamos/__init__.py, then publish a GitHub release tagged v<version> (e.g. v0.2.0). The publish workflow runs the tests, builds the package and uploads it to PyPI.

License and citation

inaVAMOS and the models it uses are distributed under the Pantagruel Research-only License (French version, which prevails, and unofficial English translation). It restricts their use to non-commercial research and development activities, by research organisations and heritage institutions (libraries, museums, archives, audiovisual heritage). For any other use, contact the Pantagruel Consortium at pantagruel-licence@univ-grenoble-alpes.fr.

If you use this tool or the models, please cite:

@inproceedings{pelloin2026lrec,
  author    = "Pelloin, Valentin and Bekkali, Lina and Dehak, Reda and Doukhan, David",
  year      = "2026",
  title     = "Data Selection Effects on Self-Supervised Learning of Audio Representations for French Audiovisual Broadcasts",
  booktitle = "Fifteenth International Conference on Language Resources and Evaluation (LREC 2026)",
  address   = "Palma, Mallorca, Spain",
  publisher = "European Language Resources Association",
}

Release files for inaVAMOS 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for inaVAMOS 0.1.0
File Size Uploaded
inavamos-0.1.0.tar.gz 24.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for inaVAMOS 0.1.0
File Interpreter ABI Platform
inavamos-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 49.8 kB

Release files / inavamos-0.1.0.tar.gz

Download URL inavamos-0.1.0.tar.gz
Size 24.8 kB
Tags Source
SHA-256 checksum
How to use checksums
98deb8c066747d0916790f011ba29dbd5719e5b654b797ae163f8ad2762e40cd
BLAKE2b-256 checksum
How to use checksums
cd140169c0cc238c1be7a6593fa457fa7243b17c5d41ef41c9bc286c964c9e8d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 24, 2026.

Transparency log

Release files / inavamos-0.1.0-py3-none-any.whl

Download URL inavamos-0.1.0-py3-none-any.whl
Size 25.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
b96c6ea538c4d37f87bd6599db885690f932a8f42094de5e1dcab71a84387f29
BLAKE2b-256 checksum
How to use checksums
256087d2245e1a04954b55e1c0a19e8545cdd8f3f4326ee39ef2c1959765578b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 24, 2026.

Transparency log

Release history Release notifications | RSS feed

0.1.1

2 release files

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page