You've already forked Irene-Voice-Assistant
mirror of
https://github.com/janvarev/Irene-Voice-Assistant.git
synced 2025-11-23 22:45:08 +02:00
- новый TTS через OpenTTS сервер
- доки по плагинам и линуксу - plugin_tts_rhvoice_rest.py перенесен сразу в активные, т.к. мало зависимостей
This commit is contained in:
@@ -19,7 +19,16 @@ core.ttsEngine.setProperty("voice", "russian") либо найти нужный
|
|||||||
|
|
||||||
Тогда звук будет идти через espeak-ng, и говорят, он не очень на русском.
|
Тогда звук будет идти через espeak-ng, и говорят, он не очень на русском.
|
||||||
|
|
||||||
**2 вариант. Поставить TTS rhvoice**
|
**2 вариант. Поставить TTS rhvoice_rest и запустить Докер для rhvoice_rest**
|
||||||
|
|
||||||
|
Прстой вариант, чтобы не париться с зависимостями.
|
||||||
|
1. Установите в options/core.json "ttsEngineId": "rhvoice_rest"
|
||||||
|
2. Использует докер-сервер https://github.com/Aculeasis/rhvoice-rest для
|
||||||
|
генерации голоса. Зайдите туда и запустите нужный вам докер.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
**3 вариант. Поставить TTS rhvoice**
|
||||||
|
|
||||||
1. Скопируйте plugin_tts_rhvoice из plugins_active в plugins
|
1. Скопируйте plugin_tts_rhvoice из plugins_active в plugins
|
||||||
2. Установите в options/core.json "ttsEngineId": "rhvoice"
|
2. Установите в options/core.json "ttsEngineId": "rhvoice"
|
||||||
@@ -34,3 +43,9 @@ pip3 install scons lxml
|
|||||||
|
|
||||||
Проблемы обсуждались в этой ветке комментариев: https://habr.com/ru/post/595855/#comment_24043171
|
Проблемы обсуждались в этой ветке комментариев: https://habr.com/ru/post/595855/#comment_24043171
|
||||||
|
|
||||||
|
**Важно:** если соберетесь использовать rhvoice, переключите настройку в core.json:
|
||||||
|
`"playWavEngineId": "sounddevice",`
|
||||||
|
потому что через audioplayer не проигрывает WAV по неизвестным причинам.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Список плагинов, встроенных в инсталляцию по умолчанию
|
# Список плагинов, встроенных в инсталляцию по умолчанию
|
||||||
|
|
||||||
### Активные плагины/скиллы (уже в папке plugins)
|
## Активные плагины/скиллы (уже в папке plugins)
|
||||||
|
|
||||||
Для каждого плагина написано, требуется ли онлайн.
|
Для каждого плагина написано, требуется ли онлайн.
|
||||||
Для отключения удалите из папки
|
Для отключения удалите из папки
|
||||||
@@ -34,7 +34,28 @@
|
|||||||
|
|
||||||
**plugin_tts_console.py** - (оффлайн) заглушка для отладки. Вместо работы TTS просто выводит текст в консоль.
|
**plugin_tts_console.py** - (оффлайн) заглушка для отладки. Вместо работы TTS просто выводит текст в консоль.
|
||||||
|
|
||||||
### Неактивные скиллы (plugins_inactive)
|
**plugin_tts_rhvoice_rest.py** - (оффлайн) TTS через RHVoice.
|
||||||
|
Использует докер-сервер https://github.com/Aculeasis/rhvoice-rest для
|
||||||
|
генерации голоса. Зайдите туда и запустите нужный вам докер.
|
||||||
|
|
||||||
|
Голос и адрес докера задается в конфиге.
|
||||||
|
|
||||||
|
_(По неизвестным причинам плохо генерирует WAV.
|
||||||
|
Поэтому используется генерация MP3. Учтите, если будете использовать)_
|
||||||
|
|
||||||
|
Для работы укажите в core.json `"ttsEngineId": "rhvoice_rest",`
|
||||||
|
|
||||||
|
**plugin_tts_opentts.py** - (оффлайн) TTS через OpenTTS сервер.
|
||||||
|
Использует докер-сервер https://github.com/synesthesiam/opentts для
|
||||||
|
генерации голоса. Зайдите туда и запустите нужный вам докер.
|
||||||
|
|
||||||
|
OpenTTS не очень хорош в русской озвучке, но поддерживает большое число
|
||||||
|
других языков.
|
||||||
|
|
||||||
|
Для работы укажите в core.json `"ttsEngineId": "opentts",`
|
||||||
|
|
||||||
|
|
||||||
|
## Неактивные скиллы (plugins_inactive)
|
||||||
|
|
||||||
Для работы перенесите в папку plugins
|
Для работы перенесите в папку plugins
|
||||||
|
|
||||||
@@ -125,14 +146,5 @@ pip install rhvoice-wrapper-bin --only-binary rhvoice-wrapper-bin
|
|||||||
потому что через audioplayer не проигрывает WAV по неизвестным причинам.
|
потому что через audioplayer не проигрывает WAV по неизвестным причинам.
|
||||||
|
|
||||||
|
|
||||||
**plugin_tts_rhvoice_rest.py** - (оффлайн) TTS через RHVoice.
|
|
||||||
Использует докер-сервер https://github.com/Aculeasis/rhvoice-rest для
|
|
||||||
генерации голоса. Зайдите туда и запустите нужный вам докер.
|
|
||||||
|
|
||||||
Голос и адрес докера задается в конфиге.
|
|
||||||
|
|
||||||
_(По неизвестным причинам плохо генерирует WAV.
|
|
||||||
Поэтому используется генерация MP3. Учтите, если будете использовать)_
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
115
plugins/plugin_tts_opentts.py
Normal file
115
plugins/plugin_tts_opentts.py
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
# TTS plugin for OpenTTS server (rest server from https://github.com/synesthesiam/opentts )
|
||||||
|
# author: Vladislav Janvarev
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import os
|
||||||
|
import requests
|
||||||
|
import json
|
||||||
|
|
||||||
|
from vacore import VACore
|
||||||
|
|
||||||
|
modname = os.path.basename(__file__)[:-3] # calculating modname
|
||||||
|
|
||||||
|
### classes from https://github.com/Aculeasis/rhvoice-rest/blob/master/example/rhvoice-rest.py
|
||||||
|
class Error(Exception):
|
||||||
|
def __init__(self, code, msg):
|
||||||
|
self.code = code
|
||||||
|
self.msg = msg
|
||||||
|
|
||||||
|
|
||||||
|
class TTS:
|
||||||
|
TTS_URL = "{}/api/tts"
|
||||||
|
|
||||||
|
def __init__(self, text, url='http://127.0.0.1:8080', voice='anna', format_='mp3'):
|
||||||
|
self._url = self.TTS_URL.format(url)
|
||||||
|
self.__params = {
|
||||||
|
'text': text,
|
||||||
|
'voice': voice,
|
||||||
|
}
|
||||||
|
self._data = None
|
||||||
|
self._generate()
|
||||||
|
|
||||||
|
def _generate(self):
|
||||||
|
try:
|
||||||
|
rq = requests.get(self._url, params=self.__params, stream=False)
|
||||||
|
except (requests.exceptions.HTTPError, requests.exceptions.RequestException) as e:
|
||||||
|
raise Error(code=1, msg=str(e))
|
||||||
|
|
||||||
|
code = rq.status_code
|
||||||
|
if code != 200:
|
||||||
|
raise Error(code=code, msg='http code != 200')
|
||||||
|
self._data = rq.iter_content()
|
||||||
|
|
||||||
|
def save(self, file_path):
|
||||||
|
if self._data is None:
|
||||||
|
raise Exception('There\'s nothing to save')
|
||||||
|
|
||||||
|
with open(file_path, 'wb') as f:
|
||||||
|
for d in self._data:
|
||||||
|
f.write(d)
|
||||||
|
|
||||||
|
return file_path
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# функция на старте
|
||||||
|
def start(core:VACore):
|
||||||
|
manifest = {
|
||||||
|
"name": "TTS OpenTTS server",
|
||||||
|
"version": "1.0",
|
||||||
|
"require_online": False,
|
||||||
|
|
||||||
|
"default_options": {
|
||||||
|
"voiceId": "marytts:ac-irina-hsmm", # id голоса
|
||||||
|
"urlOpenTTS": "http://127.0.0.1:5500",
|
||||||
|
},
|
||||||
|
|
||||||
|
"tts": {
|
||||||
|
"opentts": (init,None,towavfile) # первая функция инициализации, вторая - говорить, третья - в wav file
|
||||||
|
# если вторая - None, то используется 3-я с проигрыванием файла
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return manifest
|
||||||
|
|
||||||
|
def start_with_options(core:VACore, manifest:dict):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def init(core:VACore):
|
||||||
|
url = core.plugin_options(modname)["urlOpenTTS"]
|
||||||
|
print("Open TTS web interface: {}".format(url))
|
||||||
|
try:
|
||||||
|
rq = requests.get(url+"/api/voices", params={}, stream=False)
|
||||||
|
except (requests.exceptions.HTTPError, requests.exceptions.RequestException) as e:
|
||||||
|
#raise Error(code=1, msg=str(e))
|
||||||
|
print("--- Error: OpenTTS seems to be unavailable ----")
|
||||||
|
return
|
||||||
|
|
||||||
|
#print(rq.content)
|
||||||
|
ar = json.loads(rq.content)
|
||||||
|
print("Available voices OpenTTS:")
|
||||||
|
for voiceId in ar.keys():
|
||||||
|
print(" "+voiceId+": ",ar[voiceId])
|
||||||
|
|
||||||
|
def towavfile(core:VACore, text_to_speech:str, wavfile:str):
|
||||||
|
# simple way
|
||||||
|
voiceid = core.plugin_options(modname)["voiceId"]
|
||||||
|
url = core.plugin_options(modname)["urlOpenTTS"]
|
||||||
|
#format = core.plugin_options("plugin_tts_rhvoice_rest")["format"]
|
||||||
|
try:
|
||||||
|
|
||||||
|
res = TTS(text=text_to_speech,url=url,voice=voiceid)
|
||||||
|
|
||||||
|
res.save(wavfile)
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
test = TTS(text='Привет мир! 1 2 3.',format_="wav")
|
||||||
|
test.save('../temp/testrh.wav')
|
||||||
|
print('test.mp3 generated!')
|
||||||
Reference in New Issue
Block a user