Skip to content

Commit

Permalink
Fixed bug with losing the last incomplete frame
Browse files Browse the repository at this point in the history
  • Loading branch information
dbklim committed Dec 30, 2019
1 parent 8956425 commit 1db15fc
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 2 deletions.
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from setuptools import setup, find_packages


__version__ = 1.2
__version__ = 1.3


with open(os.path.join(os.path.abspath(os.path.dirname(__file__)), 'README.md'), encoding='utf-8') as f:
Expand Down
12 changes: 11 additions & 1 deletion webrtcvad_wrapper/webrtcvad_wrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,9 @@ def filter(self, audio, frame_duration_ms=10, sample_rate=None, padding_duration
Затем сохранённые фреймы переводятся во временные метки в исходной аудиозаписи.
В данном режиме аргументы threshold_rms и threshold_zcr игнорируются.
ВНИМАНИЕ! Если длина аудиозаписи не кратна размеру 1 фрейма - она будет дополнена нулями до необходимой длины (справедливо только при
sensitivity_mode=0..3).
Если sensitivity_mode=4:\n
Метод агрессивный, часто игнорирует вообще всё, кроме гласных и звонких согласных звуков в речи (или просто громких звуков). Фильтрация работает так:
на основе RMS (root-mean-square, отражает мощность звуковой волны) и ZCR (zero-crossing rate, частоты пересечения нуля) по заданным порогам
Expand All @@ -88,6 +91,8 @@ def filter(self, audio, frame_duration_ms=10, sample_rate=None, padding_duration
sensitivity_mode можно задать через метод set_mode().
ВНИМАНИЕ! Поддерживаются только моно аудиозаписи с шириной семпла 2 байта.
1. audio - объект pydub.AudioSegment с аудиозаписью или байтовая строка с аудиоданными (без заголовков wav)
2. frame_duration_ms - длина фрейма в миллисекундах (поддерживается только 10, 20 и 30 мс)
3. sample_rate - частота дискретизации (поддерживается только 8, 16, 32 или 48кГц):
Expand Down Expand Up @@ -312,6 +317,9 @@ def __filter_frames(self, frames, padding_duration_ms=50, threshold_voice_frames

def __get_frames(self, audio, frame_duration_ms=10, sample_rate=None):
''' Получить фреймы из аудиозаписи.
ВНИМАНИЕ! Если длина аудиозаписи не кратна размеру 1 фрейма - она будет дополнена нулями до необходимой длины.
1. audio - объект pydub.AudioSegment с аудиозаписью или байтовая строка с аудиоданными (без заголовков wav)
2. frame_duration_ms - длина фрейма в миллисекундах (поддерживается только 10, 20 и 30 мс)
3. sample_rate - частота дискретизации (поддерживается только 8, 16, 32 или 48кГц):
Expand Down Expand Up @@ -346,10 +354,12 @@ def __get_frames(self, audio, frame_duration_ms=10, sample_rate=None):
timestamp = 0.0
duration = (float(frame_width) / sample_rate) / 2.0
frames = []
while offset + frame_width < len(audio_bytes):
while offset + frame_width <= len(audio_bytes):
frames.append(Frame(audio_bytes[offset:offset + frame_width], timestamp, duration))
timestamp += duration
offset += frame_width
if len(audio_bytes) % frame_width != 0 and offset + frame_width > len(audio_bytes):
frames.append(Frame(audio_bytes[offset:]+b'\x00'*(offset+frame_width-len(audio_bytes)), timestamp, duration))
return frames


Expand Down

0 comments on commit 1db15fc

Please sign in to comment.