Pull to refresh

Аутентификация и идентификация по голосу с помощью когнитивных сервисов Microsoft

Reading time 5 min
Views 9.2K

Когнитивные сервисы представляют доступ к различным облачным сервисам, которые позволяют работать с визуальной, голосовой и текстовой информацией. Кроме того, доступны различные поисковые функции Bing.

Для того, чтобы попробовать когнитивные сервисы в действии даже не обязательно иметь аккаунт Microsoft. Получить пробный ключ можно и с помощью аккаунта GitHub или LinkedIn. Пробная подписка не ограничена по времени, но ограничена по количеству используемых ресурсов за период. Ознакомиться с онлайн демонстрацией можно по адресу: Speaker Recognition API

Далее идет описание того как опробовать в действии аутентификацию пользователя с помощью голоса. Хоть сервис еще и в состоянии preview, но, несмотря на это, уже довольно интересен.
Сервис может быть использован из различных платформ, но я буду рассматривать создание C#/XAML приложения UWP.

Зайти и получить пробный ключ можно по ссылке: Microsoft Cognitive Services — Get started for free



Нажимаем + и выбираем Speaker Recognition — Preview 10,000 transactions per month, 20 per minute.

Альтернативно можно получить ключ из аккаунта Azure (ну а как же без него). Найти Cognitive Services APIs и создать аккаунт с типом Speaker Recognition API.



Этот способ подходит тем, кто не планирует останавливаться только на пробных функциях.
Найти ключ можно здесь:



Прежде чем продолжить, давайте определимся с терминологией в рамках задачи:

Verification – подтверждение того, что речь произнесена определенной персоной. Подтверждение личности говорящего.
Identification — определение кто из множества известных нам пользователей произнес фразу.
Enrollment – процесс, в течение которого сервис тренируется распознавать голос пользователя. После получения сервисом определенного количества примеров фраз, профиль пользователя становится зарегистрированным и может использоваться для распознавания.

Описание конфигурирования и процесса распознавания голоса


Создается профиль пользователя
Производится Enrollment. Несколько раз на сервис отправляются повторы одной и той же фразы.
На данный момент поддерживаются только следующие языки: en-US (English US) и zh-CN (Chinese Mandarin).

Фразу для английского языка можно выбрать из следующего списка:
«i am going to make him an offer he cannot refuse»
«houston we have had a problem»
«my voice is my passport verify me»
«apple juice tastes funny after toothpaste»
«you can get in without your password»
«you can activate security system now»
«my voice is stronger than passwords»
«my password is not your business»
«my name is unknown to you»
«be yourself everyone else is already taken»

Первая произнесенная фраза привязывается к профилю. Сменить фразу можно только сбросив Enrollment с помощью ResetEnrollmentsAsync.

Давайте представим как мог бы выглядеть набор фраз на русском. Я начну, а вы предлагайте варианты в комментариях:
«Это квартира Антона Семеновича Шпака?»
«Спокойно, Маша, я — Дубровский!»
«Я — умный, красивый, в меру упитанный мужчина, ну в полном расцвете сил»

Создание приложения UWP


Создадим приложение UWP и добавим следующий NuGet пакет Microsoft.ProjectOxford.SpeakerRecognition
Добавляем в секцию Capabilities манифеста микрофон. Интернет (клиент) должен быть добавлен по умолчанию. Конфигурирование завершено и можно перейти к коду. Список необходимых пространств имен для работы с сервисом:

   using Microsoft.ProjectOxford.SpeakerRecognition;
   using Microsoft.ProjectOxford.SpeakerRecognition.Contract;
   using Microsoft.ProjectOxford.SpeakerRecognition.Contract.Verification;

Необходимые пространства имен для работы с аудио:

   using Windows.Media.Capture;
   using Windows.Media.MediaProperties;
   using Windows.Storage.Streams;

Для работы с сервисом необходимо создать некоторые объекты. Строку с ключом подписки и клиента верификации. Клиент будет взаимодействовать с сервисом

   private SpeakerVerificationServiceClient _serviceClient;
   private string _subscriptionKey; 

После инициализации страницы необходимо инициализировать эти переменные:

   _subscriptionKey = "ec186af1f65d428137f9568ec8d896b5";
   _serviceClient = new SpeakerVerificationServiceClient(_subscriptionKey); 

Значением _subscriptionKey укажите ваш ключ подписки. Теперь по логике необходимо создать профиль пользователя:

   CreateProfileResponse response = await _serviceClient.CreateProfileAsync("en-us");

Из ответа сервиса мы можем получить идентификатор профиля:

   String _profileId=response.ProfileId;

Следующим действием по порядку должна быть «тренировка» распознавания голоса. Разберем как создать поток аудио. Самый простой способ это прочитать файл с диска:

   Windows.Storage.Pickers.FileOpenPicker picker = new Windows.Storage.Pickers.FileOpenPicker();
   picker.FileTypeFilter.Add(".wav");
   Windows.Storage.StorageFile fl = await picker.PickSingleFileAsync();
   string _selectedFile = fl.Name;
   AudioStream = await fl.OpenAsync(Windows.Storage.FileAccessMode.Read);

Фраза должна быть записана в режиме моно с частотой 16 КГц.

Второй вариант это записать голос с микрофона. Начало записи голоса:

   MediaCapture CaptureMedia = new MediaCapture();
   var captureInitSettings = new MediaCaptureInitializationSettings();
   captureInitSettings.StreamingCaptureMode = StreamingCaptureMode.Audio;
   await CaptureMedia.InitializeAsync(captureInitSettings);
   MediaEncodingProfile encodingProfile = MediaEncodingProfile.CreateWav(AudioEncodingQuality.High);
   encodingProfile.Audio.ChannelCount = 1;
   encodingProfile.Audio.SampleRate = 16000;
   IRandomAccessStream AudioStream = new InMemoryRandomAccessStream();
   CaptureMedia.RecordLimitationExceeded += MediaCaptureOnRecordLimitationExceeded;
   CaptureMedia.Failed += MediaCaptureOnFailed;
   await CaptureMedia.StartRecordToStreamAsync(encodingProfile, AudioStream);

Следующие параметры являются обязательными:

   encodingProfile.Audio.ChannelCount = 1;
   encodingProfile.Audio.SampleRate = 16000;

Остановка записи после какого-то промежутка времени:

   await CaptureMedia.StopRecordAsync();
   Stream str = AudioStream.AsStream();
   str.Seek(0, SeekOrigin.Begin);

и отправка потока сервису для enrollment-а:

   Guid _speakerId = Guid.Parse(_profileId);
   Enrollment response = await _serviceClient.EnrollAsync(str, _speakerId);

Из response мы сможем получить следующие данные:
response.Phrase – произнесенная фраза
response.RemainingEnrollments– количество оставшихся повторов фразы

Распознавание отличается от enrollment-а только тем что используется метод VerifyAsync:

   Guid _speakerId = Guid.Parse(_profileId);
   Verification response = await _serviceClient.VerifyAsync(str, _speakerId);

Исходный код получившегося приложения доступен на GitHub

Скриншот того что получилось ниже:



Как единственный способ защиты, аутентификация по голосу, пожалуй, не самый надежный вариант. Но вот в качестве одного из элементов многофакторной аутентификации вполне может использоваться.

Опять же, интересна возможность идентификации, код которой аналогичен, но с некоторыми изменениями.

Так как промежуток времени, в течение которого производится запись может быть большим, то для того, чтобы дать сервису время завершить операцию, проверка запускается в цикле. Пример операции Enrollment-а:

   _speakerId = Guid.Parse((lbProfiles.SelectedItem as ListBoxItem).Content.ToString());

  OperationLocation processPollingLocation;
  processPollingLocation = await _serviceClient.EnrollAsync(str, _speakerId);

  EnrollmentOperation enrollmentResult = null;
  int numOfRetries = 10;
  TimeSpan timeBetweenRetries = TimeSpan.FromSeconds(5.0);
  while (numOfRetries > 0)
    {
     await Task.Delay(timeBetweenRetries);
     enrollmentResult = await _serviceClient.CheckEnrollmentStatusAsync(processPollingLocation);

     if (enrollmentResult.Status == Status.Succeeded)
      {
         break;
      }
     else if (enrollmentResult.Status == Status.Failed)
     {
        txtInfo.Text = enrollmentResult.Message;
        return;
     }
        numOfRetries--;
   }

Для идентификации используется все тот же пакет NuGet.
Исходный код приложения идентификации тоже выложен на GitHub.

Официальный пример WPF проекта на GitHub, который тоже может быть полезен:
Microsoft Speaker Recognition API: Windows Client Library & Sample
Пример на Python: Microsoft Speaker Recognition API: Python Sample

На GitHub можно найти и Android SDK для Microsoft Speaker Recognition API
Tags:
Hubs:
+17
Comments 3
Comments Comments 3

Articles