-
Notifications
You must be signed in to change notification settings - Fork 34
Home
Разработанная открытая библиотека PyAra может быть использована при создании следующих информационных систем:
- Системы голосовой аутентификации (call-центры, программное обеспечение банкоматов, системы «умный дом»).
- Системы проверки аудиопотока для выявления злонамеренных попыток компрометации выступающего (публичного должностного лица).
- Системы расследования инцидентов, связанных с обманом (фродом) физических лиц мошенниками с использованием звонков по телефону или через популярные мессенджеры.
- Системы предотвращения мошенничества в мессенджерах и социальных сетях, содержащих функции голосового общения.
- Индивидуальные помощники (т.н. умные колонки), воспринимающие голосовые команды (покупки, оплата счетов, банковские переводы).
Подобная система может либо стать частью подсистемы, либо самостоятельной обособленной системой защиты от спуфинг-атак посредством синтеза голоса. Высокая точность определения системой синтезированной аудиозаписи дает возможность сделать ее первичным «фильтром», через который будут проходить все аудиозаписи. Это сильно облегчит дальнейшую обработку пропущенных через фильтр аудиозаписей.
Для успешной установки библиотеки PyAra необходимо выполнить следующую команду:
pip install Pyara
Библиотека PyAra имеет следующие зависимости, которые будут установлены вместе с библиотекой, либо должны быть установлены заранее:
torch >= 1.13.1
torchaudio >= 0.13.1
soundfile == 0.12.1
numpy
librosa
Минимальные технические требования для работы библиотеки PyAra:
- Операционная система: Linux, Windows, MacOS.
- Версия Python > 3.7.
- Для запуска функций библиотеки необходимо как минимум 100 Мбайт оперативной памяти.
В библиотеку PyAra входит предварительно обученная модель, которая может быть использована по умолчанию. Данная модель обучена на русскоязычном датасете, который был разработан специально для этой библиотеки. С моделью по умолчанию PyAra умеет детектировать синтезированные русскоязычные аудиозаписи. Также имеется возможность обучать и встраивать собственные модели, обученные даже на других языках, или улучшать уже имеющуюся модель.
Представленная модель достигает точности более 95%
на собранном датасете. Эта модель показывает очень высокие результаты в детектировании поддельной речи и может быть встроена в различные системы.
Время работы библиотеки, особенно ее основной функции - детектирования синтезированной речи, довольно небольшое. На обычном пользовательском компьютере проверка одной аудиозаписи на подлинность занимает около 50 мс. Это время почти незаметно для обычного пользователя, что означает, что данная библиотека за небольшие временные затраты может существенно помочь с проверкой входных аудиозаписей.
Функция predict_audio
предназначена для предсказания типа аудио (подлинное или синтезированное) с использованием заданной модели.
-
file_path
: путь до аудиофайла, тип которого мы хотим предсказать при помощи нейронной сети. -
print_probability
: флаг, указывающий, нужно ли выводить вероятность предсказания (по умолчанию установлен вFalse
). -
pitch_shift
: значение смещения тональности аудио (по умолчанию равно0
). -
sample_rate
: частота дискретизации аудиосигнала. -
width
: ширина окна, используемая при обработке аудиосигнала.
Возвращает предсказание аудио в виде целого числа: 0
, если аудио подлинное, 1
, если аудио синтезированное.
- Загружает модель для предсказания (вызывает функцию
model_eval
). - Подготавливает аудиосигнал с помощью функции
prepare_signal
, учитывая параметры, такие как смещение тональности, ширина окна и частота дискретизации. - Передает подготовленный сигнал в модель для получения предсказания и вероятности.
- Возвращает предсказание аудио в виде целого числа:
0
, если аудио подлинное,1
, если аудио синтезированное. - Если установлен флаг
print_probability
, возвращает строку с ответом и вероятностью предсказания. - Если флаг
print_probability
не установлен, возвращает только предсказание аудио.
from pyara import predict_audio
predict_audio('C:/Tests/mp3.mp3')
Функция cut_if_necessary
предназначена для обрезки аудиосигнала до заданной ширины (количества выборок) в случае, если исходный сигнал имеет большую длину.
-
signal
(torch.Tensor
): Аудиосигнал. -
width
(int
): Ширина сигнала после обрезки. По умолчаниюCFG.width = 400
.
torch.Tensor
: Обрезанный аудиосигнал.
- Проверяет длину аудиосигнала (по оси времени, представленной третьим измерением тензора).
- Если длина аудиосигнала превышает заданную ширину (
width
), то происходит обрезка, удаляя лишние выборки. - Возвращает обрезанный аудиосигнал.
from pyara import cut_if_necessary
cut_if_necessary('C:/Tests/mp3.mp3')
Функция right_pad_if_necessary
выполняет дополнение последнего измерения входного сигнала вправо, если необходимо.
-
signal
(torch.Tensor
): Тензор сигнала, представляющий многомерные данные. Должен быть трехмерным тензором с размерностью[batch_size, num_channels, signal_length]
. -
width
(int
): Желаемая ширина сигнала после дополнения (по умолчанию берется изCFG
).
torch.Tensor
: Дополненный сигнал с выполненным дополнением последнего измерения вправо.
from pyara import right_pad_if_necessary
right_pad_if_necessary('C:/Tests/mp3.mp3')
Функция prepare_signal
предназначена для подготовки аудиосигнала для дальнейшей обработки с использованием нейронной сети.
-
voice_path
: Путь к аудиофайлу. -
pitch_shift
: Значение смещения тональности аудио (по умолчанию равно0
). -
width
: Ширина сигнала после обрезки. -
sample_rate
: Частота дискретизации аудиосигнала.
signal
: подготовленный сигнал для обработки.
- Загрузка аудиофайла с помощью функции
torchaudio.load(voice_path)
. Возвращает сигналsignal
и частоту дискретизацииsample_rate
. - Усреднение сигнала
signal
по первому измерению (каналам) с использованием функцииsignal.mean(dim=0)
. - Добавление размерности пакета (batch) к сигналу
signal
с помощью функцииsignal.unsqueeze(dim=0)
. - Если задано смещение тональности (
pitch_shift
), применение эффекта сдвига тона с использованием функцииlibrosa.effects.pitch_shift
. - Применение преобразования MFCC (Mel-frequency cepstral coefficients) к сигналу
signal
с помощью функцииMFCC_spectrogram
. - Обрезка и дополнение спектрограммы, если необходимо, с использованием функций
cut_if_necessary
иright_pad_if_necessary
. - Повторение спектрограммы
signal
3 раза по первому измерению (пакету) с использованием функцииsignal.repeat(3, 1, 1)
. - Добавление размерности пакета (batch) к спектрограмме
signal
с помощью функцииsignal.unsqueeze(dim=0)
. - Перемещение спектрограммы
signal
на устройство (например, GPU), указанное вCFG.device
, с использованием функцииsignal.to(CFG.device)
. - Возврат подготовленного сигнала
signal
.
from pyara import prepare_signal
prepare_signal('C:/Tests/mp3.mp3')
Функция prepare_signals
предназначена для подготовки нескольких аудиосигналов для дальнейшей обработки с использованием нейронной сети.
-
voice_path
: Путь к аудиофайлу. -
pitch_shift
: Значение смещения тональности аудио (по умолчанию равно0
). -
width
: Ширина сигнала после обрезки. -
sample_rate
: Частота дискретизации аудиосигнала.
signal
: Подготовленный сигнал для обработки.
Для каждого пути к аудиофайлу из списка voice_paths
выполняются следующие шаги:
- Загрузка аудиофайла с помощью функции
torchaudio.load(voice_path)
. Возвращает сигналsignal
и частоту дискретизацииsample_rate
. - Усреднение сигнала
signal
по первому измерению (каналам) с использованием функцииsignal.mean(dim=0)
. - Добавление размерности пакета (batch) к сигналу
signal
с помощью функцииsignal.unsqueeze(dim=0)
. - Если задано смещение тональности (
pitch_shift
), применение эффекта сдвига тона с использованием функцииlibrosa.effects.pitch_shift
. - Применение преобразования MFCC (Mel-frequency cepstral coefficients) к сигналу
signal
с помощью функцииMFCC_spectrogram
. - Обрезка и дополнение спектрограммы, если необходимо, с использованием функций
cut_if_necessary
иright_pad_if_necessary
. - Повторение спектрограммы
signal
3 раза по первому измерению (пакету) с использованием функцииsignal.repeat(3, 1, 1)
. - Добавление размерности пакета (batch) к спектрограмме
signal
с помощью функцииsignal.unsqueeze(dim=0)
. - Перемещение спектрограммы
signal
на устройство (например, GPU), указанное вCFG.device
, с использованием функцииsignal.to(CFG.device)
. - Возврат подготовленного сигнала
signal
и добавление его в списокres
.
from pyara import prepare_signals
prepare_signals(['C:/Tests/mp3.mp3', 'C:/Tests/mp23.mp3'])
Функция prediction
выполняет предсказание с использованием заданной модели для входного сигнала.
-
model
: Модель, которая будет использоваться для предсказания. Должна быть совместима с PyTorch и иметь методforward
для выполнения прямого прохода. -
signal
: Входной сигнал, для которого будет выполнено предсказание. Должен быть трехмерным тензором с размерностью[batch_size, num_channels, signal_length]
. -
print_probability
: Флаг, указывающий, нужно ли выводить вероятность предсказания (по умолчанию установлен вFalse
).
Возвращает кортеж, содержащий предсказанную метку класса (0
или 1
) и вероятность предсказания. Если print_probability
установлен в True
, также возвращает строку с ответом и вероятностью предсказания.
- Переносит модель на устройство, указанное в
CFG.device
. - Сжимает измерение сигнала с использованием
signal.squeeze()
. - Выполняет прямой проход модели с входным сигналом, получая выходной тензор
output
. - Применяет функцию
torch.nn.Softmax
для получения вероятностного распределения по классам. - Возвращает метку класса и вероятность предсказания для класса
0
(реальный голос) и класса1
(синтезированный голос). - Если
print_probability
установлен вTrue
, также выводит информацию о вероятности предсказания.
from pyara import prediction
model = model_eval()
signal = prepare_signal(file_path, pitch_shift, width, sample_rate)
prediction(model, signal)
Функция prediction_multiple
выполняет предсказание для нескольких входных сигналов с использованием заданной модели.
-
model
: Модель, которая будет использоваться для предсказания. Должна быть совместима с PyTorch и иметь методforward
для выполнения прямого прохода. -
signals
: Список входных сигналов, для которых будет выполнено предсказание. Каждый сигнал должен быть трехмерным тензором с размерностью[batch_size, num_channels, signal_length]
.
Возвращает список, содержащий предсказанные метки классов для входных сигналов.
Каждая метка класса представлена значением 1
, если модель предсказывает синтезированный голос, и 0
, если модель предсказывает реальный голос.
Также возвращает список вероятностей предсказания для каждого сигнала.
- Переносит модель на устройство, указанное в
CFG.device
. - Для каждого входного сигнала из списка
signals
выполняет следующие шаги:- Сжимает измерение сигнала с использованием
signal.squeeze()
. - Выполняет прямой проход модели с входным сигналом, получая выходной тензор
output
. - Применяет функцию
torch.nn.Softmax
для получения вероятностного распределения по классам. - Определяет предсказанный класс с использованием
output.argmax(dim=-1).cpu().numpy()
. - Добавляет предсказанный класс и вероятность предсказания в соответствующие списки.
- Сжимает измерение сигнала с использованием
from pyara import prediction
model = model_eval()
signals = prepare_signals([file_path1, file_path2], pitch_shift, width, sample_rate)
prediction_multiple(model, signals)
from pyara.Model import model_eval
from torchsummary import summary
model = model_eval()
summary(model, input_size = (3,80,100))
Пример вывода информации о модели показан на Рисунке 1 – Информация о параметрах модели:
Команда from torchsummary import summary
в Python используется для импорта функции summary
из библиотеки torchsummary
. Эта функция предоставляет удобный способ для получения краткого описания моделей в PyTorch. Вот основные моменты, которые она охватывает:
-
Функция
summary
позволяет быстро просмотреть все слои в модели PyTorch. Она отображает последовательность слоёв и их типы, что особенно полезно для проверки и отладки архитектуры модели. -
summary
предоставляет информацию о количестве обучаемых и необучаемых параметров в каждом слое и во всей модели. Это помогает понять, насколько сложной или тяжелой является модель. -
Для каждого слоя отображаются размеры выходных данных. Это полезно для понимания, как изменяются размеры данных при прохождении через модель, и помогает выявлять потенциальные ошибки в размерах данных.
-
Функция оценивает объем памяти, который будет занимать каждый слой при выполнении прямого прохода. Это важно для оптимизации моделей, особенно при работе с ограниченными ресурсами, например, на мобильных устройствах или в веб-приложениях.
Чтобы использовать summary
, необходимо сначала импортировать её, а затем вызвать, передав экземпляр модели и размеры входных данных, например: summary(your_model, input_size=(channels, height, width))
. Это даст полное представление о модели, включая слои, параметры и расход памяти.
Для проверки работы функций библиотеки вы можете скачать аудио с нашего репозитория по ссылке: https://github.com/efanov/pyara/tree/main/tests/test_audio Здесь вы можете скачать аудио сигналы:
-
Alg_1_0.wav
- синтезированное аудио -
real_0.wav
- настоящая речь
Далее у вас есть возможность подать данное аудио на вход функциям библиотеки.
Предположим, что ваш скачанный файл лежит на пути file_path
. Тогда вы можете воспользоваться функцией predict_audio()
следующим образом:
Установка библиотеки:
pip install Pyara
Импорт нужной нам функции:
from pyara import predict_audio
Подача аудио на вход функции:
predict_audio('file_path/Alg_1_0.wav')
Функция вернет результат, показывающий, что аудиосигнал является синтезированным.
Пример вывода показан на Рисунке №2 - Вывод функции predict_audio
при подаче синтезированной речи:
Проделаем те же действия с аудиосигналом real_0.wav
.
Результат показан на Рисунке №3 - Вывод функции predict_audio
при подаче реальной речи:
Если вы хотите самостоятельно обрезать аудио сигнал перед подачей его на вход модели, то вы можете воспользоваться функцией cut_if_necessary()
.
Пример использования данной функции показан ниже:
import torchaudio
import torch
MFCC_spectrogram = torchaudio.transforms.MFCC(
sample_rate=16000,
n_mfcc=80,
melkwargs={
"n_fft": 1024,
"n_mels": 80,
"hop_length": 256,
"mel_scale": "htk",
'win_length': 1024,
'window_fn': torch.hann_window,
'center': False
},
)
from pyara import cut_if_necessary
signal = signal.mean(dim=0)
signal = signal.unsqueeze(dim=0)
signal, sample_rate = torchaudio.load('Alg_1_0.wav')
signal = MFCC_spectrogram(signal)
signal = cut_if_necessary(signal, 300)
На данном примере аудио сигнал real_0.wav
загружается с помощью функции torchaudio.load
, далее приводится к нормальному виду и преобразуется в MFCC спектрограмму. Данная спектрограмма подается на вход функции cut_if_necessary
, где обрезается до размера 300
сэмплов.
Результат работы функции показан на Рисунке 4 - Результат работы функции cut_if_necessary
:
Если вы хотите самостоятельно увеличить размер аудио сигнала перед подачей его на вход модели, то вы можете воспользоваться функцией right_pad_if_necessary()
Пример использования данной функции показан ниже:
import torchaudio
import torch
MFCC_spectrogram = torchaudio.transforms.MFCC(
sample_rate=16000,
n_mfcc=80,
melkwargs={
"n_fft": 1024,
"n_mels": 80,
"hop_length": 256,
"mel_scale": "htk",
'win_length': 1024,
'window_fn': torch.hann_window,
'center': False
},
)
from pyara import right_pad_if_necessary
signal, sample_rate = torchaudio.load('C:/Users/79671/Downloads/real_0.wav')
signal = signal.mean(dim=0)
signal = signal.unsqueeze(dim=0)
signal = MFCC_spectrogram(signal)
signal = right_pad_if_necessary(signal, 300)
signal.shape
На данном примере аудио сигнал real_0.wav
загружается с помощью функции torchaudio.load
, далее приводится к нормальному виду и преобразуется в MFCC спектрограмму. Данная спектрограмма подается на вход функции right_pad_if_necessary
, где расширяется как минимум до размера 300
сэмплов.
Результат работы функции показан на Рисунке 5 - Результат работы функции right_pad_if_necessary
:
Рисунок 5 – Результат работы функции right_pad_if_necessary
В процессе работы с библиотекой PyAra могут быть выданы следующие внутренние сообщения, представленные на Рисунке 6 - Внутренние сообщения:
Эти сообщения подтверждают правильность работы модели и отсутствия ошибок. Сообщение Model Evaluated
показывает, что модель загружена верно и готова к обработке аудиосигнала. Сообщение Audio Signal prepared!
показывает, что аудиосигнал успешно подготовлен специальными функциями. В противном случае библиотека выдаст ошибку.
Пример правильной работы функции для реального голоса представлен на Рисунке 7 – Пример обработки реального голоса:
В данном примере ответ 0
означает, что это реальный голос с вероятностью 100% (данный пример из обучающего набора данных).
Пример работы функции для синтезированного голоса представлен на Рисунке 8 - Пример обработки синтезированного голоса:
Сообщения об ошибках показываются пользователю в виде ошибок Python, рассмотрим самые частые из них и обычные причины:
- Ошибка
LibsndfileError
– обычно возникает при неправильно указанном пути к файлу. - Ошибка
LibsndfileError : Format not recognized
– обычно возникает при неправильном формате входного аудиофайла. Библиотека работает с форматами mp3, wav, flac, aiff, ogg и протестирована на них. С остальными форматами могут возникать ошибки. - Ошибка
FileNotFoundError
– обычно возникает при неправильном пути к файлу с весами модели. Чтобы поставить модель с собственными весами, необходимо заменить файл модели в функцииmodel_eval()
:weights_path = os.path.join(module_path, 'Model_weights.bin')
.