Я это делал без библиотеки. Для этого можно использовать
энергию сигнала в окошке, и если энергия превышает определенный порог, то значит в окошке есть голос. В телефонном аудиофайле часто присутствует шум, поэтому есть смысл сначала "выровнять" сигнал в окошке - т.е. отнять среднее от каждого элемента.
Примерно так:
window = signal[i:(i+win_len)]
energy = ((window - window.mean()) ** 2).sum()
voice = energy > threshold
Алгоритм - автомат с двумя состояниями "тишина" и "голос":
- Заводим очередь с макс. вместимостью t
- Начинаем с состояния "тишина"
- Проверяем, есть ли голос в окошке
- Если есть, то создаем новый файл, берем все данные из очереди, добавляем в файл, переходим в состояние "голос"
- Нет - добавляем данные из окошка в очередь
- В состоянии "голос" записываем текущее окошко в файл, пока не встретим t подряд идущих окошек с тишиной - в этом случае сохраняем файл и переходим в "тишину" опять
Можно переходить в режим "голос" только после того, как встретилось несколько подряд идущих окошек с голосом, чтобы не выдергивать из записи всякие щелчки и прочие артефакты.
В моем случае t = 10 и ширина окошка 512 давали самые лучшие результаты, но в вашем случае результат может отличаться. Уровень тишины, который я использовал, я точно не помню. Можно просто взять тишину и посмотреть, какая у нее энергия и сравнить с энергией голоса, и взять среднее значение между ними.