diff --git a/README.md b/README.md
index 719fa25..3d7cafa 100644
--- a/README.md
+++ b/README.md
@@ -25,6 +25,34 @@ https://user-images.githubusercontent.com/36505480/144874384-95f80f6d-a4f1-42cc-
+
+
Fast start
+
+
+**Using pip**:
+`pip install silero-vad`
+
+```python3
+from silero_vad import load_silero_vad, read_audio, get_speech_timestamps
+model = load_silero_vad()
+wav = read_audio('path_to_audio_file') # backend (sox, soundfile, or ffmpeg) required!
+speech_timestamps = get_speech_timestamps(wav, model)
+```
+
+**Using torch.hub**:
+```python3
+import torch
+torch.set_num_threads(1)
+
+model, utils = torch.hub.load(repo_or_dir='snakers4/silero-vad', model='silero_vad')
+(get_speech_timestamps, _, read_audio, _, _) = utils
+
+wav = read_audio('path_to_audio_file') # backend (sox, soundfile, or ffmpeg) required!
+speech_timestamps = get_speech_timestamps(wav, model)
+```
+
+
+
Key Features
@@ -57,21 +85,7 @@ https://user-images.githubusercontent.com/36505480/144874384-95f80f6d-a4f1-42cc-
Published under permissive license (MIT) Silero VAD has zero strings attached - no telemetry, no keys, no registration, no built-in expiration, no keys or vendor lock.
-Fast start
-
-```python3
-import torch
-torch.set_num_threads(1)
-
-model, utils = torch.hub.load(repo_or_dir='snakers4/silero-vad', model='silero_vad')
-(get_speech_timestamps, _, read_audio, _, _) = utils
-
-wav = read_audio('path_to_audio_file')
-speech_timestamps = get_speech_timestamps(wav, model)
-```
-
-
Typical Use Cases
diff --git a/files/lang_dict_95.json b/files/lang_dict_95.json
deleted file mode 100644
index 623bf86..0000000
--- a/files/lang_dict_95.json
+++ /dev/null
@@ -1 +0,0 @@
-{"59": "mg, Malagasy", "76": "tk, Turkmen", "20": "lb, Luxembourgish, Letzeburgesch", "62": "or, Oriya", "30": "en, English", "26": "oc, Occitan", "69": "no, Norwegian", "77": "sr, Serbian", "90": "bs, Bosnian", "71": "el, Greek, Modern (1453\u2013)", "15": "az, Azerbaijani", "12": "lo, Lao", "85": "zh-HK, Chinese", "79": "cs, Czech", "43": "sv, Swedish", "37": "mn, Mongolian", "32": "fi, Finnish", "51": "tg, Tajik", "46": "am, Amharic", "17": "nn, Norwegian Nynorsk", "40": "ja, Japanese", "8": "it, Italian", "21": "ha, Hausa", "11": "as, Assamese", "29": "fa, Persian", "82": "bn, Bengali", "54": "mk, Macedonian", "31": "sw, Swahili", "45": "vi, Vietnamese", "41": "ur, Urdu", "74": "bo, Tibetan", "4": "hi, Hindi", "86": "mr, Marathi", "3": "fy-NL, Western Frisian", "65": "sk, Slovak", "2": "ln, Lingala", "92": "gl, Galician", "53": "sn, Shona", "87": "su, Sundanese", "35": "tt, Tatar", "93": "kn, Kannada", "6": "yo, Yoruba", "27": "ps, Pashto, Pushto", "34": "hy, Armenian", "25": "pa-IN, Punjabi, Panjabi", "23": "nl, Dutch, Flemish", "48": "th, Thai", "73": "mt, Maltese", "55": "ar, Arabic", "89": "ba, Bashkir", "78": "bg, Bulgarian", "42": "yi, Yiddish", "5": "ru, Russian", "84": "sv-SE, Swedish", "80": "tr, Turkish", "33": "sq, Albanian", "38": "kk, Kazakh", "50": "pl, Polish", "9": "hr, Croatian", "66": "ky, Kirghiz, Kyrgyz", "49": "hu, Hungarian", "10": "si, Sinhala, Sinhalese", "56": "la, Latin", "75": "de, German", "14": "ko, Korean", "22": "id, Indonesian", "47": "sl, Slovenian", "57": "be, Belarusian", "36": "ta, Tamil", "7": "da, Danish", "91": "sd, Sindhi", "28": "et, Estonian", "63": "pt, Portuguese", "60": "ne, Nepali", "94": "zh-TW, Chinese", "18": "zh-CN, Chinese", "88": "rw, Kinyarwanda", "19": "es, Spanish, Castilian", "39": "ht, Haitian, Haitian Creole", "64": "tl, Tagalog", "83": "ms, Malay", "70": "ro, Romanian, Moldavian, Moldovan", "68": "pa, Punjabi, Panjabi", "52": "uz, Uzbek", "58": "km, Central Khmer", "67": "my, Burmese", "0": "fr, French", "24": "af, Afrikaans", "16": "gu, Gujarati", "81": "so, Somali", "13": "uk, Ukrainian", "44": "ca, Catalan, Valencian", "72": "ml, Malayalam", "61": "te, Telugu", "1": "zh, Chinese"}
\ No newline at end of file
diff --git a/files/lang_group_dict_95.json b/files/lang_group_dict_95.json
deleted file mode 100644
index 1e612a0..0000000
--- a/files/lang_group_dict_95.json
+++ /dev/null
@@ -1 +0,0 @@
-{"0": ["Afrikaans", "Dutch, Flemish", "Western Frisian"], "1": ["Turkish", "Azerbaijani"], "2": ["Russian", "Slovak", "Ukrainian", "Czech", "Polish", "Belarusian"], "3": ["Bulgarian", "Macedonian", "Serbian", "Croatian", "Bosnian", "Slovenian"], "4": ["Norwegian Nynorsk", "Swedish", "Danish", "Norwegian"], "5": ["English"], "6": ["Finnish", "Estonian"], "7": ["Yiddish", "Luxembourgish, Letzeburgesch", "German"], "8": ["Spanish", "Occitan", "Portuguese", "Catalan, Valencian", "Galician", "Spanish, Castilian", "Italian"], "9": ["Maltese", "Arabic"], "10": ["Marathi"], "11": ["Hindi", "Urdu"], "12": ["Lao", "Thai"], "13": ["Malay", "Indonesian"], "14": ["Romanian, Moldavian, Moldovan"], "15": ["Tagalog"], "16": ["Tajik", "Persian"], "17": ["Kazakh", "Uzbek", "Kirghiz, Kyrgyz"], "18": ["Kinyarwanda"], "19": ["Tatar", "Bashkir"], "20": ["French"], "21": ["Chinese"], "22": ["Lingala"], "23": ["Yoruba"], "24": ["Sinhala, Sinhalese"], "25": ["Assamese"], "26": ["Korean"], "27": ["Gujarati"], "28": ["Hausa"], "29": ["Punjabi, Panjabi"], "30": ["Pashto, Pushto"], "31": ["Swahili"], "32": ["Albanian"], "33": ["Armenian"], "34": ["Mongolian"], "35": ["Tamil"], "36": ["Haitian, Haitian Creole"], "37": ["Japanese"], "38": ["Vietnamese"], "39": ["Amharic"], "40": ["Hungarian"], "41": ["Shona"], "42": ["Latin"], "43": ["Central Khmer"], "44": ["Malagasy"], "45": ["Nepali"], "46": ["Telugu"], "47": ["Oriya"], "48": ["Burmese"], "49": ["Greek, Modern (1453\u2013)"], "50": ["Malayalam"], "51": ["Tibetan"], "52": ["Turkmen"], "53": ["Somali"], "54": ["Bengali"], "55": ["Sundanese"], "56": ["Sindhi"], "57": ["Kannada"]}
\ No newline at end of file
diff --git a/hubconf.py b/hubconf.py
index b4e8885..e38b9dc 100644
--- a/hubconf.py
+++ b/hubconf.py
@@ -1,16 +1,15 @@
dependencies = ['torch', 'torchaudio']
import torch
-import json
import os
-from utils_vad import (init_jit_model,
- get_speech_timestamps,
- save_audio,
- read_audio,
- VADIterator,
- collect_chunks,
- drop_chunks,
- Validator,
- OnnxWrapper)
+import sys
+sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'src'))
+from silero_vad.utils_vad import (init_jit_model,
+ get_speech_timestamps,
+ save_audio,
+ read_audio,
+ VADIterator,
+ collect_chunks,
+ OnnxWrapper)
def versiontuple(v):
@@ -36,7 +35,7 @@ def silero_vad(onnx=False, force_onnx_cpu=False):
if versiontuple(installed_version) < versiontuple(supported_version):
raise Exception(f'Please install torch {supported_version} or greater ({installed_version} installed)')
- model_dir = os.path.join(os.path.dirname(__file__), 'files')
+ model_dir = os.path.join(os.path.dirname(__file__), 'src', 'silero_vad', 'data')
if onnx:
model = OnnxWrapper(os.path.join(model_dir, 'silero_vad.onnx'), force_onnx_cpu)
else:
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..9132ccd
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,35 @@
+[build-system]
+requires = ["hatchling"]
+build-backend = "hatchling.build"
+[project]
+name = "silero-vad"
+version = "5.1"
+authors = [
+ {name="Silero Team", email="hello@silero.ai"},
+]
+description = "Voice Activity Detector (VAD) by Silero"
+readme = "README.md"
+requires-python = ">=3.8"
+classifiers = [
+ "Development Status :: 5 - Production/Stable",
+ "License :: OSI Approved :: MIT License",
+ "Operating System :: OS Independent",
+ "Intended Audience :: Science/Research",
+ "Intended Audience :: Developers",
+ "Programming Language :: Python :: 3.8",
+ "Programming Language :: Python :: 3.9",
+ "Programming Language :: Python :: 3.10",
+ "Programming Language :: Python :: 3.11",
+ "Programming Language :: Python :: 3.12",
+ "Topic :: Scientific/Engineering :: Artificial Intelligence",
+ "Topic :: Scientific/Engineering",
+]
+dependencies = [
+ "torch>=1.12.0",
+ "torchaudio>=0.12.0",
+ "onnxruntime>=1.18.0",
+]
+
+[project.urls]
+Homepage = "https://github.com/snakers4/silero-vad"
+Issues = "https://github.com/snakers4/silero-vad/issues"
\ No newline at end of file
diff --git a/silero-vad.ipynb b/silero-vad.ipynb
index 22f528a..7a9cd19 100644
--- a/silero-vad.ipynb
+++ b/silero-vad.ipynb
@@ -43,20 +43,30 @@
},
"outputs": [],
"source": [
+ "USE_PIP = True # download model using pip package or torch.hub\n",
"USE_ONNX = False # change this to True if you want to test onnx model\n",
"if USE_ONNX:\n",
" !pip install -q onnxruntime\n",
+ "if USE_PIP:\n",
+ " !pip install -q silero-vad\n",
+ " from silero_vad import (load_silero_vad,\n",
+ " read_audio,\n",
+ " get_speech_timestamps,\n",
+ " save_audio,\n",
+ " VADIterator,\n",
+ " collect_chunks)\n",
+ " model = load_silero_vad(onnx=USE_ONNX)\n",
+ "else:\n",
+ " model, utils = torch.hub.load(repo_or_dir='snakers4/silero-vad',\n",
+ " model='silero_vad',\n",
+ " force_reload=True,\n",
+ " onnx=USE_ONNX)\n",
"\n",
- "model, utils = torch.hub.load(repo_or_dir='snakers4/silero-vad',\n",
- " model='silero_vad',\n",
- " force_reload=True,\n",
- " onnx=USE_ONNX)\n",
- "\n",
- "(get_speech_timestamps,\n",
- " save_audio,\n",
- " read_audio,\n",
- " VADIterator,\n",
- " collect_chunks) = utils"
+ " (get_speech_timestamps,\n",
+ " save_audio,\n",
+ " read_audio,\n",
+ " VADIterator,\n",
+ " collect_chunks) = utils"
]
},
{
diff --git a/src/silero_vad/__init__.py b/src/silero_vad/__init__.py
new file mode 100644
index 0000000..24bd076
--- /dev/null
+++ b/src/silero_vad/__init__.py
@@ -0,0 +1,12 @@
+from importlib.metadata import version
+try:
+ __version__ = version(__name__)
+except:
+ pass
+
+from silero_vad.model import load_silero_vad
+from silero_vad.utils_vad import (get_speech_timestamps,
+ save_audio,
+ read_audio,
+ VADIterator,
+ collect_chunks)
\ No newline at end of file
diff --git a/src/silero_vad/data/__init__.py b/src/silero_vad/data/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/files/silero_vad.jit b/src/silero_vad/data/silero_vad.jit
similarity index 95%
rename from files/silero_vad.jit
rename to src/silero_vad/data/silero_vad.jit
index 42a5ed4..63cb73b 100644
Binary files a/files/silero_vad.jit and b/src/silero_vad/data/silero_vad.jit differ
diff --git a/files/silero_vad.onnx b/src/silero_vad/data/silero_vad.onnx
similarity index 95%
rename from files/silero_vad.onnx
rename to src/silero_vad/data/silero_vad.onnx
index d0ccd9d..b3e3a90 100644
Binary files a/files/silero_vad.onnx and b/src/silero_vad/data/silero_vad.onnx differ
diff --git a/src/silero_vad/model.py b/src/silero_vad/model.py
new file mode 100644
index 0000000..165e9c6
--- /dev/null
+++ b/src/silero_vad/model.py
@@ -0,0 +1,25 @@
+from .utils_vad import init_jit_model, OnnxWrapper
+import torch
+torch.set_num_threads(1)
+
+def load_silero_vad(onnx=False):
+ model_name = 'silero_vad.onnx' if onnx else 'silero_vad.jit'
+ package_path = "silero_vad.data"
+
+ try:
+ import importlib_resources as impresources
+ model_file_path = str(impresources.files(package_path).joinpath(model_name))
+ except:
+ from importlib import resources as impresources
+ try:
+ with impresources.path(package_path, model_name) as f:
+ model_file_path = f
+ except:
+ model_file_path = str(impresources.files(package_path).joinpath(model_name))
+
+ if onnx:
+ model = OnnxWrapper(model_file_path, force_onnx_cpu=True)
+ else:
+ model = init_jit_model(model_file_path)
+
+ return model
diff --git a/utils_vad.py b/src/silero_vad/utils_vad.py
similarity index 98%
rename from utils_vad.py
rename to src/silero_vad/utils_vad.py
index 19be24c..c60371a 100644
--- a/utils_vad.py
+++ b/src/silero_vad/utils_vad.py
@@ -132,18 +132,19 @@ def __call__(self, inputs: torch.Tensor):
def read_audio(path: str,
sampling_rate: int = 16000):
+ list_backends = torchaudio.list_audio_backends()
+
+ assert len(list_backends) > 0, 'The list of available backends is empty, please install backend manually. \
+ \n Recommendations: \n \tSox (UNIX OS) \n \tSoundfile (Windows OS, UNIX OS) \n \tffmpeg (Windows OS, UNIX OS)'
- sox_backends = set(['sox', 'sox_io'])
- audio_backends = torchaudio.list_audio_backends()
-
- if len(sox_backends.intersection(audio_backends)) > 0:
+ try:
effects = [
['channels', '1'],
['rate', str(sampling_rate)]
]
wav, sr = torchaudio.sox_effects.apply_effects_file(path, effects=effects)
- else:
+ except:
wav, sr = torchaudio.load(path)
if wav.size(0) > 1: