Code Monkey home page Code Monkey logo

silero-tts-service's Introduction

Supports aarch64 Architecture Supports amd64 Architecture Supports armhf Architecture Supports armv7 Architecture Supports i386 Architecture MIT License

Silero TTS Service

Содержание

Информация

Данный проект я создал, чтобы обеспечить свой умный дом нормальным синтезом речи. Также, чтобы обеспечить rhasspy нормальным синтезом речи. Уже готовые решения меня не устроили и было решено изобрести свой велосипед. За основу были взяты модели Silero.

Вдохновился я проектом silero-ha-http-tts от Gromina. Он был сыроват и я решил сделать всё по уму разуму, с настройками и готовыми контейнерами.  

Установка сервера

Установка через Docker:

Выполните команду:

docker run -p 9898:9898 -m 1g -e NUMBER_OF_THREADS=4 -e LANGUAGE=ru -e SAMPLE_RATE=48000 --name tts_silero -d navatusein/silero-tts-service

Установка через Docker Compose:

Создайте файл docker-compose.yml и перенесите в него содержимое:

version: '3'

services:
  silero-tts-service:
    image: "navatusein/silero-tts-service"
    container_name: "silero-tts-service"
    deploy:
      resources:
        limits:
          memory: 1G
    ports:
      - "9898:9898"
    restart: unless-stopped
    environment:
      NUMBER_OF_THREADS: 4
      LANGUAGE: ru
      SAMPLE_RATE: 48000

Выполните команду:

docker-compose up

Настройки сервера

Все настройки сервера передаются как параметры окружения docker контейнеру при запуске.

Количество ядер для обработки речи NUMBER_OF_THREADS:

NUMBER_OF_THREADS: 4 

Количество потоков от 1 до количества ядер процессора сервера.
По умолчанию: 4

Язык синтеза речи LANGUAGE:

LANGUAGE: ru

По умолчанию: ru

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

Язык Код языка Поддерживаемые голоса
Русский ru aidar baya kseniya xenia eugene random
Українська uk mykyta random

Частота дискретизации SAMPLE_RATE:

SAMPLE_RATE: 48000 

Возможние значения: 48000, 24000, 8000
По умолчанию: 48000


Параметры утилиты sox SOX_PARAM:

SOX_PARAM: "reverb 50 50 10" # Добавляет эхо на речь

По умолчанию: Пустой

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

Ссылка на документацию утилиты sox: https://linux.die.net/man/1/sox


Исправление обрубания окончания фразы HA_FIX:

HA_FIX: True 

Может принимать значения: True False
По умолчанию: False

Исправляет ошибку, при которой Home Assistant не договаривает конец фразы. Добавляет секунду молчания в конец речи.


Настройка в Home Assistant

В файле configuration.yaml добавьте запись:

tts:
  - platform: marytts
    host: localhost # Адрес сервера
    port: 9898
    codec: WAVE_FILE
    voice: xenia # Имя голоса который хотите использовать.
    language: ru # Не используется. Настройки языка указываются в настройках сервера.

Настройка в Rhasspy Assistant

  1. В настройках, в разделе Text to Speech. Выберете модуль MarryTTS.
  2. Примените настройки Rhasspy Assistant (он перезагрузиться).
  3. Укажите адрес вашего сервера с путём /process.
  4. Нажмите на кнопку Refresh.
  5. В списке доступных голосов, выберите голос который вам нужно.
  6. Примените настройки Rhasspy Assistant (он перезагрузиться).

RhasspyConfig


Функциональные возможности

Нормализация цифр

Сервис умеет переводить цифры в текст.
Пример:

Текст с цифрой 1.

Нормализация Пример 1


Склонение существительных после цифры

Сервис умеет склонять существительных после цифр.
Для этого слово которое нужно склонить после цифры, возьмите в тег <d>слово</d>.
Пример:

У меня было 15 <d>яблоко</d>.

Склонение Пример 1

Если нужно склонить несколько слов, то каждое нужно брать в тег <d>слово</d> отдельно.

Мне осталось работать 15 <d>рабочий</d> <d>день</d>.

Склонение Пример 2


Произношение транслита

Сервис умеет произносить транслит.
Пример:

Lorem ipsum dolor sit amet.

Транслит Пример 1


SSML

С помощью SSML вы можете управлять паузами и просодией синтезированной речи.

<p>
  Когда я просыпаюсь, <prosody rate="x-slow">я говорю довольно медленно</prosody>.
  Потом я начинаю говорить своим обычным голосом,
  <prosody pitch="x-high"> а могу говорить тоном выше </prosody>,
  или <prosody pitch="x-low">наоборот, ниже</prosody>.
  Потом, если повезет – <prosody rate="fast">я могу говорить и довольно быстро.</prosody>
  А еще я умею делать паузы любой длины, например две секунды <break time="2000ms"/>.
  <p>
    Также я умею делать паузы между параграфами.
  </p>
  <p>
    <s>И также я умею делать паузы между предложениями</s>
    <s>Вот например как сейчас</s>
  </p>
</p>

SSML Пример 1


Endpoints

  • GET /clear_cache - Очищает кэш уже синтезированных сообщений.
  • GET /settings - Возвращает текущие настройки сервера.
  • GET /voices - Возвращает список доступных голосов для выбранного языка.
  • GET /process?VOICE=[Выбраный голос]&INPUT_TEXT=[Текст для обработки] - Возвращает аудио файл синтезированной речи.
  • POST /process в теле запроса VOICE=[Выбраный голос], INPUT_TEXT=[Текст для обработки] - Возвращает аудио файл синтезированной речи.

Вывод звука на Bluetooth колонку

  1. Если Home Assistant как основная ОС (HAOS), то читаем эту документацию TTS Bluetooth Speaker for Home Assistant
  2. Если Home Assistant стоит на Debian, то делаем следующее:

Отредактируем client.conf

nano /etc/pulse/client.conf

Добавим следующее:

default-server = unix:/usr/share/hassio/audio/external/pulse.sock
autospawn = no

ClientConf

Перезапускаем pulseaudio.

pulseaudio -k && pulseaudio --start

Ставим аддон Mopidy версии Current version: 2.1.1 и ставим только эту версию. Mopidy 2.2.0 не ставить - она сломанная. Подробнее про поломанную версию Mopidy 2.2.0 читать здесь.

Добавляем в configuration.yaml

media_player:
  - platform: mpd
    name: "MPD Mopidy"
    host: localhost
    port: 6600

Перезагружаем Home Assistant полностью, чтобы перезагрузился сам Debian.

RebootHa

Подключаем bluetooth колонку к Debian, kb,j через GUI, либо через консоль используя команду bluetoothctl

Включим bluetooth:

power on

Запуск сканирования девайсов:

scan on

Как увидели свой девайс, спариваемся с устройством:

pair [mac адрес девайса]

Подключаемся к устройству:

connect [mac адрес девайса]

Добавляем устройство в доверенные:

trust [mac адрес девайса]

Далее, как добавлен bluetooth девайс то в двух аддонов Rhasspy Assistant и Mopidy нужно указать источник вывода звука bluetooth девайса:

  1. В Rhasspy Assistant указываем так:

RhasspyAssistantConfig

  1. В Mopidy указываем так:

MopidyConfig

Проверяем работоспособность:

TtsSay

Код:

service: tts.marytts_say
data:
  entity_id: media_player.mpd_mopidy
  message: >-
    Спустя 15 лет жизнь некогда бороздившего космические просторы Жана-Люка
    Пикара

silero-tts-service's People

Contributors

navatusein avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

silero-tts-service's Issues

SAMPLE_RATE: 16000

Здравствуйте!

Частота дискретизации SAMPLE_RATE:
SAMPLE_RATE: 48000
Возможние значения: 48000, 24000, 8000
По умолчанию: 48000

Добавьте, пожалуйста, значение в 16000.
Все ESP satellite rhasspy юзают как раз 16000.

.HA_FIX contains true

Приветствую!

Исправление обрубания окончания фразы HA_FIX:
HA_FIX: True

services.silero-tts-service.environment.HA_FIX contains true, which is an invalid type, it should be a string, number, or a null
Работает только
HA_FIX: 1
HA_FIX: 0
Но, как показалось, не факт, что оно работает.

HA assist

Приветствую!

А не замахнуться ли на что-то более глобальное и упрощающее жизнь и убрать прослойку в виде Rhasspy Assistant?
К примеру есть https://www.home-assistant.io/docs/assist/ или REST API от HA...

Как думаете?

Согласование склонений

Привет.

Нашел такую проблему. Склонение чисел не всегда согласуется со следующими после них существительными.

1 <d>минута</d>      один минута
2 <d>минута</d>      два минута
3 <d>минута</d>      три минуты
41 <d>минута</d>    сорок один минута
44 <d>минута</d>    сорок четыре минуты

Start with CUDA

Добрый день для запуска с CUDA достаточно использовать ранее установленный pytorch с CUdA? или логика в коде не позволит его юзать ?

Добавить управление громкостью

Спасибо за сервис!
Было бы здорово добавить управляющий yaml код по управлению громкостью воспроизведения, по аналогии с другими TTS в Home Assistant, пример:

service: tts.marytts_say
data: 
  entity_id: media_player.player
  volume_level: 0.3
  message: >-
    Спустя 15 лет жизнь некогда бороздившего космические просторы Жана-Люка
    Пикара

Спасибо!

Выводить данные о скачивание и установки зависимостей в лог докера

Здравствуйте!

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

INFO [2022-12-25 12:35:14,343] Starting updating
INFO [2022-12-25 12:35:15,321] Update requirements
Collecting torch==1.13.1
  Downloading torch-1.13.1-cp310-cp310-manylinux1_x86_64.whl (887.5 MB)

и висит уже некоторое время.
То есть малоинформативно.

Дополнено:
Я имею ввиду отображать % того, что скачивается.
Но, кроме того, как мне кажется, философия докера - работа из коробки - немного нарушается. ИМХО

Инструкция: Как вывести звук на bluetooth колонку?

Спасибо вам за эту интеграцию с нормальным синтезом речи. Хотел бы добавить мануал как добавить вывод звука, если имеется bluetooth колонка. Все дело в том, что в документации пишется, что надо добавить в configuration.yaml и это конечно работает, но при выборе объекта, куда будем выводить звук может не оказаться bluetooth колонки. Я долго искал решение и нашел. Думаю, что, кто с этим столкнется, это будет полезным и сократит время.

tts:
  - platform: marytts
    host: localhost # Адрес сервера
    port: 9898
    codec: WAVE_FILE
    voice: xenia # Имя голоса который хотите использовать.
    language: ru # Не используется. Настройки языка указываются в настройках сервера.
  1. Если Home Assistant как основная ОС (HAOS), то читаем эту документацию TTS Bluetooth Speaker for Home Assistant

  2. Если Home Assistant стоит на Debian, то делаем следующее

Отредактируем client.conf

nano /etc/pulse/client.conf

Добавим следующее

default-server = unix:/usr/share/hassio/audio/external/pulse.sock
autospawn = no

image

Перезапускаем pulseaudio

pulseaudio -k && pulseaudio --start

Ставим аддон Mopidy версии Current version: 2.1.1 и ставим только эту версию. Mopidy 2.2.0 не ставить - она сломанная. Подробнее про поломанную версию Mopidy 2.2.0 читать здесь

Добавляем в configuration.yaml

#MPD music player daemon
media_player:
  - platform: mpd
    name: "MPD Mopidy"
    host: localhost
    port: 6600

Перезагружаем Home Assistant полностью, чтобы перезагрузился сам Debian
image

Подключаем bluetooth колонку к Debian, kb,j через GUI, либо через консоль используя команду bluetoothctl

Включим bluetooth

power on

Запуск сканирования девайсов

scan on

Как увидели свой девайс, спариваемся с устройством

pair mac адрес девайса

Подключаемся к устройству

connect mac адрес девайса

Добавляем устройство в доверенные

trust  mac адрес девайса

Далее, как добавлен bluetooth девайс то в двух аддонов Rhasspy Assistant и Mopidy нужно указать источник вывода звука bluetooth девайса

  1. В Rhasspy Assistant указываем так
    image

  2. В Mopidy указываем так
    image

После этого открываем Панель разработчика => Службы
Вид в текстовом файле
image

service: tts.marytts_say
data:
  entity_id: media_player.mpd_mopidy
  message: >-
    Спустя 15 лет жизнь некогда бороздившего космические просторы Жана-Люка
    Пикара

Вид в GUI
image

У меня было 15 <d>яблоко</d>

Здравствуйте!

Великолепная работа!

Однако, пока не удалось испробовать склонение.
Ubuntu 22, docker, amd64

Просто ничего не происходит. Ксения сообщает, что "У меня было 15". О яблоках - ни слова
/process?INPUT_TYPE=TEXT&OUTPUT_TYPE=AUDIO&AUDIO=WAVE&LOCALE=&INPUT_TEXT=У меня было 15 <d>яблоко</d>&VOICE=xenia

Может в настройках надо что-то инициировать?

Спасибо!

Дополнено:
Выловил вот такую ошибку:
<torch_package_0>.multi_acc_v3_package.py:196: UserWarning: Current model doesn't support SSML tag: d warnings.warn(f"Current model doesn't support SSML tag: {child.tag}")

Использование памяти

Здравствуйте!

Несколько дней работает контейнер без особого использования. 1.3GB не слишком ли много?

$ docker stats
CONTAINER ID   NAME                 CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O         PIDS
b92407531c1d   silero-tts-service   0.42%     1.301GiB / 3.681GiB   35.34%    62.9MB / 11.5MB   199MB / 184MB     11
...
9909ca915b28   rhasspy              27.89%    622.7MiB / 3.681GiB   16.52%    24.8GB / 1.48GB   1.21GB / 1.29GB   55

Расширить до мультивойса ?

Обновил модели силеро и код ниже ,

    silero_settings = {
        'ru': {
            'model_link': 'https://models.silero.ai/models/tts/ru/v4_ru.pt',
            'model_name': 'silero_model_v4.pt',
            'speakers': [
                'aidar', 'baya', 'kseniya', 'xenia', 'eugene', 'random'
            ]
        },
        'en': {
            'model_link': 'https://models.silero.ai/models/tts/en/v3_en.pt',
            'model_name': 'v3_en.pt',
            'speakers': [
                'lj', 'random'
            ]
        },
        'multi': {
            'model_link': 'https://models.silero.ai/models/tts/multi/v2_multi.pt',
            'model_name': 'v2_multi.pt',
            'speakers': [
                'irina', 'random'
            ]
        }

    }

Хочу использовать мультивойс от Silero team, сыпется

root@oc2:/ai/Silero-TTS-Service# /usr/bin/python3 -u ./main.py
Traceback (most recent call last):
  File "/ai/Silero-TTS-Service/./main.py", line 5, in <module>
    from app.logger import LogConfig
  File "/ai/Silero-TTS-Service/app/logger.py", line 5, in <module>
    class LogConfig(BaseModel):
  File "/usr/local/lib/python3.10/dist-packages/pydantic/_internal/_model_construction.py", line 92, in __new__
    private_attributes = inspect_namespace(
  File "/usr/local/lib/python3.10/dist-packages/pydantic/_internal/_model_construction.py", line 384, in inspect_namespace
    raise PydanticUserError(
pydantic.errors.PydanticUserError: A non-annotated attribute was detected: `LOGGER_NAME = 'uvicorn'`. All model fields require a type annotation; if `LOGGER_NAME` is not meant to be a field, you may be able to resolve this error by annotating it as a `ClassVar` or updating `model_config['ignored_types']`.

В питоне ообще почти 0 , поправить быстро не удалось. Я правильно понимаю что чтото надо переписать под pydantic. 2.6 ?

Thanks!

Очень хочу поблагодарить. Этот проект появился на гитхабе удивительно вовремя, я как раз ломал голову, пытаясь каким-нибудь образом прикрутить Silero к Home Assistant (и у меня ничего не получалось).

Единственное, что было не очевидно, и о чем хочется упомянуть чтобы сэкономить кому-нибудь время:
подключение к Rhasspy настраивается в модуле MaryTTS.

2022-12-21_12-21

Не видит пути при запуске через вирт. окружение venv\conda python.

Я уж и менял на абсолютные и так и эдак - не понимаю как он формирует путь или что не так с ошибкой.
Файлы в папке не создаются.
(а если запускать без вирт окружения то создаются, но кстати потом не чистятся, вроде должны ?)
А без вирт окружения - у остальных пакетов зависимости слетают.
Если подпаку audios удалить - приложение ее корректно создаст и создат там temp.wav

INFO [2024-02-05 13:58:10] Time spent on the process: 3.8143470287323
INFO [2024-02-05 13:58:10] 192.168.0.44:33888 - "POST /process HTTP/1.1" 500
ERROR [2024-02-05 13:58:10] Exception in ASGI application
Traceback (most recent call last):
File "/opt/conda/envs/silero/lib/python3.10/site-packages/uvicorn/protocols/http/h11_impl.py", line 407, in run_asgi
result = await app( # type: ignore[func-returns-value]
File "/opt/conda/envs/silero/lib/python3.10/site-packages/uvicorn/middleware/proxy_headers.py", line 78, in call
return await self.app(scope, receive, send)
File "/opt/conda/envs/silero/lib/python3.10/site-packages/uvicorn/middleware/message_logger.py", line 86, in call
raise exc from None
File "/opt/conda/envs/silero/lib/python3.10/site-packages/uvicorn/middleware/message_logger.py", line 82, in call
await self.app(scope, inner_receive, inner_send)
File "/opt/conda/envs/silero/lib/python3.10/site-packages/fastapi/applications.py", line 270, in call
await super().call(scope, receive, send)
File "/opt/conda/envs/silero/lib/python3.10/site-packages/starlette/applications.py", line 124, in call
await self.middleware_stack(scope, receive, send)
File "/opt/conda/envs/silero/lib/python3.10/site-packages/starlette/middleware/errors.py", line 184, in call
raise exc
File "/opt/conda/envs/silero/lib/python3.10/site-packages/starlette/middleware/errors.py", line 162, in call
await self.app(scope, receive, _send)
File "/opt/conda/envs/silero/lib/python3.10/site-packages/starlette/middleware/exceptions.py", line 79, in call
raise exc
File "/opt/conda/envs/silero/lib/python3.10/site-packages/starlette/middleware/exceptions.py", line 68, in call
await self.app(scope, receive, sender)
File "/opt/conda/envs/silero/lib/python3.10/site-packages/fastapi/middleware/asyncexitstack.py", line 21, in call
raise e
File "/opt/conda/envs/silero/lib/python3.10/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in call
await self.app(scope, receive, send)
File "/opt/conda/envs/silero/lib/python3.10/site-packages/starlette/routing.py", line 706, in call
await route.handle(scope, receive, send)
File "/opt/conda/envs/silero/lib/python3.10/site-packages/starlette/routing.py", line 276, in handle
await self.app(scope, receive, send)
File "/opt/conda/envs/silero/lib/python3.10/site-packages/starlette/routing.py", line 69, in app
await response(scope, receive, send)
File "/opt/conda/envs/silero/lib/python3.10/site-packages/starlette/responses.py", line 334, in call
raise RuntimeError(f"File at path {self.path} does not exist.")
RuntimeError: File at path ./audios/xenia-5439322806554fc5d84099e7cd753769ad77b4c5d0dacd52939878066d5a9af2737659fd2a721bf764990c15aa377f43b472cbb8fe7f695243d1c6f376bd2d6e.wav does not exist.

Failed to parse SSML

Приветствую!

Периодически(!) возникает проблема парсинга SSML.
Причем возникает без какой-либо закономерности.

Exception in ASGI application
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/uvicorn/protocols/http/h11_impl.py", line 407, in run_asgi
    result = await app(  # type: ignore[func-returns-value]
  File "/usr/local/lib/python3.10/site-packages/uvicorn/middleware/proxy_headers.py", line 78, in __call__
    return await self.app(scope, receive, send)
  File "/usr/local/lib/python3.10/site-packages/uvicorn/middleware/message_logger.py", line 86, in __call__
    raise exc from None
  File "/usr/local/lib/python3.10/site-packages/uvicorn/middleware/message_logger.py", line 82, in __call__
    await self.app(scope, inner_receive, inner_send)
  File "/usr/local/lib/python3.10/site-packages/fastapi/applications.py", line 270, in __call__
    await super().__call__(scope, receive, send)
  File "/usr/local/lib/python3.10/site-packages/starlette/applications.py", line 124, in __call__
    await self.middleware_stack(scope, receive, send)
  File "/usr/local/lib/python3.10/site-packages/starlette/middleware/errors.py", line 184, in __call__
    raise exc
  File "/usr/local/lib/python3.10/site-packages/starlette/middleware/errors.py", line 162, in __call__
    await self.app(scope, receive, _send)
  File "/usr/local/lib/python3.10/site-packages/starlette/middleware/exceptions.py", line 79, in __call__
    raise exc
  File "/usr/local/lib/python3.10/site-packages/starlette/middleware/exceptions.py", line 68, in __call__
    await self.app(scope, receive, sender)
  File "/usr/local/lib/python3.10/site-packages/fastapi/middleware/asyncexitstack.py", line 21, in __call__
    raise e
  File "/usr/local/lib/python3.10/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in __call__
    await self.app(scope, receive, send)
  File "/usr/local/lib/python3.10/site-packages/starlette/routing.py", line 706, in __call__
    await route.handle(scope, receive, send)
  File "/usr/local/lib/python3.10/site-packages/starlette/routing.py", line 276, in handle
    await self.app(scope, receive, send)
  File "/usr/local/lib/python3.10/site-packages/starlette/routing.py", line 66, in app
    response = await func(request)
  File "/usr/local/lib/python3.10/site-packages/fastapi/routing.py", line 235, in app
    raw_response = await run_endpoint_function(
  File "/usr/local/lib/python3.10/site-packages/fastapi/routing.py", line 161, in run_endpoint_function
    return await dependant.call(**values)
  File "/usr/app/app/handlers.py", line 44, in process
    audio_file = get_tts_file(text, speaker, settings.sample_rate, sox_params=settings.sox_param)
  File "/usr/app/app/tts.py", line 41, in get_tts_file
    model.save_wav(ssml_text=text, speaker=speaker, audio_path=temp_file_path, sample_rate=sample_rate)
  File "<torch_package_0>.multi_acc_v3_package.py", line 366, in save_wav
    audio = self.apply_tts(text=text,
  File "<torch_package_0>.multi_acc_v3_package.py", line 316, in apply_tts
    sentences, clean_sentences, break_lens, prosody_rates, prosody_pitches, sp_ids = self.prepare_tts_model_input(input_text,
  File "<torch_package_0>.multi_acc_v3_package.py", line 61, in prepare_tts_model_input
    clean_text_list = self.process_ssml(text)
  File "<torch_package_0>.multi_acc_v3_package.py", line 113, in process_ssml
    raise ValueError(f"Failed to parse SSML: {e}")
ValueError: Failed to parse SSML: invalid literal for int() with base 10: 'двадцать0'

Start text processing: <speak>Текущее время двадцать часов <break time='100ms'/> двадцать одна минута <break time='двадцать0ms'/></speak>

Изначально - <break time='200ms'/>

Думал, что HA чудит, перепробовал многие варианты кавычек и экранирования. Но закономерности так и не уловил.

Could not initialize NNPACK!

Приветствую!
При запуске контейнера получаем [W NNPACK.cpp:80] Could not initialize NNPACK! Reason: Unsupported hardware

Предположение:
USE_NNPACK=0 ?
Может стоит вынести в environment?

Голос valeria не работает на ru языке

Голос Valeria указан в списке доступных в боте @silero_voice_bot, но при попытке вызова TTS получаю такую ошибку:

ERROR Invalid speaker: speaker valeria not supported by this language

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.