Привет, Хабр! Меня зовут Елизавета Петрова я Data Scientist и являюсь участником профессионального сообщества NTA. В современном мире технологии синтеза речи и клонирования голоса стремительно развиваются и уже достигли впечатляющих результатов. С 2015 года проводится специальное соревнование ASV Spoofing, на котором ежегодно презентуют новые методы проведения спуфинг-атак (атаки, когда один человек или программа маскируется под другую путем фальсификации данных) с помощью видео-дипфейков и синтеза речи. Существующие речевые системы способны синтезировать речь и тембр голоса, на слух неотличимые от настоящих. Технологии клонирования голоса привлекают всё большее внимание и находят широкое применение в таких сферах, как голосовое управление, робототехника, голосовые ассистенты (например, Siri и Алиса) и т.д. Однако вместе с этим открываются новые возможности для мошенничества. Особенно уязвимы системы, использующие голосовую биометрию для идентификации пользователей: используя синтез речи, мошенники могут получить доступ к аккаунтам и данным пользователей.
Для борьбы с неэтичным использованием голосовых технологий необходимо разработать инструменты распознавания искусственной речи. Нужно, чтобы разработанная модель обладала хорошей обобщающей способностью и умела детектировать синтезированную речь независимо от языка, акцента и тембра голоса конкретного человека.
В публикации рассмотрю несколько новейших разработок в этой области, а потом синтезирую запись искусственной речи и на этом примере проверю работу одной из представленных моделей.
Так же, как и задачу синтеза речи, задачу распознавания искусственной речи можно решать с помощью глубокого обучения.
Команда из итальянского университета в своей публикации от 28.09.2022 предлагает[1] воспринимать задачу распознавания клонированного голоса как задачу speaker verification. Speaker verification — это задача распознавания спикера: модель должна проверить, принадлежит ли голос определенному человеку или же это чей-то другой голос. Если модель предсказала, что голос действительно принадлежит одному из спикеров, на записях речи которых училась нейросеть, тогда это настоящая речь, иначе – искусственная. Для сравнения использовались нейросети с различной архитектурой, такие как ResNet, TDNN и LSTM. Недостаток данной модели в том, что она умеет распознавать только тех спикеров, голоса которых «видела» при обучении, но обработать новые голоса модель не сможет.
Исследователи из лаборатории в Китае в августе 2022 года выяснили[2], что, наблюдая за поведением нейронов в слоях нейросети, можно сделать вывод, является речь настоящей или искусственной. С этой целью в нейросети для каждого слоя выбирается числовая граница, определяющая, активирован нейрон или нет. В каждом слое подсчитывается ACN (average count neuron) — среднее количество активированных нейронов.
На графике ниже для сравнения показаны признаки реальной и синтезированной речи, полученные с помощью алгоритма выделения MFCC (мел-кепстральных частотных коэффициентов), неактивированных нейронов и ACN. Видно, что после активации нейроны могут чётко разделить настоящую и синтезированную речь.
Другая команда китайских ученых 02.08.2022 представила[3] следующий метод: отличить реальную речь от синтезированной можно, проанализировав распределение основного тона сигнала, а также вещественные и мнимые спектрограммы.
На следующем графике распределение основного тона для настоящей речи изображено сверху, для синтезированной — снизу. Видно, что распределение искусственной речи относительно гладкое, в то время как распределение настоящей речи имеет ярко выраженные пики.
Авторы работы предложили использовать частотную полосу от 0 до 400 Гц для классификации (потому что, как видно из графиков выше, почти весь сигнал распределён на этой полосе), а также вещественную и мнимую спектрограммы сигнала, которые передаются на вход нейросети для классификации.
Однако применять глубокое обучение и сложные архитектуры нейросетей необязательно: есть и другие, более простые подходы распознавания искусственной речи.
Исследователи из лаборатории в США в 2019 году разработали[4] свой подход к задаче, не использующий глубокие нейросети. Генеративные модели оставляют артефакты в синтезированной записи клонированного голоса. Используя методы спектрального анализа и статистические тесты, можно обнаружить эти артефакты.
Ниже на графике представлены спектрограмма настоящей (сверху) и клонированной (снизу) речи. Жёлтым выделены артефакты: вертикальные полосы. Можно заметить, что спектрограмма реальной речи более гладкая вдоль оси Х и не содержит чётко выраженных вертикальных полос.
Ещё один интересный подход был представлен в 2022 году[5] исследователями из Италии: они показали, что для определения искусственной речи достаточно проанализировать битрейт сигнала (битрейт – количество бит, используемых для передачи данных в единицу времени).
Ниже на графиках по оси х отложен битрейт, по оси у – количество высказываний. Реальная речь отмечена синим, сгенерированная (для 12 различных техник спуфинга) — красным. Видно, что распределения битрейта отличаются для настоящей и синтезированной речи.
Проиллюстрирую работу моделей детектирования искусственной речи на примере.
Запись с искусственной речью можно сгенерировать самим, либо использовать готовый материал. Для тестирования я взяла отрывок искусственной речи на русском языке из видео, однако можно использовать речь на любом языке, так как это не повлияет на предсказание модели.
Как можно сгенерировать речь самому, покажу ниже на примере нейросети Tortoise TTS:
! git clone https://github.com/jnordberg/tortoise-tts.git
% cd tortoise-tts
! pip3 install -r requirements.txt
! python3 setup.py install
# Импорт модели
import torch
import torchaudio
import IPython
from tortoise.api import TextToSpeech
from tortoise.utils.audio import load_audio, load_voice, load_voices
# Инициализация модели
tts = TextToSpeech()
# Текст который будет произносить модель
text = "Joining two modalities results in a surprising increase in generalization"
# Выберем один из представленных голосов
%ls tortoise/voices
voice = 'train_dotrice'
preset = 'fast'
# Загрузим голос и сгенерируем речь
voice_samples, conditioning_latents = load_voice(voice)
gen = tts.tts_with_preset(text, voice_samples=voice_samples, conditioning_latents=conditioning_latents,
preset=preset)
torchaudio.save('generated_speech.wav', gen.squeeze(0).cpu(), 24000)
Получили запись синтезированной речи generated_speech.wav.
На слух обе записи звучат одинаково правдоподобно. Проверю, есть ли в записях неразличимые человеческим ухом артефакты, которые может заметить нейросеть.
Попробую проверить модель [4], как единственное open source решение из рассмотренных.
! git clone https://github.com/UNICT-Fake-Audio/fake-audio-detector.git
%cd /content/fake-audio-detector
! pip install -r requirements.txt
! pip install dill
! python3 main.py "/content/generated_speech.wav"
Результат работы для настоящей речи: ‘The sample audio is real’, для искусственной (как сгенерированной с помощью Tortoise, так и взятой из видео) — ‘The sample audio is fake’. Модель работает достаточно быстро, обработка одного файла занимает около 2-3 секунд.
Следовательно, даже достаточно простые модели, анализирующие битрейт сигнала, способны отличить настоящую речь от синтезированной.
Можно с уверенностью сказать, что специалистов Data Scienice и ML инженеров с каждым годом ждут всё новые и новые вызовы по борьбе с неэтичным использованием современных технологий. Однако по мере того, как развиваются технологии клонирования голоса, появляются и новые способы распознать искусственную речь.
Приложение: аудиофайлы и код для демонстрации
По ссылке расположены аудиофайлы, которые использовались для тестирования работы модели и демо-ноутбук с кодом на Google Colab. Можно скачать и протестировать представленные записи речи, либо попробовать сгенерировать свои с помощью ноутбука с Tortoise. Также в колаб-ноутбуке добавлена инструкция, как поменять формат аудиофайла, чтобы модель детекции фейковой речи могла принимать его на вход.