1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/Haskely-WebASR

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Это зеркальный репозиторий, синхронизируется ежедневно с исходного репозитория.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

WebASR

Проект распознавания речи на основе TensorFlowJS и WebAudioAPI для веб-версии.

  • Версия v0.1.0 завершена! Реализованы все основные функции, связанные с разработкой, теперь можно заняться исследованием модели.
  • Посмотреть DEMO: https://haskely.github.io/WebASR
  • (Доступ в Китае: https://haskely.gitee.io/webasr) Скриншот WebASR [TOC]

Введение - 介绍

  • Проект распознавания речи для веб-браузера на основе JavaScript, HTML, без использования CSS, Node.js или фреймворков.
  • Все операции выполняются локально: построение спектрограмм, вычисление частотных характеристик, распознавание речи!
  • Поддерживает запись звука в реальном времени или загрузку аудиофайлов.
  • Код должен быть расширяемым.

Использование - 用法

Установка - 自己部署

  • Просто поместите все файлы проекта в любой доступный каталог, это статическая веб-страница.
  • (Сохраните относительные пути файлов в проекте).
  • (Из-за мер безопасности браузера необходимо запускать index.html через HTTP-сервер, а не напрямую).

Разработка - 开发

1. Простая разработка

Основные параметры конфигурации

  • Откройте файл main.js в корне проекта, найдите комментарий //基础配置, следуйте инструкциям по настройке параметров.
//基础配置
const numberOfChannels = 1, bufferSize = 256, total_duration = 10;
const sampleRate = 8000, fft_s = 0.032, hop_s = 0.008;
const ModelDir = './ASR/Model/Network/tensorflowjs/tfjsModel/tfjs_mobilev3small_thchs30/';
const minPinYinN = 10;
const useWebWorker = true;
...
//配置完毕
  • Если ваше аудио имеет стереофонический формат (два канала), то значение переменной numberOfChannels будет равно 2.
  • В физическом смысле звук — это колебания воздуха, поэтому его можно представить в виде графика, который показывает изменение амплитуды колебаний во времени. В цифровом формате аудиоданные представляют собой массив чисел, где каждое число представляет амплитуду колебаний в определённый момент времени. Индекс массива соответствует моменту времени. Таким образом, количество элементов в массиве за одну секунду соответствует частоте дискретизации. Обычно она составляет 8000 отсчётов в секунду.
  • При обработке аудиоданных программа не обрабатывает каждый элемент массива отдельно, а работает с небольшими фрагментами данных. Размер такого фрагмента определяется переменной bufferSize, которая обычно равна 256. Это означает, что программа обрабатывает 256 элементов массива за один раз. Если частота дискретизации составляет 8000 отсчетов в секунду, то обработка 256 отсчётов займёт 0,032 секунды.
  • Для преобразования аудиосигнала в частотный спектр необходимо задать значения fft_s и hop_s. Обычно hop_s равен 1/4 от fft_s, что обеспечивает плавный переход между окнами преобразования. Выбор значений fft_s влияет на разрешение по времени и частоте. Чем меньше fft_s, тем выше разрешение по времени, но ниже разрешение по частоте. И наоборот, чем больше fft_s, тем ниже разрешение по времени, но выше разрешение по частоте. Эти два параметра взаимоисключающие, и их нужно настраивать в зависимости от требований. Подробнее о них можно узнать в разделе «Короткое преобразование Фурье».
  • numberOfChannels: количество каналов аудио. Целое число, по умолчанию 1. Максимальное значение — 32.

  • bufferSize: размер буфера в кадрах. Должен быть одним из следующих значений: 0, 256, 512, 1024, 2048, 4096, 8192, 16384. Если установлено значение 0, система автоматически выбирает размер. В этом случае частота обновления кадров равна sampleRate / bufferSize.

  • total_duration: общая длительность аудио в секундах.


  • sampleRate: частота дискретизации в отсчетах в секунду. Может принимать значения 8000, 16000, 32000 или 48000.

  • fft_s: длина окна преобразования Фурье в секундах.

  • hop_s: интервал между окнами преобразования в секундах.

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


  • ModelDir: папка с моделями TensorflowJS. Внутри неё должны находиться файлы model.json, feature.json и несколько файлов .bin.
  • minPinYinN: целое положительное число, определяющее минимальную длину аудиофрагмента для потокового вывода. Если установить значение 4, модель будет выводить 4 фрагмента пиньинь и сохранять два средних фрагмента. При следующем выводе перекрытие фрагментов составит 4/2 = 2, так что будут сохранены два средних фрагмента из предыдущего вывода.
  • useWebWorker: использовать асинхронную обработку модели или нет. Если значение равно false, вывод модели синхронизируется с обновлением аудио, что может привести к задержкам, но гарантирует непрерывность воспроизведения. Если значение true, вывод модели выполняется асинхронно, что позволяет избежать задержек, но может привести к накоплению задержки (до 8 секунд вначале, затем быстро уменьшается до 0,5–2 секунд).

В разделе //配置完毕 после создания экземпляра AudioFlow можно настроить дополнительные параметры. Например, если вы не хотите, чтобы звук воспроизводился через динамики, измените строку new AudioFlow(..., 'sound'); на new AudioFlow(..., null);

Конфигурацию можно найти в комментариях к каждому классу.

Настройка модели

  • Используйте проект DeepASR, чтобы преобразовать модель в формат TensorflowJS Graph Model. Этот формат включает в себя следующие файлы:

    TFJSModelDir
    │  feature.json
    │  group1-shard1of4.bin
    │  group1-shard2of4.bin
    │  group1-shard3of4.bin
    │  group1-shard4of4.bin
    │  model.json
  • Скопируйте эту папку в подкаталог проекта и укажите путь к ней в переменной ModelDir в файле main.js.

    Например, я скопировал папку TFJSModel в каталог /WebASR/Models/TFJSModel, где WebASR — корневой каталог проекта.

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

    //基础配置
    ...
    const ModelDir = './Models/TFJSModel/';
    ...

    Вы можете также создать свою модель TensorflowJS, изучив формат входных и выходных данных модели и документацию TensorflowJS. ``` const audioFlowProcesser = new AudioFlowProcesser( null, // audioSource = null, 暂不指定音频源。 'sound', //audioDestination = 'sound', 音频会输出到扬声器 8000, //sampleRate = 8000, 指定采样率为8000 undefined, //latencyHint = undefined, 不指定latencyHint,让系统自动选择 256, //ScriptNode_bufferSize = 256, 缓冲区大小为256(采样帧),结合上面指定采样率为8000,得到音频刷新帧率为8000/256 = 31.25 FPS。 1, //ScriptNode_numberOfInputChannels = 1, 声道数为1。 processAudioData = (audioData) => { const audioClipInfo = { "音频采样率":audioData.sampleRate , "音频数据":audioData.channels , "音频末尾时间戳":audioData.audioEndTime ,

          "音频声道数":audioData.numberOfChannels ,
          "音频帧数":audioData.sampleLength ,
          "音频时长":audioData.timeLength ,
          "音频开头时间戳":audioData.audioStartTime 
      };
      console.log(`收到音频小片段:${audioClipInfo}`);

    }, );

async function addMicrophone(){ const recordStream = await navigator.mediaDevices.getUserMedia( {audio: true}); //开启麦克风 audioFlowProcesser.addAudioSource(recordStream); //audioFlowProcesser加入麦克风音频源 };

audioFlowProcesser.open(); audioFlowProcesser.start();

addMicrophone();


Если указано, bufferSize должен быть одним из следующих значений: 256, 512, 1024, 2048, 4096, 8192 или 16384. Если не передано или значение равно нулю, реализация выберет оптимальный размер буферной зоны для данной среды. В течение всего жизненного цикла узла этот размер будет равен степени двойки. Это значение контролирует частоту распределения событий audioprocess и количество кадров выборки, которые необходимо обработать при каждом вызове. Меньший размер буфера приведёт к меньшему (лучшему) времени задержки. Более высокие значения необходимы для предотвращения разделения звука и сбоев. Рекомендуется не указывать этот размер буферной зоны, а позволить реализации выбрать хороший размер буферной зоны для баланса между задержкой и качеством звука.

**AudioFlow**

AudioFlow — это дальнейшее расширение AudioProcesser, добавляющее множество полезных функций, таких как рисование потоковых аудиосигналов, потоковые вычисления кратковременного преобразования Фурье и построение графиков, а также вызов моделей распознавания речи для вывода. Его внутренняя логика основана на событиях. Каждый раз, когда функция processAudioData в AudioProcesser получает фрагмент audioData, она запускает соответствующее событие и начинает выполнять последующие процессы обработки, такие как построение графика и объединение, обновление всего графика сигнала; если включено вычисление спектра, то каждый раз, когда вычисляется часть спектра, запускается соответствующее событие, и можно настроить последующие процессы обработки.

API-интерфейсы включают:
* openAudio — начать приём аудио;
* keepAudio — сохранить недавно полученный звук;
* openWaveDraw — начать рисовать аудиосигнал;
* openStft — начать вычислять кратковременный спектр Фурье аудиосигнала;
* keepStft — сохранить часть спектра;
* openStftDraw — начать строить график спектра;
* openASR — начать распознавание речи;
* keepASR — сохранить вывод распознавания речи за определённый период времени;
* openASRDraw — построить график вывода распознавания речи;
* openVoiceWakeUp (в разработке) — включить функцию пробуждения по голосу.

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

Пример: пример — main.js, этот проект напрямую основан на структуре AudioFlow.

Конструктор класса AudioFlow:
```javascript
class AudioFlow extends AudioFlowProcesser {
    constructor(
        audioSource = null,
        sampleRate = 8000,
        numberOfChannels = 1,
        ScriptNode_bufferSize = 256,
        audioDestination = 'sound',
    ) {...};
    ...
};
  • @param {AudioNode|AudioBuffer|Blob|MediaElement|MediaStream|null} audioSource — объект источника звука, который может быть одним из пяти типов. По умолчанию — null, источник звука не указан. Можно динамически указать после создания экземпляра, вызвав this.addAudioSource.
  • @param {float|undefined} sampleRate — используется для sampleRate AudioContext, указывается в количестве выборок в секунду. Значение должно быть числом с плавающей запятой, указывающим используемую частоту дискретизации для нового контекста; кроме того, значение должно быть допустимым значением для AudioBuffer.sampleRate. Если значение не указано, используется предпочтительная частота дискретизации устройства вывода по умолчанию.
  • @param {int} numberOfChannels — целое число, указывающее количество входных каналов этого узла, по умолчанию — 1. Поддерживаемые значения — до 32.
  • @param {int|undefined} ScriptNode_bufferSize — размер буферной области в кадрах выборки. По умолчанию 256. Если указано, bufferSize должно быть одним из значений: 256, 512, 1024, 2048, 4096, 8192, 16384. Если параметр не передан или равен нулю, реализация выбирает оптимальный размер буферной зоны для текущей среды, и этот размер остаётся степенью двойки в течение всего жизненного цикла узла. Этот параметр управляет частотой распределения событий audioprocess, а также количеством кадров выборки, обрабатываемых при каждом вызове. Меньшие размеры буфера приводят к меньшей (лучшей) задержке, более высокие значения необходимы, чтобы избежать разделения звука и ошибок. Рекомендуется не задавать этот размер буфера, позволяя реализации выбирать хороший размер буфера для балансировки задержки и качества звука.
  • @param {'sound'|'stream'|'asAudioNode'|AudioNode|null} audioDestination — место назначения звука, куда выводить звук.
  1. 'sound' — вывод на динамики.
  2. 'stream' — вывод в поток, получить этот stream можно, вызвав this.audioDestination.
  3. 'asAudioNode' — создать AudioNode, можно продолжить подключение других AudioNodes. Вызвать this.audioDestination, чтобы получить этот AudioNode.
  4. AudioNode — передать AudioNode и подключить его.
  5. null — не выполнять никакого вывода.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Проект по распознаванию речи для веб-версии. Расширить Свернуть
GPL-3.0
Отмена

Обновления (1)

все

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://gitlife.ru/oschina-mirror/Haskely-WebASR.git
git@gitlife.ru:oschina-mirror/Haskely-WebASR.git
oschina-mirror
Haskely-WebASR
Haskely-WebASR
master