Озвучка статей локальной TTS моделью
от aNNiMON
Я люблю читать статьи, но, к сожалению, после рабочего дня за компьютером, что-либо читать уже не так приятно, ведь зрение почти на пределе. Чтобы продолжить любимое занятие, не напрягая глаза, я даже выделил для этой цели отдельный браузер — Microsoft Edge — в нём хорошая встроенная читалка и широкий набор голосов. Недостаток в том, что это онлайн голоса и их нельзя просто записать в аудио-файл, чтобы потом послушать, не открывая статью.

Так выглядит и звучит онлайн читалка в Edge с голосом Emma en-US online.
Под капотом Microsoft Edge использует голоса из Microsoft Azure. В Azure этот набор ещё больше и Speech Service позволяет некоторым голосам указывать настроение (приветливость, раздражение, забота, грусть, шепот). Для ценителей ASMR, модель en-US JennyNeural whispering:
Azure Speech Service классный, но платный и медленный — нам такое не подходит, идём дальше.
sherpa-onnx
sherpa-onnx — это набор инструментов для конвертации голоса в текст и обратно. Он бесплатный, оффлайн и не требователен к ресурсам. Модели занимают мало места и могут быть установлены даже на смартфон (об этом дальше).
Можно послушать онлайн: https://huggingface.co/spaces/k2-fsa/text-to-speech
Там много языков, но самые хорошие — английские.
Для общего использования мне понравился vits-piper-en_US-hfc_female-medium:
А для ASMR — kokoro v1.0 af_nicole:
Он даже лучше, чем в Azure! Но более медленный по сравнению с piper моделью.
Установка
Отсюда sherpa-onnx/releases нужно скачать бинарники под свою платформу, например sherpa-onnx-version-win-x64-shared.tar.bz2, распаковать из этого архива папку bin в отдельную папку sherpa.
Со страницы модели, например, vits-piper-en_US-hfc_female-medium, в секции "Model download address" нужно скачать архив и распаковывать в ранее созданную папку sherpa. Файл .onmx можно для удобства переименовать в model.onnx
Пример структуры папки sherpa:
Скрипты
Дабы не заморачиваться с прописыванием параметров, пропишем их в скрипте. Параметры немного отличаются для vits-* и kokoro моделей, поэтому приведу два скрипта.
Windows
Первый, для vits-piper модели, назовём tts-hfc.ps1
Для kokoro модели (--sid выбирает порядковый номер голоса, там их много), tts-kokoro.ps1
В обоих скриптах необходимо указать свой путь к папке sherpa, после чего оба скрипта закинуть в sherpa/bin и добавить в PATH.
Запускать так:
Или передав текстовый файл:
Unix (Bash)
Для vits-piper модели, tts-hfc
И для kokoro, файл tts-kokoro
Запуск:
Если не нужно автоматическое проигрывание, то можно заменить в скриптах
sherpa-onnx-offline-tts-play на sherpa-onnx-offline-tts, тогда будет только генерирование аудио.
Установка (Android)
На странице модели, например, vits-piper-en_US-hfc_female-medium, есть секция Android APK. Или тут весь список: https://k2-fsa.github.io/sherpa/onnx/tts/apk-engine.html
Ставим apk, и модель появится в списке системных голосов. Само приложение оснащено формой для вставки текста, так что можно озвучивать и в нём.

Главный недостаток: можно установить только одну модель. Если ставить другую, то приложение обновляется. Но лечится клонированием приложения.
Получение текста статей
Самый простейший вариант — установить python-модуль trafilatura.
С ним ставится и бинарник trafilatura (документация):
Связываем всё вместе
Powershell:
Bash:
Дальше можно внедрить ffmpeg и конвертировать wav в mp3/opus, автоматически переименовывать результат в зависимости от URL и времени, вшивать текст статьи в аудио-файл и многое другое.

Так выглядит и звучит онлайн читалка в Edge с голосом Emma en-US online.
Под капотом Microsoft Edge использует голоса из Microsoft Azure. В Azure этот набор ещё больше и Speech Service позволяет некоторым голосам указывать настроение (приветливость, раздражение, забота, грусть, шепот). Для ценителей ASMR, модель en-US JennyNeural whispering:
Azure Speech Service классный, но платный и медленный — нам такое не подходит, идём дальше.
sherpa-onnx
sherpa-onnx — это набор инструментов для конвертации голоса в текст и обратно. Он бесплатный, оффлайн и не требователен к ресурсам. Модели занимают мало места и могут быть установлены даже на смартфон (об этом дальше).
Можно послушать онлайн: https://huggingface.co/spaces/k2-fsa/text-to-speech
Там много языков, но самые хорошие — английские.
Для общего использования мне понравился vits-piper-en_US-hfc_female-medium:
А для ASMR — kokoro v1.0 af_nicole:
Он даже лучше, чем в Azure! Но более медленный по сравнению с piper моделью.
Установка
Отсюда sherpa-onnx/releases нужно скачать бинарники под свою платформу, например sherpa-onnx-version-win-x64-shared.tar.bz2, распаковать из этого архива папку bin в отдельную папку sherpa.
Со страницы модели, например, vits-piper-en_US-hfc_female-medium, в секции "Model download address" нужно скачать архив и распаковывать в ранее созданную папку sherpa. Файл .onmx можно для удобства переименовать в model.onnx
Пример структуры папки sherpa:
- sherpa/
- bin/
- kokoro-multi-lang-v1_0/
- vits-piper-en_US-hfc_female-medium/
Скрипты
Дабы не заморачиваться с прописыванием параметров, пропишем их в скрипте. Параметры немного отличаются для vits-* и kokoro моделей, поэтому приведу два скрипта.
Windows
Первый, для vits-piper модели, назовём tts-hfc.ps1
- $ROOT = "C:\path\to\directory\sherpa"
- $MODEL_DIR = "$ROOT\vits-piper-en_US-hfc_female-medium"
- $prompt = if ($args.Count -gt 0) {
- $args -join " "
- } else {
- $input | Out-String
- }
- if ([Console]::IsInputRedirected) {
- $stdinContent = $input | Out-String
- if ($stdinContent.Trim()) {
- $prompt = "$stdinContent $prompt".Trim()
- }
- }
- & "$ROOT\bin\sherpa-onnx-offline-tts-play.exe" `
- --vits-model="$MODEL_DIR\model.onnx" `
- --vits-tokens="$MODEL_DIR\tokens.txt" `
- --vits-data-dir="$MODEL_DIR\espeak-ng-data" `
- --num-threads=4 `
- --output-filename="$env:TMP\generated-hfc.wav" `
- $prompt
Для kokoro модели (--sid выбирает порядковый номер голоса, там их много), tts-kokoro.ps1
- $ROOT = "C:\path\to\directory\sherpa"
- $MODEL_DIR = "$ROOT\kokoro-multi-lang-v1_0"
- $prompt = if ($args.Count -gt 0) {
- $args -join " "
- } else {
- $input | Out-String
- }
- if ([Console]::IsInputRedirected) {
- $stdinContent = $input | Out-String
- if ($stdinContent.Trim()) {
- $prompt = "$stdinContent $prompt".Trim()
- }
- }
- & "$ROOT\bin\sherpa-onnx-offline-tts-play.exe" `
- --kokoro-model="%MODEL_DIR%\model.onnx" `
- --kokoro-voices="%MODEL_DIR%\voices.bin" `
- --kokoro-tokens="%MODEL_DIR%\tokens.txt" `
- --kokoro-lexicon="%MODEL_DIR%\lexicon-us-en.txt" `
- --kokoro-data-dir="%MODEL_DIR%\espeak-ng-data" `
- --kokoro-dict-dir="%MODEL_DIR%\dict" ^
- --sid=6 `
- --num-threads=4 `
- --output-filename="$env:TMP\generated-kokoro.wav" `
- $prompt
В обоих скриптах необходимо указать свой путь к папке sherpa, после чего оба скрипта закинуть в sherpa/bin и добавить в PATH.
Запускать так:
- ./tts-hfc.ps1 "input"
- Get-Content .\in.txt | .\tts-hfc.ps1
Unix (Bash)
Для vits-piper модели, tts-hfc
- #!/usr/bin/env bash
- ROOT="/path/to/directory/sherpa"
- MODEL_DIR="$ROOT/vits-piper-en_US-hfc_female-medium"
- prompt="${*:-$(< /dev/stdin)}"
- test ! -t 0 && prompt="$(< /dev/stdin) $prompt"
- "$ROOT/bin/sherpa-onnx-offline-tts-play" \
- --vits-model="$MODEL_DIR/model.onnx" \
- --vits-tokens="$MODEL_DIR/tokens.txt" \
- --vits-data-dir="$MODEL_DIR/espeak-ng-data" \
- --num-threads=4 \
- --output-filename="$TMP/generated-hfc.wav" \
- "$prompt"
И для kokoro, файл tts-kokoro
- #!/usr/bin/env bash
- ROOT="/path/to/directory/sherpa"
- MODEL_DIR="$ROOT/kokoro-multi-lang-v1_0"
- prompt="${*:-$(< /dev/stdin)}"
- test ! -t 0 && prompt="$(< /dev/stdin) $prompt"
- "$ROOT/bin/sherpa-onnx-offline-tts-play" \
- --kokoro-model="$MODEL_DIR/model.onnx" \
- --kokoro-voices="$MODEL_DIR/voices.bin" \
- --kokoro-tokens="$MODEL_DIR/tokens.txt" \
- --kokoro-lexicon="$MODEL_DIR/lexicon-us-en.txt" \
- --kokoro-data-dir="$MODEL_DIR/espeak-ng-data" \
- --kokoro-dict-dir="$MODEL_DIR/dict" \
- --sid=6 \
- --num-threads=4 \
- --output-filename="$TMP/generated-kokoro.wav" \
- "$prompt"
Запуск:
- ./tts-hfc "input"
- cat in.txt | ./tts-hfc
Если не нужно автоматическое проигрывание, то можно заменить в скриптах
sherpa-onnx-offline-tts-play на sherpa-onnx-offline-tts, тогда будет только генерирование аудио.
Установка (Android)
На странице модели, например, vits-piper-en_US-hfc_female-medium, есть секция Android APK. Или тут весь список: https://k2-fsa.github.io/sherpa/onnx/tts/apk-engine.html
Ставим apk, и модель появится в списке системных голосов. Само приложение оснащено формой для вставки текста, так что можно озвучивать и в нём.

Главный недостаток: можно установить только одну модель. Если ставить другую, то приложение обновляется. Но лечится клонированием приложения.
Получение текста статей
Самый простейший вариант — установить python-модуль trafilatura.
- pip install trafilatura
С ним ставится и бинарник trafilatura (документация):
- trafilatura -u "https://some-article-url"
Связываем всё вместе
Powershell:
- trafilatura -u "https://blog.annimon.com/image-processing-7/" | .\tts-hfc.ps1
Bash:
- trafilatura -u "https://blog.annimon.com/image-processing-7/" | ./tts-hfc
Дальше можно внедрить ffmpeg и конвертировать wav в mp3/opus, автоматически переименовывать результат в зависимости от URL и времени, вшивать текст статьи в аудио-файл и многое другое.
- trafilatura -u "https://blog.annimon.com/image-processing-7/" | ./tts-kokoro && ffmpeg -i "$TMP/generated-kokoro.wav" -b:a 96k "$TMP/image-processing-7-kokoro.mp3"