Разное

Распознавание аудио: Распознавание речи онлайн

09.01.1990

Содержание

Распознавание речи | Документация SmartMarket

Вы можете внедрить распознавание речи в свои приложения с помощью API сервиса SmartSpeech.

Ответ выдается только после обработки всей аудиозаписи. Максимальный размер аудио – 2 Мб, максимальная длина – одна минута. Для многоканального аудио распознается только первый канал.

Используется, если требуется распознавание речи в процессе ее записи: протоколы телефонии, запись аудио на мобильных устройствах и прочее. Возможно отображение промежуточных результатов и автоматическое определение конца фразы. Максимальный размер аудио – 1 Гб. Для многоканального аудио распознается только первый канал.

Подходит для распознавания многоканальных аудиозаписей. При работе стоит учитывать, что процесс асинхронного распознавания может быть дольше синхронного, поэтому этот тип подходит для случаев, когда длительность распознавания не важна. Максимальный размер аудио – 1 Гб.

Для распознавания доступны аудиофайлы со следующими кодировками:

  • PCM_S16LE

    • PCM signed 16bit little-endian, с заголовком WAV или без.
    • Частота дискретизации – от 8 до 96 кГц. Если без заголовка, то параметр sample_rate – обязательный.
    • Максимальное количество каналов – 8.
    • Значение Content-Type – audio/x-pcm;bit=16;rate=XXX.
  • OPUS

    • Opus в контейнере ogg.
    • Параметр sample_rate – необязательный.
    • Поддерживается только одноканальный звук.
    • Значение Content-Type – audio/ogg;codecs=opus
      .
  • MP3

    • MP3 (кроме MPEG2.5).
    • Параметр sample_rate – необязательный.
    • Максимальное количество каналов – 2.
    • Значение Content-Type – audio/mpeg.
  • FLAC

    • FLAC
    • Параметр sample_rate – необязательный.
    • Максимальное количество каналов – 8.
    • Значение Content-Type – audio/flac.
  • ALAW

    • G.711 A-law, с заголовком WAV или без.
    • Частота дискретизации – от 8 до 96 кГц. Если без заголовка, то параметр
      sample_rate
      – обязательный.
    • Максимальное количество каналов – 8.
    • Значение Content-Type – audio/pcma;rate=XXX.
  • MULAW

    • G.711 μ-law, с заголовком WAV или без.
    • Частота дискретизации – от 8 до 96 кГц. Если без заголовка, то параметр sample_rate – обязательный.
    • Максимальное количество каналов – 8.
    • Значение Content-Type – audio/pcmu;rate=XXX.

Чтобы повысить точность распознавания, укажите языковую модель, которую должен использовать сервис. Модель должна соответствовать частоте дискретизации.

Поддерживаемые модели:

  • general – общая модель, для звука 16 кГц и больше. Рекомендуем начать с нее.
  • media – модель, которая обучена понимать фамилии актеров, артистов, названия музыкальных групп, треков, фильмов – все, что связано с медиа-контентом. Частота – 16 кГц и больше.
  • callcenter – модель, предназначенная для телефонии. Частота – меньше 16 кГц.

Для полноценной работы с распознаванием речи необходимо клиентское приложение. При его разработке используйте описание API для распознавания речи. Клиентское приложение общается с сервисом SmartSpeech. Например, для потокового распознавания (gRPC) процесс в зависимости от настроек выглядит следующим образом:

  1. Приложение отправляет gRPC-запрос к методу Recognize сервиса SmartSpeech. В сообщениях рекомендуется отправлять следующие опции распознавания:

    • В заголовке — информация для аутентификации.
    • В первом сообщении — сообщение RecognitionOptions с описанием параметров распознавания. – В последующих сообщениях — чанки звука для распознавания.
  2. Аудиопоток передается в сообщениях RecognitionRequest.audio_chunk.
  3. В ответ приходят сообщения RecognitionResponse, содержащие нормализованный и ненормализованный текст в полях Hypothesis.normalized_text и Hypothesis.text.

Примеры клиентских приложений вы можете найти на нашей странице на GitHub.

Общие рекомендации

  • Выбирайте языковую модель, которая подходит для вашего аудио. Например, для распознавания телефонных разговоров используйте callcenter, а general лучше всего распознает запросы к виртуальному ассистенту.
  • Убедитесь, что в запросе верно указана кодировка аудиофайла.
  • Если при асинхронном распознавании пришел пустой ответ, проверьте, что вы корректно загрузили файл для распознавания. Если вы загружаете файл с компьютера, добавьте в запрос @:
  • Если вы получили ошибку 8 ResourceExhausted при распознавании через gRPC или 429 Too Many Requests при распознавании через HTTP, значит вы превысили лимит запросов. Напишите нам на [email protected] для увеличения лимита.
  • Если вы получили много ошибок в результатах распознавания, пожалуйста, напишите нам на [email protected]. Приложите к письму аудиофайл, результаты распознавания, текст запроса и request-id. Также укажите в письме тип ошибок:

    • Удаления — многие слова не распознаны.
    • Замены — многие слова распознаны неверно.
    • Вставки — в результатах распознавания много лишних слов, которых не было в аудио.

Хинты

Распознавание речи можно сильно улучшить использованием хинтов.

Хинты — это одноразовые подсказки для сервиса распознавания речи, помогающие правильно понять речь пользователя в определенный момент времени. Например, когда приложение ожидает от пользователя конкретный ответ, этот ответ заранее придет в сервис в виде хинтов.

Подсказка работает только для следующего ответа пользователя. После использования хинтов процесс распознавания речи пользователя возвращается к ее обработке без подсказок.

Подробнее об использовании хинтов вы можете прочитать в статье Хинты.

Добавить хинты вы можете при потоковом и асинхронном распознавании.

SpeechRecognition — Интерфейсы веб API

Experimental: Это экспериментальная технология
Так как спецификация этой технологии ещё не стабилизировалась, смотрите таблицу совместимости по поводу использования в различных браузерах. Также заметьте, что синтаксис и поведение экспериментальной технологии может измениться в будущих версиях браузеров, вслед за изменениями спецификации.

Интерфейс Распознавание голоса Web Speech API является интерфейсом контроллера для сервиса распознавания; который так же перехватывает событие SpeechRecognitionEvent (en-US), отправленное сервисом распознавания.

SpeechRecognition наследует свойства от своего родительского интерфейса, EventTarget.

SpeechRecognition.grammars (en-US)
Возвращает и устанавливает коллекцию объектов SpeechGrammar  грамматики которые будут понятны текущему 
SpeechRecognition
.
SpeechRecognition.lang (en-US)
Задаёт и возвращает язык текущего SpeechRecognition. Если данное свойство не указано по умолчанию, то используется из HTML кода значение атрибута lang , или настройки языка агента текущего пользователя.
SpeechRecognition.continuous (en-US)
Проверяет возвращается ли непрерывные результаты или вернулся только один. По умолчанию для одиночного значение (false.)
SpeechRecognition.interimResults (en-US)
Контроллирует, следует ли возвращать промежуточные результаты (true) или нет (false
.) Промежуточные результаты это результаты которые ещё не завершены ( например SpeechRecognitionResult.isFinal (en-US) свойство ложно.)
SpeechRecognition.maxAlternatives (en-US)
Устанавливает максимальное количество предоставленных результатов SpeechRecognitionAlternative (en-US). По умолчанию значение 1.
SpeechRecognition.serviceURI (en-US)
Определяет местоположение службы распознавания речи, используемой текущим SpeechRecognition, для обработки фактического распознавания. По умолчанию используется речевая служба агента пользователя.

Обработчики событий

SpeechRecognition.onaudiostart (en-US)
Вызывается когда пользовательский агент начал захват аудио.
SpeechRecognition.onaudioend (en-US)
Вызывается когда пользовательский агент закончил захват аудио.
SpeechRecognition.onend (en-US)
Вызывается когда служба распознавания речи отключилась.
SpeechRecognition.onerror (en-US)
Вызывается когда произошла ошибка распознавания речи.
SpeechRecognition.onnomatch (en-US)
Вызывается, когда служба распознавания речи возвращает окончательный результат без существенного распознавания. Это может включать определённую степень признания  confidence (en-US) которая не соответствует пороговому значению или превышает его.
SpeechRecognition.onresult (en-US)
Вызывается когда возвращает результат — слово или фраза были распознаны положительно, и это было передано обратно в приложение.
SpeechRecognition.onsoundstart (en-US)
Вызывается при обнаружении любого звука — не важно, распознана речь или нет.
SpeechRecognition.onsoundend (en-US)
Вызывается когда  любой звук — распознаваемая речь или нет — перестала распознаваться.
SpeechRecognition.onspeechstart (en-US)
Вызывается, когда обнаружен звук, распознаваемый службой распознавания речи как речевой сигнал.
SpeechRecognition.onspeechend (en-US)
Вызывается, когда прекращается обнаружение речи, распознанной службой распознавания речи.
SpeechRecognition.onstart (en-US)
Вызывается, когда служба распознавания речи начинает обрабатывать входящий звук с намерением распознать грамматики, связанные с текущим распознаванием речи.

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

SpeechRecognition.abort() (en-US)
Останавливает обработку входящего аудио службой распознавания речи и не пытается вернуть SpeechRecognitionResult (en-US).
SpeechRecognition.start() (en-US)
Запускает службу распознавания речи, прослушивая входящее аудио с целью распознавания грамматик, связанных с текущим распознаванием речи.
SpeechRecognition.stop() (en-US)
Останавливает обработку входящего аудио службой распознавания речи и пытается вернуть SpeechRecognitionResult (en-US) Используя уже записанный звук.

В нашем простом примере Speech color changer , мы создаём новый объект экземпляра SpeechRecognition используя этот конструктор SpeechRecognition() (en-US) , создание нового  SpeechGrammarList (en-US), И установить его в качестве грамматики, которая будет распознаваться экземпляром распознавание речи с использованием свойства SpeechRecognition.grammars (en-US).

После определения некоторых других значений мы затем устанавливаем их так, чтобы служба распознавания началась когда произошло событие по клику ( SpeechRecognition.start() (en-US).) Когда результат был успешно распознан, the SpeechRecognition.onresult (en-US) обработчик извлекаем цвет, который был произнесён из события, а затем меняем цвет фона на данный цвет <html>.

var grammar = '#JSGF V1.0; grammar colors; public <color> = aqua | azure | beige | bisque | black | blue | brown | chocolate | coral | crimson | cyan | fuchsia | ghostwhite | gold | goldenrod | gray | green | indigo | ivory | khaki | lavender | lime | linen | magenta | maroon | moccasin | navy | olive | orange | orchid | peru | pink | plum | purple | red | salmon | sienna | silver | snow | tan | teal | thistle | tomato | turquoise | violet | white | yellow ;'
var recognition = new SpeechRecognition();
var speechRecognitionList = new SpeechGrammarList();
speechRecognitionList.addFromString(grammar, 1);
recognition.grammars = speechRecognitionList;

recognition.lang = 'en-US';
recognition.interimResults = false;
recognition.maxAlternatives = 1;

var diagnostic = document.querySelector('.output');
var bg = document.querySelector('html');

document.body.onclick = function() {
  recognition.start();
  console.log('Ready to receive a color command.');
}

recognition.onresult = function(event) {
  var color = event.results[0][0].transcript;
  diagnostic.textContent = 'Result received: ' + color;
  bg.style.backgroundColor = color;
}

Таблица совместимостей

FeatureChromeFirefox (Gecko)Internet ExplorerOperaSafari (WebKit)
Базовая поддержкаCompatChrome(33)}}property_prefix(«webkit»)[1]Не совместима[2]Не совместимаНе совместимаНе совместима
постояннаяCompatChrome(33) [1]Не совместимаНе совместимаНе совместимаНе совместима
FeatureAndroidChromeFirefox Mobile (Gecko)Firefox OSIE PhoneOpera MobileSafari Mobile
Basic supportНеизвестноНеизвестная совместимая версия [1]Совместим с GeckoMobile(44)2.5Не совместимаНе совместимаНе совместима
continuousНеизвестноНеизвестная совместимая версия[1]Совместимость неизвестнаНе совместимаНе совместимаНе совместимаНе совместима
  • [1] Интерфейсы распознавания речи в настоящее время префиксные в Chrome, поэтому вам нужно указать имена интерфейсов, например, префикс. WebkitSpeechRecognition; вы также должны будете обслуживать свой код через веб-сервер для распознавания работы
  • [2] Может быть активирована через media.webspeech.recognition.enable флаг в about:config на телефоне. Не реализовано вообще на рабочем столе Firefox — см.баг 1248897.

Firefox OS разрешения

Чтобы использовать распознавание речи в приложении, вам необходимо указать следующие разрешения в своём manifest:

"permissions": {
  "audio-capture" : {
    "description" : "Audio capture"
  },
  "speech-recognition" : {
    "description" : "Speech recognition"
  }
}

Вам также нужно привилегированное приложение, поэтому вам необходимо также включить его:

Распознавание речи в телефонных звонках

Вам было удобно, что каждый разговор с клиентом фиксируется и в любой момент можно прослушать запись, чтобы уточнить какие-то моменты?

Мы сделали еще удобнее!

Теперь мы добавили к нашей телефонии функцию распознавания речи. Вы можете не прослушивать записи, а просто задать текстовый фрагмент для поиска – и Битрикс24 найдет этот текст в диалоге. Ведь аудио-запись преобразовывается в текст диалога, то есть не просто распознается, а разделяется по ролям «Оператор» – «Клиент».


Как это работает?

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

Затем в настройках номера во вкладке Запись и оценка отметьте пункт Расшифровывать запись звонка и выберите язык для расшифровки. Сервис распознаёт речь на 80 языках мира.

Теперь при каждом входящем или исходящем звонке в Детализация звонков появится не только пиктограмма прослушивания и скачивания аудио-файла в формате mp3, но и символ распознанного текста.

Примечание: для распознавания понадобится время, в зависимости от объема записи это может занять от 20 до 80 сек.

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

И вы сможете найти этот диалог по любому фрагменту. К примеру, вы запомнили, что разговаривали с клиентом о диване «Прием», но с кем и когда – не помните. Задайте поисковую строку – и получайте результат!

Стоимость распознавания можно узнать на странице тарифов Voximpant в разделе Features > Speech Recognition. По умолчанию используется распознавание голоса в текст от компании Google.
Списывается автоматически с вашего баланса телефонии.
Распознавание включается сразу для всех разговоров, поэтому выбрать только одну запись для распознавания нельзя.

Они нас слышат: куда развиваются речевые технологии?

Миллионы лет назад, когда речь только появилась у наших предков, для них это была «суперсила», которая помогала объединиться и скоординировать действия. Сегодня по мере объединения физического и цифрового мира, человек хочет использовать голос для взаимодействия и управления компьютерами, смартфонами и другими «поумневшими» устройствами.

Каждая стиральная машинка, чайник оснащены сенсорным экраном. Но зачем  нажимать на кнопки, когда можно использовать собственный голос? В минуту мы можем напечатать до 40 слов, а произнести до 150. Меняются скорости взаимодействия с автоматизированной техникой. И бизнес включился в эту смену парадигмы –  управление голосом скоро станет обязательным его условием.

Сектор речевых технологий признан одним из самых динамично развивающихся в мирe. Согласно отчету MarketsandMarkets, мировой рынок речевых технологий вырастет с 3,7 млрд долларов сегодня до 12 млрд к 2022 году. Основной драйвер роста  — спрос на аутентификацию с помощью голоса в финансовых учреждениях, предприятиях здравоохранения и правительственных организациях. Вырастет доля использования речевых технологий и в телекоме, колл-центрах и В2С секторе. Самое широкое применение голосовые технологии   пока получили в Азии: например, в Японии уже все колл-центры автоматизированы.

Реклама на Forbes

Предыстория

Технологии распознавания речи существуют еще с середины 60-х годов минувшего века. Однако лишь несколько лет назад машинное преобразование речи в текст и аудиоответы пользователям были полноценно поставлены на коммерческий поток. Рывок в развитии речевых технологий произошел за счет того, что стоимость вычислительных ресурсов за последние несколько лет  сильно упала, стало экономически выгодно создавать большие нейронные сети и обрабатывать с их помощью массивы данных для решения различных задач.  По оценкам Techcrunch, прорыв в голосовых технологиях за последние 18 месяцев гораздо значительнее, чем за прошлые 15 лет. Теперь мы смело можем говорить  о существовании рынка автоматической обработки речи. На нем развиваются и B2C-технологии виртуальных ассистентов, и B2B-решения распознавания речи.

Невидимый друг

К 2020 году мы все будем иметь невидимого друга. Не важно, каким будет его имя — Siri, Amazon Echo или OK Google — но мы входим в мир, где персональный ассистент реализует наши желания и отвечает на поставленные вопросы. Этот «Паспарту» будет учиться на своих ошибках, понимать контекст и будет все больше интегрирован в нашу жизнь. Согласно исследованию Google еще в 2014 году, 31% подростков используют голосовой поиск для выполнения домашнего задания, 23% взрослых «ищут голосом» во время приготовления пищи.

Большим шагом вперед для рынка «умных голосовых помощников» стал выпуск два года назад умной колонки со встроенным голосовым помощником Amazon Echo. Amazon Echo, небольшая колонка,  —  устройство голосового управления, подключенное к «облаку». Гаджет способен воспринимать голосовые команды, голосом давать на них ответы, будить вас, управлять вашим календарем в Google, взаимодействовать с умными системами домашнего освещения,  воспроизводить музыку и многое другое.  На сегодняшний день стоимость Amazon Echo уже снизилась до $200.

Разработка таких устройств от Amazon, как Amazon Echo или ее облегченные версии Amazon Tap ($129.99) и Echo Dot ($89.99) были профинансированы специально созданным $100 миллионным фондом Alexa (также называется и сама голосовая платформа от Amazon). Он инвестирует только в проекты, создающие инновационные технологии в области голосового управления, умного дома и носимых аксессуаров. Amazon планирует расширить сферу действия фонда на робототехнику, здравоохранение и другие отрасли.

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

Беспилотные автомобили

Технология распознавания речи сегодня используется и в автомобильной промышленности. Самое примитивное — уже привычные нам навигаторы. Технологии сегодняшнего дня  – это голосовое управление различными функциями автомобиля, и это доступно не только в автомобилях класса люкс. Большие успехи делает Ford, оснащая свои машины возможностями для голосового управления навигационной или мультимедийной системами.  Технологии скорого будущего — беспилотные автомобили, которыми можно управлять, задавая маршрут как с помощью компьютера, так и голосом.  Автономные автомобили Google, электромобиль Tesla, автомобили-роботы MIG (Made in Germany), AKTIV, VisLab, автомобиль из Брауншвейга, получивший имя Leonie — все они предполагают использование искусственного интеллекта и голосового управления. О начале разработки беспилотного грузовика сообщил Яндекс и Камаз. Первая модель увидит свет уже в 2018 году и будет оборудована искусственным интеллектом от Яндекс.

Речевые технологии на заводах

В начале 2016 года резидент «Сколково» компания  «ЦРТ-инновации» презентовала технологию автоматического распознавания речевых команд, запрограммированную на работу с промышленными роботами. В основе технологии лежат акустические модели, создаваемые с помощью глубоких нейронных сетей (Deep neural networks, DNN), что делает программу более точной и надежной. Новая разработка позволяет включать и выключать станок, изменять режим работы вентиляции в помещении, управлять техникой на стройке. Технология выделяет речь на фоне сильного производственного шума, адаптируется к конкретным людям на производстве, подстраиваясь под их речевые особенности  и многое другое. По прогнозам создателей, программа позволит увеличить производительность труда рабочих, одновременно снизив травматизм на предприятиях.

Речевые технологии в банковском секторе

В феврале этого года банк HSBC в Великобритании предложил 15 миллионам своих клиентов голосовую идентификацию для доступа к онлайн-сервисам банка. И технология опознает клиента, даже если он простыл или охрип, анализируя до 100 параметров определения голоса: паттерны в произношении, модуляцию, звуки, которые отражают объем и форму глотки, носовую полость, голосового тракта. В 2013 году Barclays предложил подобную функцию для 300 тысяч самых состоятельных клиентов, которые были в полном восторге, ведь время идентификации снизилось с 1,5 минуты до 10 секунд.

Помимо скорости и удобства для клиента, которому теперь не нужно запоминать кодовое слово и другие пароли, переход на биометрическую аутентификацию повышает безопасность банковского аккаунта. В России технологию идентификации клиентов по биометрическим данным планирует  вводить  к 2018 году Сбербанк.

Речевые технологии в телекоме и маркетинге

Реклама на Forbes

Свои исследования и разработки в области систем распознавания речи ведет Яндекс. Сегодня система распознавания речи Yandex SpeechKit нашла свое применение сразу в двух секторах экономики — телекоме и маркетинге. Мегафон выбрал Yandex.SpeechKit для виртуального консультанта «Елена 2.0». Его главная задача заключается в том, чтобы облегчить нагрузку на колл-центры оператора. На данный момент «Елена 2.0» помогает абонентам «МегаФона» проверить биллинг, сообщает о подключенных тарифах и услугах, может подключить или отключить услугу или перевести деньги с одного номера на другой. Конечно, сейчас виртуальная барышня не сможет полностью заменить сотрудника колл-центра, но по мере машинного обучения, «Елена 2.0» сможет отвечать на сотни миллионов звонков в год.

Будущее

Новые разработки есть и в сфере безопасности. AmberBox — американский стартап, участник  Y Combinator S16, автор одноименного гаджета с автоматическим определением звука разряда оружия. Разработка детектора была вызвана волной вспышек насилия и расстрелов в США. В детекторе AmerBox используется комбинированный алгоритм звукового реагирования и инфракрасного обнаружения, благодаря которому устройство способно точно отделить звук выстрела от других шумов — и в случае его обнаружения подать сигнал охране, предупредить находящихся поблизости людей и инициировать программу эвакуации.  Это позволяет сократить время реагирования полиции вплоть до 63% и, как следствие, сохранить жизни людей.

Еще один горячий стартап, который поддерживают на своих конференциях Google и Apple — компания AVA — разработчик мобильного приложения из Сан-Франциско, которое позволяет людям видеть то, что говорят вокруг них меньше, чем за секунду. Программа предназначена для слабослышащих и глухих людей. Голосовые технологии вообще значительно помогут людям с ограниченными возможностями во взаимодействии с окружающим миром, компьютерами и умными устройствами. Например, одним из первых было приложение SayShopping для iPhone, которое позволяло слепым или слабовидящим людям покупать товары с онлайн-гипермаркета только через голос.

Практически у всех стартапов амбициозные цели. Так например, компания ObEN, основанная в 2014 году в  Калифорнии, называет своей миссией собрать самый большой в мире банк речевых паттернов и голосов и стать ресурсом для развития  робототехники, игровой индустрии, развлечений, образования, здравоохранения и музыки.

Реклама на Forbes

Но даже если не думать обо всех зарождающихся в пригородах Сан-Франциско стартапах, а просто посмотреть вокруг, сидя в своем кабинете или квартире, мы поймем, что каждый элемент интерьера, офисной и бытовой техники будет скоро понимать наш голос и выполнять соответствующие указания. А это огромный рынок для каждого производителя.

Иногда я думаю, в чем связь между ростом популярности фильмов о супер-героях и все новыми гаджетами? Каждый новый умный девайс, словно новый навык, новая способность. И, получив новую сверхспособность, мы уже никогда не захотим отказаться от нее. ОК, Google, когда там премьера  «Доктор Стрейнджлав»?  

Распознавание речи в текст в Москве — YouDo

В условиях технологического прогресса многие компании проводят различные тренинги и публичные выступления, используя при этом записывающие устройства. Наиболее удобным устройством записи разговоров, конференций или семинаров является диктофон. Однако материал, записанный с помощью диктофона, со временем необходимо конвертировать. Распознавание голоса в текст называется транскрибацией. Известно, что первое устройство, способное производить распознавание речи в текст, было разработано еще в 1952 году и могло расшифровывать произнесенные цифры. Сейчас же разработано множество подобных программ, способных распознавать разную речь на многих языках.

Где можно заказать услуги по распознаванию текста?

На сегодняшний день конвертировать речь в текст можно с помощью:

  • различных программ в режиме он-лайн, а также устанавливаемых на компьютер или на телефон;
  • специализированных компаний, занимающихся распознаванием голоса;
  • фрилансеров, предлагающих свои услуги на различных серверах.

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

Специальные компании, обычно, предоставляют лучших специалистов, способных перевести голос в текст. Однако стоимость таких услуг часто оказывается гораздо выше ожидаемой.

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

От чего зависит стоимость транскрибации?

Цена такой услуги, как расшифровка речи в текст, зависит от нескольких факторов:

  • объем голосового материала, который необходимо перевести в текст;
  • качество и громкость сделанной записи, наличие или отсутствие явных помех;
  • время, на протяжении которого фрилансеру необходимо перевести речь в текст.

Где найти опытных фрилансеров?

На сегодняшний день транскрибация записей производится удаленно исполнителями, услуги которых вы можете найти и заказать на сайте YouDo. Для этого достаточно пройти простую процедуру регистрации, разместить заявку «конвертация речи в текст», указать стоимость работы с учетом стандартной цены за подобные виды услуг, ожидать откликнувшихся специалистов, а затем нанять наиболее опытного из них.

Расшифровка речи исполнителями сервиса YouDo производится профессионально и  качественно с учетом всех требований заказчика. Важным преимуществом сервиса является возможность установить собственные расценки, а затем удаленно найти фрилансера для конвертации записанной речи в текстовый формат.

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

что это такое, как работает технология, где применяется

04 июня 2021 Время прочтения статьи: 5 минут

4460

Голосовой поиск в Google или голосовое управление в машине уже никого не удивляют — мы привыкли к этим технологиям. Они экономят время и делают жизнь комфортнее. Но технология распознавания речи включает гораздо больше возможностей: оптимизацию бизнес-процессов, анализ маркетинговых кампаний и повышение продаж. Как работает распознавание речи и как применить его в бизнесе — читайте в статье.

Что такое распознавание речи

Это технология, с помощью которой речь человека возможно трансформировать в текст. Система распознавания речи может работать автономно, а может обучаться особенностям произношения конкретного пользователя. 

Распознавание голоса — часть технологии распознавания речи. Идентификацию говорящего используют при биометрической проверке, для ограничения доступа к личным файлам. Система запоминает голос человека и отличает его от других голосов.

Технология распознавания речи или Speech-to-Text появилась еще в конце прошлого столетия, но качественно преобразовывать человеческую речь в текст программы научились только в 2000-х — по мере развития IT-технологий и машинного обучения на Западе, а потом и в России. Сегодня системы распознавания речи массово используют в повседневной жизни и в бизнесе, ведь это здорово экономит ресурсы.

Как работает технология

Это сложный многоступенчатый алгоритм, поэтому постараемся описать общий принцип действия. Если сказать голосовому поиску «Александр Пушкин», то телефон услышит не имя известного писателя, а звуковой сигнал без четких границ. Система восстанавливает по этому непрерывному сигналу воспроизведенную человеком фразу следующим образом:

  • Сначала устройство записывает голосовой запрос, а нейросеть анализирует поток речи. Волна звука делится на фрагменты — фонемы.

  • Затем нейросеть обращается к своим шаблонам и сопоставляет фонемы с буквой, слогом или словом. Далее образуется порядок из известных программе слов, а неизвестные слова она вставляет по контексту. В результате объединения информации с этих двух этапов получается речь, превращенная в текст.

На заре развития процесс работы Speech-to-Text заключался в элементарной акустической модели — речь человека сопоставлялась с шаблонами. Но количества словарей в системе было недостаточно для точного распознавания, программа часто ошибалась. 

Благодаря обучаемости нейронных сетей качество распознавания речи значительно выросло. Алгоритм знает типичную последовательность слов в живой речи и может воспринимать структуру языка — так работает языковая модель. А каждая новая обработанная голосовая информация влияет на качество обработки следующей, уменьшая количество погрешностей.

Где применяют алгоритм

Технология распознавания речи позволяет нам искать нужную информацию, составлять маршрут по навигатору. Вот еще несколько сфер, где применение Speech-to-Text сделало жизнь проще:

  • Телефония. Технология экономит не только время звонящего, но и ресурсы компании. С помощью голосового набора и робота клиенты могут без участия менеджеров заказывать товары, отвечать на опросы и получать консультации.

  • Бытовая техника. Сегодня можно управлять голосом различными устройствами: выключателями в доме, системами освещения и гаджетами.

  • Медицина. В 2020 году российские разработчики создали Voice2Med — систему на основе искусственного интеллекта, которая заполняет медицинские документы, пока врач диктует информацию во время осмотра.

Как распознавание речи используется в бизнесе

Распознавание речи позволяет автоматизировать многие процессы в бизнесе,  от продаж и контроля клиентского сервиса, до защиты от мошенников. 

Благодаря этой технологии аналитика телефонных разговоров с клиентами стала проще и дешевле: система автоматически записывает звонки и собирает данные для повышения конверсии.

Например, система речевой аналитики MANGO OFFICE помогает узнать, с какими конкурентами клиенты чаще всего сравнивают ваш продукт. Вы создаете теги для упоминаний о конкурентах, анализируете отчеты разговоров и понимаете, как нужно улучшить маркетинговую стратегию. Также можно анализировать работу сотрудников — отмечайте стоп-слова, следите за соблюдением скриптов продаж.

Еще одно направление, где речевая аналитика помогает развитию бизнеса — интерактивные голосовые системы (IVR). Это незаменимый инструмент в управлении колл-центром. Speech-to-Text распознает речь клиента, а голосовой робот автоматически подбирает нужную информацию для ответа или переводит звонок на  оператора. Технология уменьшает количество потерянных звонков, так как многие люди не успевают или не могут нажимать на кнопки в голосовом меню.

Службам контроля сервиса не обязательно проводить дополнительные опросы: это можно сделать автоматически, а потом проанализировать отчеты. Службы безопасности в банках используют речевую аналитику, чтобы защитить личные данные клиентов. 

Заключение

Технология преобразования голоса в текст упрощает повседневные задачи и помогает развивать многие профессиональные сферы. В бизнесе Speech-to-Text используют для эффективного взаимодействия с клиентами и быстрой обработки большого объема данных. Аналитика телефонных звонков и голосовые роботы уменьшают затраты, повышают средний чек и изучают реальные потребности клиентов.

«Одноклассники» запустили сервис распознавания аудиосообщений

Интернет Веб-сервисы | Поделиться

В социальной сети «Одноклассники» появилась функция перевода аудиосообщений в текст. Сервис распознавания аудио автоматически конвертирует голосовое сообщение в текст, позволяя без прослушивания понять, о чем говорит собеседник. Сервис работает на базе искусственного интеллекта и реализован на основе технологии, разработанной «Вконтакте». Запуск стал очередным важным шагом в интеграции «Одноклассников» и экосистемы VK.

Новый сервис сделает общение в «Одноклассниках» более комфортным в ситуациях, когда прослушать голосовое сообщение невозможно: в общественном транспорте, во время совещания с коллегами или во время просмотра фильма. Технология распознает как полученные, так и отправленные голосовые сообщения на русском языке длительностью до 60 минут. Благодаря этому текст аудиосообщений индексируется поиском по сообщениям, что позволяет легко найти в чате любую информацию, даже отправленную голосом. При ответе на распознанное голосовое сообщение в чате будет отображаться текст исходного сообщения, а не аудио, что поможет ориентироваться в переписке с собеседником. Для распознанных сообщений в списке чатов также отображается текст, а не значок аудиосообщения.

Конвертация голосовых сообщений в текст в «Одноклассниках» полностью автоматизирована: пользователь сразу получает расшифровку без дополнительных действий. «Одноклассники» также добавили возможность скопировать текст распознанного аудиосообщения. Функцию можно использовать для работы с текстами, которые наговорит собеседник, или конвертации собственных голосовых заметок в текст для дальнейшей работы с ним.

Технология распознавания речи «Вконтакте» основана на трех нейросетях: одна отвечает за распознавание, вторая находит подходящие слова, а третья расставляет знаки препинания и заглавные буквы. Для обучения нейросетей используются аудио, которые специально для этой задачи записывают участники программы VK Testers, и база субтитров из фильмов. На конвертацию аудио в текст уходит всего около секунды. Нейросеть распознает русскоязычную речь, при этом в расшифровке учитываются разговорные слова, заимствованная лексика, а также сложные условия записи – например, низкое качество звука или нечеткая речь собеседника.

Распознавание аудиосообщений автоматически включено у всех пользователей последних версий мобильных приложениях «Одноклассников» на Android и iOS, а также в десктопной версии соцсети. Отключить новую функцию можно в настройках профиля, в разделе «Сообщения».

Распознавание ключевых слов  | Ядро TensorFlow

В этом руководстве показано, как выполнить предварительную обработку аудиофайлов в формате WAV, а также построить и обучить базовую модель автоматического распознавания речи (ASR) для распознавания десяти разных слов. Вы будете использовать часть набора данных Speech Commands (Warden, 2018), который содержит короткие (не более одной секунды) звуковые фрагменты команд, такие как «вниз», «идти», «влево», «нет», « вправо», «стоп», «вверх» и «да».

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

Настройка

Импортировать необходимые модули и зависимости. Обратите внимание, что в этом уроке вы будете использовать Seaborn для визуализации.

  импорт ОС
импортировать pathlib

импортировать matplotlib.pyplot как plt
импортировать numpy как np
импортировать Seaborn как sns
импортировать тензорный поток как tf

из слоев импорта tensorflow.keras
из моделей импорта tensorflow.keras
из отображения импорта IPython

# Установите начальное значение для воспроизводимости эксперимента.семя = 42
tf.random.set_seed (начальное число)
np.random.seed (семя)
  

Импорт мини-набора данных речевых команд

Чтобы сэкономить время при загрузке данных, вы будете работать с уменьшенной версией набора данных Speech Commands. Исходный набор данных состоит из более чем 105 000 аудиофайлов в формате аудиофайлов WAV (Waveform), в которых люди произносят 35 разных слов. Эти данные были собраны Google и опубликованы под лицензией CC BY.

Загрузите и распакуйте mini_speech_commands.zip , содержащий меньшие наборы данных Speech Commands с tf.keras.utils.get_file :

  DATASET_PATH = 'данные/мини_речевые_команды'

data_dir = pathlib.Path(DATASET_PATH)
если нет data_dir.exists():
  tf.keras.utils.get_file(
      'mini_speech_commands.zip',
      origin="http://storage.googleapis.com/download.tensorflow.org/data/mini_speech_commands.zip",
      экстракт = правда,
      cache_dir='.', cache_subdir='данные')
  
Загрузка данных из http://storage.googleapis.com/download.tensorflow.org/data/mini_speech_commands.zip
182083584/182082353 [=============================] - 6s 0us/шаг
1820
/182082353 [=============================] - 6 с 0 мкс/шаг

Аудиожисты набора данных хранятся в восьми папках, соответствующих каждому речью команду: , , , , , , , , , , , справа и Стоп :

  команд = np.массив (tf.io.gfile.listdir (str (data_dir)))
команды = команды[команды != 'README.md']
print('Команды:', команды)
  
Команды&двоеточие; ['да' 'идти' 'налево' 'направо' 'вверх' 'вниз' 'стоп' 'нет']
 

Извлеките аудиоклипы в список с именем имен файлов и перетасуйте его:

  имен файлов = tf.io.gfile.glob(str(data_dir) + '/*/*')
имена файлов = tf.random.shuffle(имена файлов)
num_samples = длина (имена файлов)
print('Всего примеров:', num_samples)
print('Количество примеров на этикетку:',
      лен (тф.io.gfile.listdir(str(data_dir/commands[0]))))
print('Пример файлового тензора:', имена файлов[0])
  
Общее количество примеров: 8000
Количество примеров на ярлык: 1000
Пример файла tensor: tf.Tensor(b'data/mini_speech_commands/up/05739450_nohash_2.wav', shape=(), dtype=string)
 

Разделить имен файлов на обучающие, проверочные и тестовые наборы с использованием соотношения 80:10:10 соответственно:

  train_files = имена файлов[:6400]
val_files = имена файлов[6400: 6400 + 800]
test_files = имена файлов[-800:]

print('Размер тренировочного набора', len(train_files))
print('Размер проверочного набора', len(val_files))
print('Размер тестового набора', len(test_files))
  
Размер тренировочного набора 6400
Размер проверочного набора 800
Размер тестового набора 800
 

Чтение аудиофайлов и их меток

В этом разделе вы предварительно обработаете набор данных, создав декодированные тензоры для сигналов и соответствующие метки.Обратите внимание:

  • Каждый файл WAV содержит данные временных рядов с заданным числом выборок в секунду.
  • Каждая выборка представляет собой амплитуду аудиосигнала в указанное время.
  • В 16-битной системе, такой как WAV-файлы в мини-наборе данных Speech Commands, значения амплитуд находятся в диапазоне от -32 768 до 32 767.
  • Частота дискретизации для этого набора данных составляет 16 кГц.

Форма тензора, возвращаемого tf.audio.decode_wav , равна [семплы, каналы] , где каналов — это 1 для моно или 2 для стерео.Мини-набор данных Speech Commands содержит только монозаписи.

  test_file = tf.io.read_file(DATASET_PATH+'/down/0a9f9af7_nohash_0.wav')
test_audio, _ = tf.audio.decode_wav (содержимое = test_file)
test_audio.shape
  
Тензорформа([13654, 1])
 

Теперь давайте определим функцию, которая предварительно обрабатывает необработанные аудиофайлы WAV набора данных в аудиотензоры:

  определение decode_audio (аудио_двоичный):
  # Декодировать WAV-кодированные аудиофайлы в тензоры `float32`, нормализованные
  # к [-1.0, 1,0]. Возвращает звук `float32` и частоту дискретизации.
  аудио, _ = tf.audio.decode_wav (содержимое = audio_binary)
  # Так как все данные одноканальные (моно), удалите `channels`
  # ось из массива.
  вернуть tf.squeeze (аудио, ось = -1)
  

Определите функцию, которая создает метки, используя родительские каталоги для каждого файла:

  • Разделите пути к файлам на tf.RaggedTensor s (тензоры с рваными размерами — с кусочками, которые могут иметь разную длину).
  по определению get_label (file_path):
  части = tf.strings.split(
      ввод = путь_к_файлу,
      sep=os.path.sep)
  # Примечание: здесь вы будете использовать индексацию вместо распаковки кортежа, чтобы включить это
  # для работы в графе TensorFlow.
  возврат частей[-2]
  

Определите еще одну вспомогательную функцию — get_waveform_and_label — которая объединяет все это:

  • Введено имя аудиофайла WAV.
  • Выходные данные представляют собой кортеж, содержащий тензоры аудио и меток, готовые к обучению с учителем.
  по определению get_waveform_and_label (file_path):
  метка = get_label (путь_к_файлу)
  audio_binary = tf.io.read_file(file_path)
  форма волны = декодировать_аудио (аудио_двоичный)
  форма обратной волны, метка
  

Создайте обучающий набор для извлечения пар звуковых меток:

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

  АВТОНАСТРОЙКА = tf.data.АВТОНАСТРОЙКА

files_ds = tf.data.Dataset.from_tensor_slices (train_files)

waveform_ds = файлы_ds.карта(
    map_func=get_waveform_and_label,
    num_parallel_calls = АВТОНАСТРОЙКА)
  

Построим несколько звуковых сигналов:

  строк = 3
столбцы = 3
n = строки * столбцы
рис, оси = plt.subplots (строки, столбцы, figsize = (10, 12))

для i (аудио, метка) в enumerate(waveform_ds.take(n)):
  г = я // столбцы
  с = я % столбцов
  топор = оси[r][c]
  топор.сюжет (аудио.numpy())
  ax.set_yticks (np.arange (-1,2, 1,2, 0,2))
  метка = метка.numpy().decode('utf-8')
  ax.set_title (метка)

plt.show()
  

Преобразование сигналов в спектрограммы

Сигналы в наборе данных представлены во временной области.Далее вы преобразуете формы сигналов из сигналов временной области в сигналы частотной области времени путем вычисления кратковременного преобразования Фурье (STFT) для преобразования форм сигналов в виде спектрограмм, которые показывают изменения частоты во времени и могут быть представлены в виде 2D-изображений. Вы будете передавать изображения спектрограммы в свою нейронную сеть для обучения модели.

Преобразование Фурье ( tf.signal.fft ) преобразует сигнал в его составляющие частоты, но теряет всю информацию о времени.Для сравнения, STFT ( tf.signal.stft ) разбивает сигнал на временные окна и выполняет преобразование Фурье в каждом окне, сохраняя некоторую информацию о времени и возвращая двумерный тензор, на котором вы можете выполнять стандартные свертки.

Создайте вспомогательную функцию для преобразования сигналов в спектрограммы:

  • Осциллограммы должны быть одинаковой длины, чтобы при преобразовании их в спектрограммы результаты имели одинаковые размеры. Это можно сделать, просто дополнив нулями аудиоклипы короче одной секунды (используя tf.нулей ).
  • При вызове tf.signal.stft выберите параметры frame_length и frame_step таким образом, чтобы сгенерированное «изображение» спектрограммы было почти квадратным. Для получения дополнительной информации о выборе параметров STFT обратитесь к этому видео Coursera об обработке аудиосигнала и STFT.
  • STFT создает массив комплексных чисел, представляющих амплитуду и фазу. Однако в этом уроке вы будете использовать только величину, которую можно получить, применив тс.abs на выходе tf.signal.stft .
  по определению get_spectrogram(форма волны):
  # Заполнение нулями для звуковой волны с менее чем 16 000 сэмплов.
  input_len = 16000
  форма волны = форма волны [: input_len]
  zero_padding = tf.zeros(
      [16000] - tf.shape(форма волны),
      dtype=tf.float32)
  # Привести dtype тензоров волновых форм к float32.
  форма волны = tf.cast (форма волны, dtype = tf.float32)
  # Объедините форму волны с `zero_padding`, что гарантирует, что все аудио
  # клипы имеют одинаковую длину.equal_length = tf.concat([waveform, zero_padding], 0)
  # Преобразование сигнала в спектрограмму с помощью STFT.
  спектрограмма = tf.signal.stft(
      равная_длина, длина_фрейма=255, шаг_фрейма=128)
  # Получить величину STFT.
  спектрограмма = tf.abs(спектрограмма)
  # Добавьте измерение `channels`, чтобы можно было использовать спектрограмму
  # как входные данные, похожие на изображения, со слоями свертки (которые ожидают
  # shape(`batch_size`, `высота`, `ширина`, `каналы`).
  спектрограмма = спектрограмма[..., tf.newaxis]
  обратная спектрограмма
  

Далее приступайте к изучению данных.Распечатайте формы тензоризованной волны одного примера и соответствующую спектрограмму и воспроизведите исходный звук:

  для сигнала, метка в файле waveform_ds.take(1):
  метка = метка.numpy().decode('utf-8')
  спектрограмма = get_spectrogram (форма волны)

print('Метка:', метка)
print('Форма волны:', waveform.shape)
print('Форма спектрограммы:', spectrogram.shape)
print('Воспроизведение аудио')
display.display (display. Audio (форма волны, скорость = 16000))
  
Метка&двоеточие; вверх
Форма волны&двоеточие; (11606,)
Форма спектрограммы&двоеточие; (124, 129, 1)
Воспроизведение аудио
 

Ваш браузер не поддерживает аудио элементы.

Теперь определите функцию для отображения спектрограммы:

  def plot_spectrogram (спектрограмма, топор):
  если len(spectrogram.shape) > 2:
    утверждать len(spectrogram.shape) == 3
    спектрограмма = np.squeeze (спектрограмма, ось = -1)
  # Преобразовать частоты в логарифмическую шкалу и транспонировать, чтобы время
  # представлено по оси X (столбцы).
  # Добавьте эпсилон, чтобы избежать получения нулевого логарифма.
  log_spec = np.log (spectrogram.T + np.finfo (float).eps)
  высота = log_spec.shape[0]
  ширина = log_spec.форма[1]
  X = np.linspace(0, np.size(спектрограмма), num=width, dtype=int)
  Y = диапазон (высота)
  ax.pcolormesh(X, Y, log_spec)
  

Постройте форму сигнала примера в зависимости от времени и соответствующую спектрограмму (частоты во времени):

  рис, оси = plt.subplots(2, figsize=(12, 8))
шкала времени = np.arange (waveform.shape [0])
оси [0].plot(временная шкала, waveform.numpy())
оси[0].set_title('Форма волны')
оси [0].set_xlim([0, 16000])

plot_spectrogram (spectrogram.numpy (), оси [1])
оси[1].set_title('Спектрограмма')
plt.show()
  

Теперь определите функцию, которая преобразует набор данных формы волны в спектрограммы и соответствующие им метки в виде целочисленных идентификаторов:

  def get_spectrogram_and_label_id (аудио, метка):
  спектрограмма = get_spectrogram(аудио)
  label_id = tf.argmax (метка == команды)
  вернуть спектрограмму, label_id
  

Карта get_spectrogram_and_label_id по элементам набора данных с Dataset.map :

  спектрограмма_ds = сигнал_ds.карта(
  map_func=get_spectrogram_and_label_id,
  num_parallel_calls = АВТОНАСТРОЙКА)
  

Изучите спектрограммы для различных примеров набора данных:

  строк = 3
столбцы = 3
n = строки * столбцы
рис, оси = plt.subplots (строки, столбцы, figsize = (10, 10))

для i, (spectrogram, label_id) в enumerate(spectrogram_ds.take(n)):
  г = я // столбцы
  с = я % столбцов
  топор = оси[r][c]
  plot_spectrogram (spectrogram.numpy (), топор)
  ax.set_title (команды [label_id.numpy()])
  топор.ось('выкл')

plt.show()
  

Собери и обучи модель

Повторите предварительную обработку обучающего набора для проверочного и тестового наборов:

  def preprocess_dataset (файлы):
  файлы_ds = tf.data.Dataset.from_tensor_slices(файлы)
  output_ds = files_ds.map(
      map_func=get_waveform_and_label,
      num_parallel_calls = АВТОНАСТРОЙКА)
  output_ds = output_ds.map(
      map_func=get_spectrogram_and_label_id,
      num_parallel_calls = АВТОНАСТРОЙКА)
  вернуть output_ds
  
  train_ds = spectrogram_ds
val_ds = предварительный_набор_данных (val_files)
test_ds = предварительный_набор_данных (тестовые_файлы)
  

Группируйте обучающие и проверочные наборы для обучения модели:

  размер_пакета = 64
поезд_дс = поезд_дс.партия (размер_пакета)
val_ds = val_ds.batch(размер_пакета)
  

Добавьте операции Dataset.cache и Dataset.prefetch , чтобы уменьшить задержку чтения при обучении модели:

  train_ds = train_ds.cache().prefetch(AUTOTUNE)
val_ds = val_ds.cache().prefetch(AUTOTUNE)
  

Для модели вы будете использовать простую сверточную нейронную сеть (CNN), поскольку вы преобразовали аудиофайлы в изображения спектрограмм.

Ваш тс.Модель keras.Sequential будет использовать следующие слои предварительной обработки Keras:

Для уровня Нормализация его метод адаптации сначала необходимо вызвать для обучающих данных, чтобы вычислить совокупную статистику (то есть среднее значение и стандартное отклонение).

  для спектрограммы, _ в spectrogram_ds.take(1):
  input_shape = спектрограмма.форма
print('Форма ввода:', input_shape)
num_labels = длина (команды)

# Создать экземпляр `tf.keras.слои. Слой нормализации.
norm_layer = слои. Нормализация ()
# Подгонять состояние слоя к спектрограммам
# с `Normalization.adapt`.
norm_layer.adapt (данные = spectrogram_ds.map (map_func = лямбда-спецификация, метка: спецификация))

модель = models.Sequential([
    слои. Вход (форма = форма_ввода),
    # Даунсемплинг ввода.
    слои. Изменение размера (32, 32),
    # Нормализовать.
    норм_слой,
    слои.Conv2D(32, 3, активация='relu'),
    слои.Conv2D(64, 3, активация='relu'),
    слои.MaxPooling2D(),
    слои.Отсев(0,25),
    слои.Свести(),
    слои. Плотность (128, активация = 'relu'),
    слои. Выпадение (0,5),
    слои.Dense(num_labels),
])

модель.резюме()
  
Форма ввода&двоеточие; (124, 129, 1)
Модель&двоеточие; "последовательный"
_________________________________________________________________
 Слой (тип) Выходная форма Параметр #
================================================== ===============
 изменение размера (Изменение размера) (Нет, 32, 32, 1) 0
                                                                 
 нормализация (Normalizatio (None, 32, 32, 1) 3
 н)
                                                                 
 conv2d (Conv2D) (Нет, 30, 30, 32) 320
                                                                 
 conv2d_1 (Conv2D) (Нет, 28, 28, 64) 18496
                                                                 
 max_pooling2d (MaxPooling2D (Нет, 14, 14, 64) 0
 )
                                                                 
 отсев (отсев) (нет, 14, 14, 64) 0
                                                                 
 сгладить (сгладить) (нет, 12544) 0
                                                                 
 плотный (плотный) (нет, 128) 1605760
                                                                 
 dropout_1 (Выпадение) (Нет, 128) 0
                                                                 
 плотности_1 (Плотные) (Нет, 8) 1032
                                                                 
================================================== ===============
Всего параметров & двоеточие; 1 625 611
Обучаемые параметры & двоеточие; 1 625 608
Необучаемые параметры & двоеточие; 3
_________________________________________________________________
 

Настройте модель Keras с оптимизатором Adam и кросс-энтропийной потерей:

  модель.компилировать(
    оптимизатор=tf.keras.optimizers.Adam(),
    потеря = tf.keras.losses.SparseCategoricalCrossentropy (from_logits = True),
    метрики=['точность'],
)
  

Обучить модель более 10 эпох в демонстрационных целях:

  ЭПОХ = 10
история = model.fit(
    поезд_дс,
    validation_data=val_ds,
    эпохи = ЭПОХИ,
    callbacks=tf.keras.callbacks.EarlyStopping(многословный=1, терпение=2),
)
  
Эпоха 1/10
100/100 [===============================] - 13 с 40 мс/шаг - потеря&двоеточие; 1.7404 - точность&двоеточие; 0.3823 - val_loss: 1.3372 - val_accuracy: 0,5550
Эпоха 2/10
100/100 [===============================] - 0 с 4 мс/шаг - потеря&двоеточие; 1.1776 - точность&двоеточие; 0.5903 - val_loss: 0,9747 - val_accuracy: 0,6600
Эпоха 3/10
100/100 [===============================] - 0 с 4 мс/шаг - потеря&двоеточие; 0,9027 - точность&двоеточие; 0,6778 - val_loss: 0,8096 - val_accuracy: 0,7150
Эпоха 4/10
100/100 [===============================] - 0 с 4 мс/шаг - потеря&двоеточие; 0.7647 - точность&двоеточие; 0.7316 - val_loss: 0,7325 - val_accuracy: 0,7625
Эпоха 5/10
100/100 [===============================] - 0 с 4 мс/шаг - потеря&двоеточие; 0,6492 - точность&двоеточие; 0,7658 - val_loss: 0,6697 - val_accuracy: 0,7688
Эпоха 6/10
100/100 [===============================] - 0 с 5 мс/шаг - потеря&двоеточие; 0,5796 - точность&двоеточие; 0,7937 - val_loss: 0,6108 - val_accuracy: 0,7875
Эпоха 7/10
100/100 [===============================] - 0 с 4 мс/шаг - потеря&двоеточие; 0.5261 - точность&двоеточие; 0,8117 - val_loss: 0,5708 - val_accuracy: 0,8087
Эпоха 8/10
100/100 [===============================] - 0 с 4 мс/шаг - потеря&двоеточие; 0,4747 - точность&двоеточие; 0,8267 - val_loss: 0,5429 - val_accuracy: 0,8163
Эпоха 9/10
100/100 [===============================] - 0 с 4 мс/шаг - потеря&двоеточие; 0,4427 - точность&двоеточие; 0,8428 - val_loss: 0,5379 - val_accuracy: 0,8175
Эпоха 10/10
100/100 [===============================] - 0 с 4 мс/шаг - потеря&двоеточие; 0.3927 - точность&двоеточие; 0,8637 - val_loss: 0.5320 - val_accuracy: 0,8213
 

Давайте построим кривые потерь при обучении и проверке, чтобы проверить, насколько улучшилась ваша модель во время обучения:

  метрик = история.история
plt.plot(history.epoch, metrics['loss'], metrics['val_loss'])
plt.legend(['потеря', 'val_loss'])
plt.show()
  

Оценка производительности модели

Запустите модель на тестовом наборе и проверьте производительность модели:

  test_audio = []
test_labels = []

для аудио метка в test_ds:
  тест_аудио.добавить (аудио.numpy())
  test_labels.append(метка.numpy())

test_audio = np.array (test_audio)
test_labels = np.array (test_labels)
  
  y_pred = np.argmax (model.predict (test_audio), ось = 1)
y_true = тестовые_метки

test_acc = сумма (y_pred == y_true) / длина (y_true)
print(f'Точность набора тестов: {test_acc:.0%}')
  
Точность набора тестов&колон; 84%
 

Показать матрицу путаницы

Используйте матрицу путаницы, чтобы проверить, насколько хорошо модель справилась с классификацией каждой из команд в тестовом наборе:

  путаница_mtx = tf.math.confusion_matrix (y_true, y_pred)
plt.figure(figsize=(10, 8))
sns.heatmap(confusion_mtx,
            xticklabels=команды,
            yticklabels=команды,
            annot=Истина, fmt='g')
plt.xlabel('Прогноз')
plt.ylabel('Ярлык')
plt.show()
  

Выполнение вывода по аудиофайлу

Наконец, проверьте вывод прогноза модели, используя входной аудиофайл, в котором кто-то говорит «нет». Насколько хорошо работает ваша модель?

  файл_образца = каталог_данных/'нет/01bb6a2a_nohash_0.wav'

sample_ds = preprocess_dataset([str(sample_file)])

для спектрограммы метка в sample_ds.batch(1):
  прогноз = модель (спектрограмма)
  plt.bar (команды, tf.nn.softmax (прогноз [0]))
  plt.title(f'Предсказания для "{commands[label[0]]}"')
  plt.show()
  

Судя по выходным данным, ваша модель должна была распознать аудиокоманду как «нет».

Следующие шаги

В этом учебном пособии показано, как выполнять простую аудиоклассификацию/автоматическое распознавание речи с использованием сверточной нейронной сети с TensorFlow и Python.Чтобы узнать больше, рассмотрите следующие ресурсы:

Передача обучения с помощью YAMNet для классификации звуков окружающей среды  | Ядро TensorFlow

YAMNet — это предварительно обученная глубокая нейронная сеть, которая может предсказывать звуковые события из 521 класса, такие как смех, лай или сирена.

В этом уроке вы узнаете, как:

  • Загрузите и используйте модель YAMNet для логического вывода.
  • Создайте новую модель, используя вложения YAMNet, чтобы классифицировать звуки кошек и собак.
  • Оцените и экспортируйте свою модель.

Импорт TensorFlow и других библиотек

Начните с установки TensorFlow I/O, что облегчит вам загрузку аудиофайлов с диска.

  pip установить tensorflow_io 
 
  импорт ОС

из отображения импорта IPython
импортировать matplotlib.pyplot как plt
импортировать numpy как np
импортировать панд как pd

импортировать тензорный поток как tf
импортировать tensorflow_hub как концентратор
импортировать tensorflow_io как tfio
  

О YAMNet

YAMNet — это предварительно обученная нейронная сеть, использующая архитектуру свертки MobileNetV1 с разделением по глубине.Он может использовать форму аудиосигнала в качестве входных данных и делать независимые прогнозы для каждого из 521 аудиособытия из корпуса AudioSet.

Модель извлекает «кадры» из звукового сигнала и обрабатывает пакеты этих кадров. Эта версия модели использует кадры продолжительностью 0,96 секунды и извлекает один кадр каждые 0,48 секунды.

Модель принимает одномерный массив float32 Tensor или NumPy, содержащий сигнал произвольной длины, представленный в виде одноканальных (моно) отсчетов 16 кГц в диапазоне [-1.0, +1,0] . Это руководство содержит код, который поможет вам преобразовать файлы WAV в поддерживаемый формат.

Модель возвращает 3 вывода, включая баллы класса, встраивания (которые вы будете использовать для трансферного обучения) и логарифмическую спектрограмму мела. Вы можете найти более подробную информацию здесь.

Одно из конкретных применений YAMNet — это высокоуровневый экстрактор функций — вывод 1024-мерного встраивания. Вы будете использовать входные функции базовой (YAMNet) модели и передавать их в более мелкую модель, состоящую из одного скрытого tf.keras.layers. Плотный слой . Затем вы будете обучать сеть на небольшом количестве данных для классификации звука без , требующего большого количества размеченных данных и сквозного обучения. (Это похоже на перенос обучения для классификации изображений с TensorFlow Hub для получения дополнительной информации.)

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

Загрузка YAMNet из концентратора TensorFlow

Вы собираетесь использовать предварительно обученный YAMNet из Tensorflow Hub для извлечения вложений из звуковых файлов.

Загрузить модель из TensorFlow Hub очень просто: выберите модель, скопируйте ее URL-адрес и используйте функцию загрузки .

Примечание. Чтобы прочитать документацию по модели, используйте URL-адрес модели в браузере.
  yamnet_model_handle = 'https://tfhub.dev/google/yamnet/1'
yamnet_model = hub.load (yamnet_model_handle)
  

Загрузив модель, вы можете следовать руководству по основам использования YAMNet и загрузить образец WAV-файла для выполнения вывода.

  testing_wav_file_name = tf.keras.utils.get_file('miaow_16k.wav',
                                                'https://storage.googleapis.com/audioset/miaow_16k.wav',
                                                cache_dir='./',
                                                cache_subdir='test_data')

печать (testing_wav_file_name)
  
Загрузка данных с https://storage.googleapis.com/audioset/miaow_16k.wav
221184/215546 [==============================] - 0s 0us/шаг
./test_data/miaow_16k.wav
 

Вам понадобится функция загрузки аудиофайлов, которая также будет использоваться в дальнейшем при работе с обучающими данными. (Узнайте больше о чтении аудиофайлов и их меток в разделе Простое распознавание аудио.

Примечание: Возврат wav_data из load_wav_16k_mono уже нормализован до значений в диапазоне [-1.0, 1.0] (дополнительную информацию см. в документации YAMNet на TF Hub).
  # Служебные функции для загрузки аудиофайлов и проверки правильности частоты дискретизации[email protected]
def load_wav_16k_mono (имя файла):
    """ Загрузите файл WAV, преобразуйте его в тензор с плавающей запятой, передискретизируйте до одноканального звука 16 кГц. """
    file_contents = tf.io.read_file(имя файла)
    wav, sample_rate = tf.audio.decode_wav(
          файл_содержимое,
          желаемые_каналы=1)
    wav = tf.squeeze(wav, ось=-1)
    Sample_rate = tf.cast (sample_rate, dtype = tf.int64)
    wav = tfio.audio.resample(wav, rate_in=sample_rate, rate_out=16000)
    вернуть wav
  
  testing_wav_data = load_wav_16k_mono(testing_wav_file_name)

_ = пл.график (testing_wav_data)

# Воспроизведение аудиофайла.
display.Audio (testing_wav_data, скорость = 16000)
  
ПРЕДУПРЕЖДЕНИЕ:tensorflow:из /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/ops/parallel_for/pfor.py:2382: вызов сбора (из tensorflow.python.ops.array_ops) с validate_indices устарел и будет удален в будущей версии.
Инструкции по обновлению:
Аргумент `validate_indices` не действует. Индексы всегда проверяются на CPU и никогда не проверяются на GPU.ПРЕДУПРЕЖДЕНИЕ:tensorflow:из /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/ops/parallel_for/pfor.py:2382: вызов сбора (из tensorflow.python.ops.array_ops) с validate_indices устарел и будет удален в будущей версии.
Инструкции по обновлению:
Аргумент `validate_indices` не действует. Индексы всегда проверяются на CPU и никогда не проверяются на GPU.
ПРЕДУПРЕЖДЕНИЕ:tensorflow:Использование цикла while_loop для преобразования IO>AudioResample
ПРЕДУПРЕЖДЕНИЕ:tensorflow:Использование цикла while_loop для преобразования IO>AudioResample
 

Ваш браузер не поддерживает аудио элементы.

Загрузить сопоставление классов

Важно загрузить имена классов, которые YAMNet может распознать. Файл сопоставления находится по адресу yamnet_model.class_map_path() в формате CSV.

  class_map_path = yamnet_model.class_map_path().numpy().decode('utf-8')
class_names = list (pd.read_csv (class_map_path) ['display_name'])

для имени в class_names[:20]:
  печать (имя)
Распечатать('...')
  
Речь
Детская речь, ребенок говорит
Беседа
Рассказ, монолог
лепет
Синтезатор речи
Кричать
Беллоу
Упс
Кричать
Дети кричат
Кричать
шепотом
Смех
Детский смех
хихикать
Сникер
живот смех
Смеяться, хихикать
Плачет, рыдает
...
 

Запустить вывод

YAMNet предоставляет оценки классов на уровне кадров (т. е. 521 оценка для каждого кадра). Чтобы определить прогнозы на уровне клипа, оценки могут быть агрегированы для каждого класса по кадрам (например, с использованием среднего или максимального агрегирования). Это делается ниже с помощью scores_np.mean(axis=0) . Наконец, чтобы найти класс с наивысшим баллом на уровне клипа, вы берете максимум из 521 агрегированного балла.

  баллов, встраивания, спектрограмма = yamnet_model(testing_wav_data)
class_scores = tf.reduce_mean (баллы, ось = 0)
top_class = tf.argmax(class_scores)
предполагаемый_класс = имена_классов[высший_класс]

print(f'Основной звук: {inferred_class}')
print(f'Форма встраивания: {embeddings.shape}')
  
Основной звук : Животное
Вложения shape: (13, 1024)
 
Примечание: Модель правильно определила звук животного. Ваша цель в этом руководстве — повысить точность модели для определенных классов. Также обратите внимание, что модель сгенерировала 13 вложений, по 1 на кадр.

Набор данных ESC-50

Набор данных ESC-50 (Piczak, 2015) представляет собой помеченную коллекцию из 2000 пятисекундных аудиозаписей окружающей среды. Набор данных состоит из 50 классов, по 40 примеров в каждом классе.

Загрузите набор данных и распакуйте его.

  _ = tf.keras.utils.get_file('esc-50.zip',
                        'https://github.com/karoldvl/ESC-50/archive/master.zip',
                        cache_dir='./',
                        cache_subdir = 'наборы данных',
                        экстракт = Истина)
  
Загрузка данных с https://github.com/karoldvl/ESC-50/archive/master.zip
645701632/Неизвестно - 41 с 0 мкс/шаг
 

Исследуйте данные

Метаданные для каждого файла указаны в CSV-файле по адресу ./datasets/ESC-50-master/meta/esc50.csv

и все аудиофайлы находятся в ./datasets/ESC-50-master/audio/

Вы создадите pandas DataFrame с сопоставлением и будете использовать его для более четкого представления данных.

  esc50_csv = './наборы данных/ESC-50-мастер/мета/esc50.csv'
base_data_path = './datasets/ESC-50-master/аудио/'

pd_data = pd.read_csv (esc50_csv)
pd_data.head()
  

Фильтр данных

Теперь, когда данные хранятся в DataFrame , примените некоторые преобразования:

  • Отфильтровать строки и использовать только выбранные классы — собака и кошка . Если вы хотите использовать какие-либо другие классы, вы можете выбрать их здесь.
  • Измените имя файла, указав полный путь. Это облегчит загрузку позже.
  • Изменить цели так, чтобы они находились в пределах определенного диапазона. В этом примере собака останется как 0 , но кошка станет 1 вместо исходного значения 5 .
  my_classes = ['собака', 'кошка']
map_class_to_id = {'собака':0, 'кошка':1}

filtered_pd = pd_data[pd_data.category.isin(my_classes)]

class_id = filtered_pd['категория'].apply(имя лямбда: map_class_to_id[имя])
filtered_pd = filtered_pd.assign(target=class_id)

полный_путь = filtered_pd['имя файла'].применить (лямбда-строка: os.path.join (base_data_path, строка))
filtered_pd = filtered_pd.assign (имя файла = полный_путь)

filtered_pd.head(10)
  

Загрузите аудиофайлы и извлеките вложения

Здесь вы примените load_wav_16k_mono и подготовите данные WAV для модели.

При извлечении вложений из данных WAV вы получаете массив формы (N, 1024) , где N — количество кадров, найденных YAMNet (по одному на каждые 0,48 секунды звука).

Ваша модель будет использовать каждый кадр как один вход. Поэтому вам нужно создать новый столбец с одним кадром в строке. Вам также необходимо расширить метки и столбец fold , чтобы правильно отразить эти новые строки.

Расширенный столбец fold сохраняет исходные значения. Вы не можете смешивать кадры, потому что при выполнении разделения вы можете получить части одного и того же звука в разных разделениях, что сделает ваши шаги проверки и тестирования менее эффективными.

  имен файлов = filtered_pd['имя файла']
цели = filtered_pd['цель']
складки = filtered_pd['fold']

main_ds = tf.data.Dataset.from_tensor_slices((имена файлов, цели, складки))
main_ds.element_spec
  
(TensorSpec(shape=(), dtype=tf.string, name=None),
 TensorSpec (форма = (), dtype = tf.int64, имя = нет),
 TensorSpec (форма = (), dtype = tf.int64, имя = нет))
 
  def load_wav_for_map (имя файла, метка, складка):
  вернуть load_wav_16k_mono(имя файла), метку, свернуть

main_ds = основные_ds.карта (load_wav_for_map)
main_ds.element_spec
  
ПРЕДУПРЕЖДЕНИЕ:tensorflow:Использование цикла while_loop для преобразования IO>AudioResample
ПРЕДУПРЕЖДЕНИЕ:tensorflow:Использование цикла while_loop для преобразования IO>AudioResample
(TensorSpec(shape=, dtype=tf.float32, name=None),
 TensorSpec (форма = (), dtype = tf.int64, имя = нет),
 TensorSpec (форма = (), dtype = tf.int64, имя = нет))
 
  # применяет модель извлечения внедрения к данным wav
def extract_embedding (wav_data, label, fold):
  ''' запустите YAMNet, чтобы извлечь встраивание из данных wav '''
  оценки, вложения, спектрограмма = yamnet_model(wav_data)
  количество_вложений = tf.форма (вложения) [0]
  возврат (вложения,
            tf.repeat (метка, num_embeddings),
            tf.repeat (fold, num_embeddings))

# извлечь встраивание
main_ds = main_ds.map(extract_embedding).unbatch()
main_ds.element_spec
  
(TensorSpec (форма = (1024,), dtype = tf.float32, имя = нет),
 TensorSpec (форма = (), dtype = tf.int64, имя = нет),
 TensorSpec (форма = (), dtype = tf.int64, имя = нет))
 

Разделить данные

Вы будете использовать столбец fold , чтобы разделить набор данных на наборы для обучения, проверки и тестирования.

ESC-50 состоит из пяти одинаковых по размеру кросс-валидаций кратных , так что клипы из одного и того же исходного источника всегда находятся в одном и том же кратном — узнайте больше в документе ESC: Dataset for Environmental Sound Classification.

Последний шаг — удалить столбец fold из набора данных, поскольку вы не собираетесь использовать его во время обучения.

  cached_ds = main_ds.cache()
train_ds = cached_ds.filter (встраивание лямбда, метка, складка: складка < 4)
val_ds = кэшированные_ds.фильтр (вложение лямбда, метка, складка: складка == 4)
test_ds = cached_ds.filter (встраивание лямбда, метка, складка: складка == 5)

# удалить столбец folds, поскольку он больше не нужен
remove_fold_column = лямбда-встраивание, метка, складка: (встраивание, метка)

train_ds = train_ds.map(remove_fold_column)
val_ds = val_ds.map (удалить_fold_column)
test_ds = test_ds.map (удалить_fold_column)

train_ds = train_ds.cache().shuffle(1000).batch(32).prefetch(tf.data.AUTOTUNE)
val_ds = val_ds.cache().batch(32).prefetch(tf.данные.АВТОНАСТРОЙКА)
test_ds = test_ds.cache().batch(32).prefetch(tf.data.AUTOTUNE)
  

Создайте свою модель

Вы сделали большую часть работы! Затем определите очень простую модель Sequential с одним скрытым слоем и двумя выходными данными для распознавания кошек и собак по звукам.

  my_model = tf.keras.Sequential([
    tf.keras.layers.Input (форма = (1024), dtype = tf.float32,
                          имя = 'input_embedding'),
    tf.keras.layers.Dense(512, активация='relu'),
    тф.keras.layers.Dense (len (my_classes))
], имя='моя_модель')

моя_модель.резюме()
  
ВНИМАНИЕ:tensorflow:пожалуйста, добавьте keras.layers.InputLayer вместо keras.Input в последовательную модель. keras.Input предназначен для использования функциональной моделью.
ВНИМАНИЕ:tensorflow:пожалуйста, добавьте keras.layers.InputLayer вместо keras.Input в последовательную модель. keras.Input предназначен для использования функциональной моделью.
Модель&двоеточие; "моя_модель"
_________________________________________________________________
Слой (тип) Выходная форма Параметр #
================================================== ===============
плотный (Плотный) (Нет, 512) 524800
_________________________________________________________________
плотности_1 (Плотные) (Нет, 2) 1026
================================================== ===============
Всего параметров & двоеточие; 525 826
Обучаемые параметры & двоеточие; 525 826
Необучаемые параметры & двоеточие; 0
_________________________________________________________________
 
  моя_модель.скомпилировать (потеря = tf.keras.losses.SparseCategoricalCrossentropy (from_logits = True),
                 оптимизатор = "адам",
                 метрики=['точность'])

callback = tf.keras.callbacks.EarlyStopping(monitor='потеря',
                                            терпение=3,
                                            restore_best_weights=Истина)
  
  история = my_model.fit(train_ds,
                       эпохи=20,
                       validation_data=val_ds,
                       обратные вызовы = обратный вызов)
  
Эпоха 1/20
15/15 [===============================] - 5 с 25 мс/шаг - потеря&двоеточие; 0.7833 - точность&двоеточие; 0.8000 - val_loss: 0,6789 - val_accuracy: 0,8687
Эпоха 2/20
15/15 [===============================] - 0 с 16 мс/шаг - потеря&двоеточие; 0,5082 - точность&двоеточие; 0,8958 - val_loss: 0,3775 - val_accuracy: 0,8813
Эпоха 3/20
15/15 [===============================] - 0 с 17 мс/шаг - потеря&двоеточие; 0,3210 - точность&двоеточие; 0,8750 - val_loss: 0,5043 - val_accuracy: 0,8750
Эпоха 4/20
15/15 [===============================] - 0 с 17 мс/шаг - потеря&двоеточие; 0.2146 - точность&колон; 0.9021 - val_loss: 0,3757 - val_accuracy: 0,8750
Эпоха 5/20
15/15 [===============================] - 0 с 17 мс/шаг - потеря&двоеточие; 0,2113 - точность&двоеточие; 0.9062 - val_loss: 0.2740 - val_accuracy: 0,8750
Эпоха 6/20
15/15 [===============================] - 0 с 17 мс/шаг - потеря&двоеточие; 0,2672 - точность&двоеточие; 0,9167 - val_loss: 0,4483 - val_accuracy: 0,8750
Эпоха 7/20
15/15 [===============================] - 0 с 17 мс/шаг - потеря&двоеточие; 0.2386 - точность и двоеточие; 0.9333 - val_loss: 0,5775 - val_accuracy: 0,8687
Эпоха 8/20
15/15 [===============================] - 0 с 17 мс/шаг - потеря&двоеточие; 0,1639 - точность&двоеточие; 0,9229 - val_loss: 0,4539 - val_accuracy: 0,8750
Эпоха 9/20
15/15 [===============================] - 0 с 18 мс/шаг - потеря&двоеточие; 0,3539 - точность&двоеточие; 0.9250 - val_loss: 0,2091 - val_accuracy: 0,9187
Эпоха 10/20
15/15 [===============================] - 0 с 18 мс/шаг - потеря&двоеточие; 0.2705 ​​- точность&двоеточие; 0.9271 - val_loss: 0,2505 - val_accuracy: 0,9062
Эпоха 11/20
15/15 [===============================] - 0 с 17 мс/шаг - потеря&двоеточие; 0,2582 - точность&двоеточие; 0.9312 - val_loss: 0.2182 - val_accuracy: 0,9250
 

Давайте запустим метод оценки на тестовых данных, чтобы убедиться, что нет переобучения.

  потеря, точность = my_model.evaluate(test_ds)

print("Убыток: ", убыток)
print("Точность: ", точность)
  
5/5 [===============================] - 0 с 4 мс/шаг - потеря&двоеточие; 0.6575 - точность&двоеточие; 0,8125
Потеря&колон; 0,657511293888092
Точность&двоеточие; 0,8125
 

Ты сделал это!

Протестируйте свою модель

Затем попробуйте свою модель на встраивании из предыдущего теста, используя только YAMNet.

  баллов, встраивания, спектрограмма = yamnet_model(testing_wav_data)
результат = my_model(вложения).numpy()

inferred_class = my_classes[result.mean(ось=0).argmax()]
print(f'Основной звук: {inferred_class}')
  
Основной звук : Кот
 

Сохраните модель, которая может напрямую принимать WAV-файл в качестве входных данных

Ваша модель работает, когда вы вводите в нее вложения.

В реальном сценарии вы захотите использовать аудиоданные в качестве прямого ввода.

Для этого вы объедините YAMNet со своей моделью в единую модель, которую сможете экспортировать для других приложений.

Чтобы упростить использование результатов модели, последним слоем будет операция reduce_mean . При использовании этой модели для сервировки (о которой вы узнаете позже в этом уроке) вам понадобится имя финального слоя. Если вы не определите его, TensorFlow автоматически определит добавочный, что затруднит тестирование, поскольку он будет меняться каждый раз, когда вы обучаете модель.При использовании необработанной операции TensorFlow вы не можете присвоить ей имя. Чтобы решить эту проблему, вы создадите пользовательский слой, который применяет reduce_mean и назовите его 'классификатор' .

  класс ReduceMeanLayer (tf.keras.layers.Layer):
  def __init__(я, ось=0, **kwargs):
    super(ReduceMeanLayer, self).__init__(**kwargs)
    self.axis = ось

  деф вызов(я, ввод):
    вернуть tf.math.reduce_mean (вход, ось = self.axis)
  
  save_model_path = './dogs_and_cats_yamnet'

input_segment = tf.keras.layers.Input(shape=(), dtype=tf.float32, name='аудио')
embedding_extraction_layer = hub.KerasLayer(yamnet_model_handle,
                                            обучаемый = Ложь, имя = 'ямнет')
_, embeddings_output, _ = embedding_extraction_layer (входной_сегмент)
serve_outputs = my_model (embeddings_output)
serve_outputs = ReduceMeanLayer (ось = 0, имя = 'классификатор') (serving_outputs)
serve_model = tf.keras.Model (input_segment, serve_outputs)
serving_model.сохранить (saved_model_path, include_optimizer = False)
  
ВНИМАНИЕ:tensorflow:Загруженная модель скомпилирована, но скомпилированные метрики еще не созданы. `model.compile_metrics` будет пустым, пока вы не обучите или не оцените модель.
ВНИМАНИЕ:tensorflow:Загруженная модель скомпилирована, но скомпилированные метрики еще не созданы. `model.compile_metrics` будет пустым, пока вы не обучите или не оцените модель.
INFO:tensorflow:Активы, записанные в: ./dogs_and_cats_yamnet/активы
INFO:tensorflow:Активы, записанные в: ./dogs_and_cats_yamnet/активы
 
  tf.keras.utils.plot_model (serving_model)
  

Загрузите сохраненную модель, чтобы убедиться, что она работает должным образом.

  reloaded_model = tf.saved_model.load (путь_сохраненной_модели)
  

И последний тест: учитывая некоторые звуковые данные, возвращает ли ваша модель правильный результат?

  reloaded_results = reloaded_model(testing_wav_data)
cat_or_dog = мои_классы[tf.argmax(reloaded_results)]
print(f'Основной звук: {cat_or_dog}')
  
Основной звук : Кот
 

Если вы хотите опробовать новую модель в настройке обслуживания, вы можете использовать сигнатуру serving_default.

  serve_results = reloaded_model.signatures['serving_default'](testing_wav_data)
cat_or_dog = my_classes[tf.argmax(serving_results['классификатор'])]
print(f'Основной звук: {cat_or_dog}')
  
Основной звук : Кот
 

(дополнительно) Еще несколько тестов

Модель готова.

Давайте сравним его с YAMNet на тестовом наборе данных.

  test_pd = filtered_pd.loc[filtered_pd['fold'] == 5]
строка = test_pd.sample(1)
имя файла = строка['имя файла'].item()
печать (имя файла)
форма волны = load_wav_16k_mono(имя файла)
print(f'Значения формы волны: {форма волны}')
_ = plt.plot(форма волны)

display.Audio (форма волны, скорость = 16000)
  
./наборы данных/ESC-50-мастер/аудио/5-212454-A-0.wav
ПРЕДУПРЕЖДЕНИЕ:tensorflow:Использование цикла while_loop для преобразования IO>AudioResample
ПРЕДУПРЕЖДЕНИЕ:tensorflow:Использование цикла while_loop для преобразования IO>AudioResample
Значения формы волны&двоеточие; [-8.8849301e-09 2.6603255e-08 -1.1731625e-08 ... -1.3478296e-03
 -1.0509168e-03 -9.1038318e-04]
 

Ваш браузер не поддерживает аудио элементы.

  # Запускаем модель, проверяем вывод.
оценки, вложения, спектрограмма = yamnet_model (форма волны)
class_scores = tf.reduce_mean (баллы, ось = 0)
top_class = tf.argmax(class_scores)
предполагаемый_класс = имена_классов[высший_класс]
top_score = class_scores[top_class]
print(f'[YAMNet] Основной звук: {inferred_class} ({top_score})')

reloaded_results = reloaded_model (форма волны)
ваш_верхний_класс = tf.argmax(reloaded_results)
your_inferred_class = my_classes[your_top_class]
class_probabilities = tf.nn.softmax (reloaded_results, ось = -1)
your_top_score = class_probabilities[your_top_class]
print(f'[Ваша модель] Основной звук: {your_inferred_class} ({your_top_score})')
  
[YAMNet] Основной звук : Животное (0,9570276141166687)
[Ваша модель] Основной звук : собака (0,9999711513519287)
 

Следующие шаги

Вы создали модель, которая может классифицировать звуки собак и кошек.С той же идеей и другим набором данных вы можете попробовать, например, построить акустический идентификатор птиц на основе их пения.

Поделитесь своим проектом с командой TensorFlow в социальных сетях!

Использовать распознавание голоса в Windows

Настройка микрофона

Перед настройкой распознавания речи убедитесь, что у вас настроен микрофон.

  1. Выберите  (Пуск) > Настройки  Время и язык > Речь .

  2. В разделе Микрофон нажмите кнопку Начать .

  3. Откроется окно мастера Speech , и установка начнется автоматически. Если мастер обнаружит проблемы с вашим микрофоном, они будут перечислены в диалоговом окне мастера. Вы можете выбрать параметры в диалоговом окне, чтобы указать проблему и помочь мастеру решить ее.

Помогите компьютеру распознать ваш голос

Вы можете научить Windows 11 распознавать ваш голос. Вот как это настроить:

  1. Нажмите клавишу с логотипом Windows+Ctrl+S. Окно мастера настройки распознавания речи открывается с введением на странице Добро пожаловать в распознавание речи .

    Совет:  Если вы уже настроили распознавание речи, нажмите клавишу с логотипом Windows+Ctrl+S, чтобы открыть распознавание речи, и вы готовы его использовать.Если вы хотите переучить компьютер распознавать ваш голос, нажмите клавишу с логотипом Windows, введите Панель управления и выберите Панель управления в списке результатов. В Панели управления выберите Простота доступа > Распознавание речи > Обучите свой компьютер лучше понимать вас .

  2. Выбрать Далее . Следуйте инструкциям на экране, чтобы настроить распознавание речи.Мастер проведет вас через этапы настройки.

  3. После завершения настройки вы можете пройти обучение, чтобы узнать больше о распознавании речи. Чтобы пройти обучение, выберите Start Tutorial в окне мастера. Чтобы пропустить учебник, выберите Пропустить учебник . Теперь вы можете начать использовать распознавание речи.

См. также

Команды распознавания речи Windows

Настройка микрофона

Прежде чем настраивать распознавание голоса, убедитесь, что у вас настроен микрофон.

  1. Нажмите кнопку Пуск , затем выберите Настройки  >  Время и язык > Речь .

  2. В разделе Микрофон нажмите кнопку Начать .

Помогите компьютеру распознать ваш голос

Вы можете научить Windows 10 распознавать ваш голос.Вот как это настроить:

  1. В поле поиска на панели задач введите Распознавание речи Windows , а затем выберите Распознавание речи Windows в списке результатов.

  2. Если вы не видите диалоговое окно с надписью «Добро пожаловать в программу обучения распознаванию речи», в поле поиска на панели задач введите Панель управления и выберите Панель управления в списке результатов.Затем выберите Специальные возможности > Распознавание речи > Научите компьютер лучше понимать вас .

  3. Следуйте инструкциям по настройке распознавания речи.

См. также

Команды распознавания речи Windows

Полное руководство по распознаванию речи с помощью Python — Real Python