Телефон: 8-800-350-22-65
WhatsApp: 8-800-350-22-65
Telegram: sibac
Прием заявок круглосуточно
График работы офиса: с 9.00 до 18.00 Нск (5.00 - 14.00 Мск)

Статья опубликована в рамках: CLIII Международной научно-практической конференции «Научное сообщество студентов: МЕЖДИСЦИПЛИНАРНЫЕ ИССЛЕДОВАНИЯ» (Россия, г. Новосибирск, 21 ноября 2022 г.)

Наука: Информационные технологии

Скачать книгу(-и): Сборник статей конференции

Библиографическое описание:
Миронов А.И. ВНУТРЕННЕЕ УСТРОЙСТВО ГОЛОСОВОГО ПОМОЩНИКА. МЕТОДЫ РАСПОЗНАВАНИЯ ЗВУКА И ТЕКСТА // Научное сообщество студентов: МЕЖДИСЦИПЛИНАРНЫЕ ИССЛЕДОВАНИЯ: сб. ст. по мат. CLIII междунар. студ. науч.-практ. конф. № 22(152). URL: https://sibac.info/archive/meghdis/22(152).pdf (дата обращения: 29.11.2024)
Проголосовать за статью
Конференция завершена
Эта статья набрала 1 голос
Дипломы участников
У данной статьи нет
дипломов

ВНУТРЕННЕЕ УСТРОЙСТВО ГОЛОСОВОГО ПОМОЩНИКА. МЕТОДЫ РАСПОЗНАВАНИЯ ЗВУКА И ТЕКСТА

Миронов Александр Иванович

студент 4 курса, направление «Прикладная математика и информатика», Российский университет дружбы народов,

РФ, г. Москва

INTERNAL ARRANGEMENT OF THE VOICE ASSISTANT. METHODS OF SOUND AND TEXT PERCEPTION

 

Alexander Mironov

4th year student of the direction "Applied Mathematics and Computer Science", Russian University of Friendship of Peoples,

Russia, Moscow

 

АННОТАЦИЯ

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

ABSTRACT

The mathematical and physical foundations of algorithms and methods used for human speech recognition and text analysis are considered. Approaches to the implementation of these algorithms are described.

 

Ключевые слова: голосовой помощник, звуковые волны.

Keywords: voice assistant, sound waves.

 

Цель:

Цель – изучить методы распознавание человеческой речи и теста. Для это рассмотрим математические и физические основы алгоритмов и методов.

Анализ задачи

Математические и физические основы рассматриваемой задачи.

Основной задачей, которую должна выполнять программа, является распознавание речи. Прежде всего, эту речь необходимо сохранить в определенном формате. Человеческая речь — это последовательность звуков. Звук, в свою очередь — это суперпозиция звуковых колебаний (волн) различных частот. В свою очередь волна характеризуются тремя атрибутами — амплитудой, частотой и начальной фазой.

Звуковую волну можно представить в виде сигнала, у которого каждый из представляющих параметров будет описываться функцией амплитуды от частоты [1]. Такой сигнал называется аналоговым. При графическом отображении аналогово сигнала его амплитуда будет характеризовать громкость звука, а частота – временной промежуток.

 

Рисунок 1. Звуковая волна как зависимость амплитуды от частоты

 

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

 

Рисунок 2. Кодирование звука

 

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

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

 

Рисунок 3. Разница в качестве оцифрованного звука

 

При этом стоит учесть, что чем больше будет осуществляться процесс дробления, тем больше в итоге окажется объем искомого аудиофайла [1].

Чаще всего речевые сигналы дискретизируют с частотой 44100 Гц. Это означает, что в течение одной секунды речевой сигнал разбивается на 44100 частей и значения, соответствующие различным отметкам времени, сохраняются в выходном файле. Сохраняется значение аудиосигнала каждую 1/44100 долю секунды [2]. В таком случае говорят, что частота дискретизации аудиосигнала составляет 44100 Гц. В случае выбора достаточно высокой частоты дискретизации аудиосигнала людям, слышащим его, кажется, будто он непрерывный.

Было установлено, что информационный объем звукового файла вычисляется по формуле:

                                                                                               (1)

где: I – информационный объем;

H – частота дискретизации;

t – время звучания;

b – глубина кодирования.

Простейшим примером файла, содержащего оцифрованный звуковой сигнал, является формат «.wav» (Waveform Audio File Format) [3]. Данный формат подразумевает наличие в файле двух блоков. Первый блок — это заголовок с информацией об аудиопотоке: битрейте, частоте, количестве каналов, длине файла и т.д. Второй блок состоит из «сырых» данных — того самого цифрового сигнала, набора значений амплитуд.

Другой вариант – формат «.mp3» [3]. Он отличается от первого несколькими характеристиками. Во-первых, в нем используется алгоритм сжатия с потерями, что существенно уменьшает размер итогового файла (запись звука длительностью 60 секунд при качестве 320 Кбит/сек в формате «.mp3» будет иметь объем 2 Мб, в формате «.wav» – 9 Мб). Принцип сжатия заключается в снижении точности некоторых частей звукового потока, что практически неразличимо для слуха на повсеместно распространённой аппаратуре низкой точности воспроизведения звука, однако в большинстве случаев чётко различимы на аудиотехнике высокой точности воспроизведения. Во-вторых, файлы формата «.mp3» могут иметь различный битрейт (интенсивность воспроизведения звукового потока), тогда как для «.wav» файлов данная характеристика всегда одинакова.

Описание подходов к решению

Методы распознания речи.

В основе распознавания речи лежит «сопоставление» множества численных значений цифрового сигнала и численных значений слов из некоторого словаря. Чисто теоретически, возможно брать оцифрованный сигнал и проводить поэлементное сравнение с каким-либо образцом, уже известным заранее. Но такой подход, очевидно, является провальным, причем как в краткосрочной перспективе, так и в долгосрочной. Во-первых, на сам звуковой сигнал может влиять множество факторов, таких, как тон и тембр голоса, акцент произносящего, эмоциональная окраска, которую он вкладывает в фразу, фоновые шумы и т.д. Из-за всего этого может возникнуть ситуация, когда одно и то же слово, произнесенное двумя разными людьми в разных обстановках, будет иметь совсем разные амплитуду и частоту. Во-вторых, если таким образом пришлось бы поэлементно сравнивать имеющийся образец с каждым из множества других, записанных в словаре, то на распознавание даже одного слова могли бы уходить немыслимые временные затраты. Например, звуковая библиотека компании Google (По требованию Роскомнадзора информируем, что иностранное лицо, владеющее информационными ресурсами Google, является нарушителем законодательства Российской Федерации) хранит в себе более 290 000 000 000 слов на различных языках мира. Даже если допустить, что такая программа могла бы выполнять поэлементное сравнение со скоростью 1 000 000 слов в секунду, ей бы потребовалось в худшем случае 3.5 дня на поиск одного слова. Конечно, можно было бы ввести ограничения и обозначить границы поиска, но даже так результат был бы непозволительно долгим. Не говоря о том, что в файле может содержаться не одно слово, а некая фраза. В связи с этим, данное решение является неверным, и в основном используется подход, описанный ниже.

Этап 1. Разбиение на слова. Прежде всего, необходимо произвести разбиение имеющихся данных по временным промежуткам – фреймам. Фреймы являются более подходящей единицей анализа данных, чем конкретные значения сигнала, так как проведение процесса анализа волн удобнее проводить на некотором промежутке, чем в конкретных точках. Разбиение должно производиться таким образом, чтобы фреймы пересекались друг с другом. Данное расположение позволяет сгладить результаты анализа фреймов, превращая их идею в своеобразное “окно”, движущееся вдоль исходной функции (значений сигнала). Опытным путём установлено, что оптимальная длина фрейма должна соответствовать промежутку в 10мс, а уровень «наслоения» должен быть равен 50%. С учётом средней длины слова, равной приблизительно 500мс, такой шаг будет давать около 10 фреймов на слово [4].

Следующим шагом будет непосредственное разбиение фразы на слова. В большинстве случаев речь, поступающая на анализ, является членораздельной и не представляет собой нескончаемый звуковой поток. Она формируется из отдельных слов, которые разделяются между собой паузами. В таком случае, нужно установить некую границу, такую, что любое значение выше нее будет считаться частью слова, а любое значение ниже – тишиной. Реализовать данную особенность можно несколькими способами: задать константой; кластеризовать значения сигнала, явно выделив множество значений, которые соответствуют тишине; проанализировать энтропию [4] (наиболее универсальный и действенный вариант, о котором далее будет идти речь).

Энтропия – мера беспорядка. В случае распознавания звука энтропия будет иллюстрировать то, как сильно будет колебаться сигнал в пределах одного фрейма. Для подсчета энтропии конкретного фрейма нужно: произвести нормирование сигнала, т.е. отформатировать его значения таким образом, чтобы все они лежали в диапазоне [-1; 1]; построить гистограмму значений сигнала фрейма по формуле:

                                                                                 (2)

где: Е – энтропия;

P[i] – нормированное значение сигнала;

N – количество значений сигнала в фрейме.

Мы получили новое свойство, которым обладает фрейм. Но для того, чтобы оно имело смысл, нужно сравнить его с чем-то, иметь точку отсчета, иначе эта характеристика не будет иметь смысла. Как и в случае с длиной фрейма, опытным путем было установлено, что начальное, т.н. «пороговое» значение энтропии равно 0.1.

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

Этап 2. Преобразование Фурье. Цифровой сигнал был разбит на наборы фреймов, характеризующие отдельные слова. Но тех характеристик, которыми обладает наш сигнал, и, в частности, его составляющие, все еще мало для полного анализа. Как было сказано ранее, звуковой сигнал в первоначальном виде представляет собой множество синусоидальных волн с различными частотами, фазами и амплитудами. Анализируя частотные компоненты, можно идентифицировать множество характеристик. В свою очередь, абсолютно любой аудиосигнал можно охарактеризовать распределением по частотному спектру. Для выполнения данной операции используется математический аппарат преобразований Фурье [5].

Преобразование Фурье – операция, сопоставляющая одной функции вещественной переменной другую функцию вещественной переменной. Эта новая функция описывает коэффициенты (амплитуды) при разложении исходной функции на элементарные составляющие – гармонические колебания с разными частотами. Графически результат разложения звукового сигнала в ряд Фурье можно изобразить в виде функции, характеризующей зависимость мощности сигнала (дБ) от его частоты (Гц).

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

                                  (3)

где: X[k] – частотный спектр сигнала;

представленный в виде вектора;

N – размер фрейма;

x[n] – координата вектора, в виде которого представлен наш фрейм.

Этап 3. Вычисление MFCC. После преобразования сигнала в частотное представление, необходимо извлечь из него наиболее «важные» части, которые улавливаются человеческим ухом. Именно по этим частям в будущем будет проводиться сравнение в соответствии с каким-либо словарем. Извлекаемые нами элементы называются коэффициентами MFCC (Mel Frequency Cepstral Coefficients), их другое название – MFCC-признаки. MFCC – инструмент для извлечения характеристик из заданного аудиосигнала [2].

Мел – единица высоты звука, основанная на восприятии этого звука органами слуха человека. Другими словами, это величина, показывающая, насколько звук определенной частоты является «значимым» для слушателя. Введение такой величины связано с определенными ограничениями восприятия человеческого слухового аппарата. Яркая иллюстрация тому – амплитудно-частотная характеристика человеческого уха (это зависимость амплитуды выходного сигнала некоторой системы от частоты ее входного сигнала). В случае с человеческим слуховым аппаратом данная характеристика будет выглядеть не как прямая линия, что говорит о том, что амплитуда сигнала не будет являться полностью точной мерой его громкости. В связи с этим, была введена эмпирически подобранная единица громкости – фон. Данная ситуация имеет место быть и в восприятии высоты звука человеческим ухом. Высота сигнала (для уха) не совсем линейно зависит от его частоты. Описать данную зависимость можно с помощью формулы [6]:

                                                                           (4)

где: m – мел;

f – численное обозначение частоты звукового сигнала в опр. момент времени.

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

Для того, чтобы разложить полученный ранее спектр по мел-шкале, потребуется создать «гребенку» мел-фильтров. Гребенчатый фильтр – электронный фильтр, такой, что при прохождении сигнала через этот фильтр, к сигналу добавляется сам этот сигнал с некоторой задержкой. Амплитудно-частотная характеристика гребенчатого фильтра состоит из ряда равномерно распределенных пиков, из-за чего она выглядит похожей на гребенку. В свою очередь, каждый мел-фильтр представляет собой треугольную оконную функцию, представленную в виде треугольника и позволяющую просуммировать количество энергии на определенном диапазоне частот. В последствии из этой суммы будет получен искомый мел-коэффициент. Иначе говоря, выбирается определенный участок функции, которой выражен наш сигнал (определенное окно), внутри этого окна находится количество энергии, затем результаты на всех таких участках суммируются. Особенностью MFCC преобразования является то, что количество вычисляемых мел-коэффициентов может быть ограничено любым значением (рекомендуемое количество коэффициентов – 10).

 

Рисунок 4. Пример построения мел-фильтров

 

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

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

                                                                      (5)

где: M – искомое кол-во MFCC-коэффициентов;

S[m] – мел-частотный спектральный коэффициент;

X[k] – частотный спектр сигнала;

Hm[k] – мел-фильтр;

N – размер фрейма.

На данном этапе у нас есть лишь мел-коэффициенты спектра (полное название – мел-частотные спектральные коэффициенты). Для того, чтобы получить именно мел-частотные кепстральные коэффициенты, иначе говоря, коэффициенты спектра от спектра, необходимо применить алгоритм дискретного косинусного преобразования [4].

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

                                                                (6)

при m в диапазоне [0; M-1], l в полуинтервале [0; M), где M – искомое кол-во MFCC-коэффициентов, C[l] – MFCC-коэффициент, S[m] - мел-частотный спектральный коэффициент.

Теперь для каждого фрейма имеется набор из М MFCC-коэффициентов, которые могут быть использованы для дальнейшего анализа.

Этап 4. Скрытые марковские модели. Звуковой файл был разбит по фреймам, фреймы были сгруппированы в слова, причем каждому фрейму соответствует набор из нескольких MFCC коэффициентов. На данном, заключительном этапе будет происходить распознавание слов. Производится распознавание с помощью Скрытых Марковских Моделей (СММ) [2].

Перед началом рассмотрения устройства СММ и их применения для распознавания речи, будет уместно обсудить модели в целом. Для описания сигналов часто нужны математические модели. В модели сигнала на основе его характеристик может быть предусмотрен определенный механизм обработки, который позволяет получить желаемый выход при анализе сигнала. Модели позволяют также генерировать и исследовать сигнал без его источника. В этом случае, имея под рукой хорошую модель, возможно имитировать сигнал и изучить его по этой имитации. Модели очень успешно применяются на практике, позволяя создавать эффективные рабочие системы: системы прогноза, распознавания, идентификации.  Все модели можно разделить на детерминистические и статистические. Детерминистические используются, если известны фундаментальные характеристики сигнала: что сигнал — это синусоидальная волна или, например, сумма экспонент. Второй тип — это статистические модели, которые, в соответствии со своим названием, базируются на статистических характеристиках сигнала. Статистические модели описывают сигнал как определённый случайный процесс, параметры которого могут быть качественно определены [7].

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

Для того, чтобы для имеющейся ситуации создать СММ, необходимо решить так называемые «3 основные задачи СММ» [7]:

  1. Необходимо вычислить вероятность того, что данная наблюдаемая нами последовательность построена именно для данной модели
  2. Необходимо подобрать последовательность состояний системы, которая лучше всего соответствует наблюдаемой последовательности, т. е. «объясняет» наблюдаемую последовательность
  3. Подобрать параметры модели системы таким образом, чтобы вероятность из пункта №1 была максимизирована

Пункт 1 является задачей оценки модели, которая заключается в вычислении вероятности того, что модель соответствует заданной наблюдаемой последовательности. К сути этой задачи можно подойти и с другой стороны: насколько выбранная СММ соответствует заданной наблюдаемой последовательности. Такой подход имеет большую практическую ценность. Например, если имеет место быть вопрос выбора наилучшей модели из набора уже существующих, то решение первой задачи дает нам ответ на этот вопрос.

Задача 2 — это задача, в которой происходит процесс осознания того, что же происходит в скрытой части модели, то есть поиск «правильной» последовательности, которую проходит модель. Совершенно ясно, что абсолютно точно нельзя определить эту последовательность. Здесь можно говорить лишь о предположениях с соответственной степенью достоверности. К сожалению, не существует единого критерия оценки для определения последовательности состояний. При решении второй задачи необходимо каждый раз принимать решение о том, какие показатели использовать. Данные, полученные при решении этой задачи, используются для изучения поведения построенной модели, нахождения оптимальной последовательности её состояний, для статистики и т. п.

Решение задачи 3 состоит в оптимизации модели таким образом, чтобы она как можно лучше описывала реальную наблюдаемую последовательность. Наблюдаемая последовательность, по которой оптимизируется СММ, принято называть обучающей последовательностью, поскольку с помощью нее модель «обучается». Задача обучения СММ — это важнейшая задача для большинства проектируемых СММ, поскольку она заключается в оптимизации параметров СММ на основе обучающей наблюдаемой последовательности, то есть создается модель, наилучшим образом описывающая реальные процессы.

Процесс обучения модели являет собой один из способов машинного обучения, а именно обучение с учителем. Для каждого слова из словаря проектируется СММ с состояниями. Обучение будет считаться завершенным, когда модель с высокой точностью будет воспроизводить ту самую последовательность MFCC-коэффициентов, которая использовалась для обучения модели. Таким образом, каждая отдельная СММ будет обучаться воспроизводить какое-либо одно слово, но с разными вариантами его произношения. Сперва решается 3-я задача СММ: каждая модель настраивается на «произнесение» определенного слова из словаря, согласно заданной точности. Для того, чтобы интерпретировать каждое состояние спроектированных моделей, мы решаем 2-ую задачу, а затем выделяем те свойства спектральных векторов, которые имеют наибольший вес для определенного состояния (MFCC-коэффициенты). Это момент тонкой настройки модели. А уже после того, как набор моделей будет спроектирован, оптимизирован и обучен, следует оценить модель на предмет ее способности распознавать слова в реальной жизни. Здесь мы уже решаем 1-ую задачу СММ. Далее мы вычисляем функцию соответствия этого тестового слова для каждой модели. Модель, для которой эта функция будет иметь наибольшее значение, будет считаться моделью названного слова.

Коэффициенты MFCC можно представить в виде некого «посредника» между звуком и текстом. С одной стороны, имеется словарь с текстовым представлением слов, причем каждому слову соответствует СММ с определенной последовательностью MFCC-признаков. С другой стороны – звуковой файл, в котором, в ходе выполнения программы, также вычисляются MFCC-признаки. Далее, с помощью СММ, последовательность входных коэффициентов сравнивается с последовательностями коэффициентов, хранящихся в словаре, и берется наиболее подходящая модель. Таким образом происходит сопоставление звукового произношения слова с его письменной формой.

Методы распознавания текста.

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

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

Заключение

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

 

Список литературы:

  1. В. Леонтьев Digital DJ. Запись и обработка музыки и звука: справочник пользователя. издательство «Олма-пресс», 2006 г. – 48 стр.
  2. П. Джоши Искусственный интеллект с примерами работы на Python, пособие. компьютерное издательство «Диалектика», 2019 г. – 448 стр.
  3. Цифровое кодирование звуковых сигналов. Учебное пособие. издательство «Корона-Принт», 2015 г. – 240 стр.
  4. Steve Renals Speech recognition. 1998 – 45p.
  5. Вестник Воронежского Государственного Университета (серия: системный анализ и информационные технологии), издательство «Воронежский Государственный Университет», 2012 г. – 173 стр.
  6. Xuedong Huang, Alex Acero, Hsiao-Wuen Hon, «Spoken Language Processing: A Guide to Theory, Algorithm, and System Development», Prentice Hall, 2001, -65 p.
  7. Статья «Скрытые марковские модели (СММ), статистическая модель. В области распознавания речи» - 2010 г. URLhttp://uc.org.ru/comment/reply/79)
Проголосовать за статью
Конференция завершена
Эта статья набрала 1 голос
Дипломы участников
У данной статьи нет
дипломов

Оставить комментарий

Форма обратной связи о взаимодействии с сайтом
CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.