2021-12-14 12:51:47 +03:00
# Core plugin
# author: Vladislav Janvarev
2021-12-15 12:53:52 +03:00
from vacore import VACore
2021-12-14 12:51:47 +03:00
# функция на старте
2021-12-15 12:53:52 +03:00
def start ( core : VACore ) :
2021-12-14 12:51:47 +03:00
manifest = {
" name " : " Core plugin " ,
2025-05-17 13:41:23 +03:00
" version " : " 4.5 " ,
2023-05-11 16:45:47 +03:00
" description " : " Плагин с основными настройками Ирины. \n Посмотрите другие плагины, чтобы понять, какие команды можно использовать. " ,
" options_label " : {
" mpcIsUse " : " Можно ли использовать плеер MPC-HС " ,
" mpcHcPath " : " Путь до плеера MPC-HС " ,
" mpcIsUseHttpRemote " : " Можно ли использовать управление плеером MPC-HС через веб-доступ (включается в настройках плеера) " ,
" isOnline " : " Будут ли выполняться команды плагинов, требующие онлайн " ,
# "ttsIndex": 0,
" useTTSCache " : " Кешировать озвучку текста (требует больше места на диске, может сбоить при переключении голосов) " ,
2024-06-14 18:55:34 +03:00
" ttsEngineId " : " ID основного движка озвучки. Если что-то не работает - попробуйте сменить на pyttsx, elevenlabs, vosk, vsegpt (если используете) или silero_v3 (последний требует полной установки из install - т.е. c torch) " ,
2023-05-11 16:45:47 +03:00
" ttsEngineId2 " : " ID дополнительного движка озвучки. Всегда озвучивает результат на той машине, где запущена Ирина (без веб-интерфейса) " , # двиг для прямой озвучки на сервере. Если пуст - используется ttsEngineId
" playWavEngineId " : " ID движка воспроизведения аудио. Если есть проблемы - попробуйте сменить на audioplayer или sounddevice " ,
" linguaFrancaLang " : " Язык для библиотеки lingua-franca конвертирования чисел " , # язык для библиотеки lingua-franca конвертирования чисел
" voiceAssNames " : " Имена, по которому обращаются к помощнику через |. (Если это появится в звуковом потоке, то считается, что дальше будет голосовая команда.) " ,
" logPolicy " : " all|cmd|none . Когда распознается речь с микрофона - выводить в консоль всегда | только, если является командой | никогда " , # all | cmd | none
" replyNoCommandFound " : " ответ при непонимании " ,
" replyNoCommandFoundInContext " : " ответ при непонимании в состоянии контекста " ,
" replyOnlineRequired " : " ответ при вызове в оффлайн функции плагина, требующего онлайн " ,
" contextDefaultDuration " : " Время в секундах, пока Ирина находится в контексте (контекст используется в непрерывном чате, играх и пр.; в контексте не надо использовать слово Ирина) " ,
" contextRemoteWaitForCall " : " (ПРО) При использовании WEB-API - ждать ли команды от клиента, что звук уже проигрался? " ,
" tempDir " : " адрес директории для временных файлов " ,
" fuzzyThreshold " : " (ПРО) Порог уверенности при использовании нечеткого распознавания команд " ,
2024-04-03 14:12:13 +03:00
" voiceAssNameRunCmd " : " Словарь сопоставлений. При нахождении имени помощника, добавляет префикс к распознанной фразе " ,
2025-05-08 08:53:19 +03:00
2025-05-09 20:32:32 +03:00
" log_console " : " Выводить ли в консоль логи " ,
" log_console_level " : " Уровень логирования консоли " ,
" log_file " : " Выводить ли в лог-файл логи " ,
" log_file_level " : " Уровень логирования лог-файла " ,
2025-05-08 08:53:19 +03:00
" log_file_name " : " Имя лог-файла " ,
2025-05-10 11:14:26 +03:00
" normalization_engine " : " Нормализация текста для русских TTS. Используйте runorm для качественного результата "
2023-05-11 16:45:47 +03:00
} ,
2021-12-14 12:51:47 +03:00
" default_options " : {
" mpcIsUse " : True ,
" mpcHcPath " : " C: \ Program Files (x86) \ K-Lite Codec Pack \ MPC-HC64 \ mpc-hc64_nvo.exe " ,
" mpcIsUseHttpRemote " : False ,
2023-05-11 17:48:04 +03:00
" isOnline " : True ,
2021-12-14 12:51:47 +03:00
#"ttsIndex": 0,
2022-05-12 00:51:12 +03:00
" useTTSCache " : False ,
2021-12-14 12:51:47 +03:00
" ttsEngineId " : " pyttsx " ,
2022-04-17 11:11:22 +03:00
" ttsEngineId2 " : " " , # двиг для прямой озвучки на сервере. Если пуст - используется ttsEngineId
2022-04-18 11:30:37 +03:00
" playWavEngineId " : " audioplayer " ,
2022-04-18 12:55:33 +03:00
" linguaFrancaLang " : " ru " , # язык для библиотеки lingua-franca конвертирования чисел
2021-12-14 12:51:47 +03:00
" voiceAssNames " : " ирина|ирины|ирину " ,
" logPolicy " : " cmd " , # all | cmd | none
2022-02-05 15:18:44 +03:00
" replyNoCommandFound " : " Извини, я не поняла " ,
2022-03-18 12:04:28 +03:00
" replyNoCommandFoundInContext " : " Не поняла... " ,
2022-02-05 15:18:44 +03:00
" replyOnlineRequired " : " Для этой команды необходим онлайн " ,
2022-02-07 22:20:48 +03:00
2022-05-12 19:53:31 +03:00
" contextDefaultDuration " : 10 ,
" contextRemoteWaitForCall " : False ,
2022-02-07 22:20:48 +03:00
" tempDir " : " temp " ,
2023-01-24 18:28:15 +03:00
" fuzzyThreshold " : 0.5 ,
2024-04-03 14:12:13 +03:00
" voiceAssNameRunCmd " : {
" альбина " : " чатгпт "
2025-05-08 08:53:19 +03:00
} ,
2025-05-09 20:32:32 +03:00
" log_console " : True , # Вывод логов в консоль
" log_console_level " : " WARNING " ,
# Записываются в лог сообщения с уровнем равным или выше этого уровня: NOTSET | DEBUG | INFO | WARNING | ERROR | CRITICAL
" log_file " : False , # Вывод в лог-файл
" log_file_level " : " DEBUG " , # NOTSET | DEBUG | INFO | WARNING | ERROR | CRITICAL
2025-05-08 08:53:19 +03:00
" log_file_name " : " log.txt " , # имя лог-файла
2025-05-10 11:14:26 +03:00
2025-05-17 13:41:23 +03:00
" normalization_engine " : " default " , # нормализация текста для русских TTS.
2025-05-10 11:14:26 +03:00
# Добавляется плагинами. Рекомендуется runorm для качества (но runorm тяжела в обработке)
2021-12-14 12:51:47 +03:00
} ,
}
return manifest
2021-12-15 12:53:52 +03:00
def start_with_options ( core : VACore , manifest : dict ) :
2021-12-14 12:51:47 +03:00
#print(manifest["options"])
options = manifest [ " options " ]
#core.setup_assistant_voice(options["ttsIndex"])
core . mpcHcPath = options [ " mpcHcPath " ]
core . mpcIsUse = options [ " mpcIsUse " ]
core . mpcIsUseHttpRemote = options [ " mpcIsUseHttpRemote " ]
core . isOnline = options [ " isOnline " ]
core . voiceAssNames = options [ " voiceAssNames " ] . split ( " | " )
2024-04-03 14:12:13 +03:00
core . voiceAssNameRunCmd = options [ " voiceAssNameRunCmd " ]
print ( core . voiceAssNameRunCmd )
2021-12-14 12:51:47 +03:00
core . ttsEngineId = options [ " ttsEngineId " ]
2022-04-17 11:11:22 +03:00
core . ttsEngineId2 = options [ " ttsEngineId2 " ]
2022-04-18 11:30:37 +03:00
core . playWavEngineId = options [ " playWavEngineId " ]
2021-12-14 12:51:47 +03:00
core . logPolicy = options [ " logPolicy " ]
2022-05-12 19:53:31 +03:00
core . contextDefaultDuration = options [ " contextDefaultDuration " ]
core . contextRemoteWaitForCall = options [ " contextRemoteWaitForCall " ]
2022-02-07 22:20:48 +03:00
core . tmpdir = options [ " tempDir " ]
import os
if not os . path . exists ( core . tmpdir ) :
os . mkdir ( core . tmpdir )
2022-05-12 00:51:12 +03:00
core . useTTSCache = options [ " useTTSCache " ]
core . tts_cache_dir = " tts_cache "
if not os . path . exists ( core . tts_cache_dir ) :
os . mkdir ( core . tts_cache_dir )
2022-05-12 15:34:16 +03:00
if not os . path . exists ( core . tts_cache_dir + " / " + core . ttsEngineId ) :
os . mkdir ( core . tts_cache_dir + " / " + core . ttsEngineId )
2022-05-12 00:51:12 +03:00
2022-04-18 12:55:33 +03:00
import lingua_franca
lingua_franca . load_language ( options [ " linguaFrancaLang " ] )
2021-12-14 12:51:47 +03:00
2025-05-10 11:14:26 +03:00
core . normalization_engine = options [ " normalization_engine " ]
2025-05-17 13:41:23 +03:00
if core . normalization_engine == " default " :
core . normalization_engine = " prepare "
2025-05-10 11:14:26 +03:00
2025-05-08 08:53:19 +03:00
# Логирование
2025-05-09 20:32:32 +03:00
core . log_console = options [ " log_console " ]
core . log_console_level = options [ " log_console_level " ]
core . log_file = options [ " log_file " ]
core . log_file_level = options [ " log_file_level " ]
2025-05-08 08:53:19 +03:00
core . log_file_name = options [ " log_file_name " ]
2025-05-09 20:32:32 +03:00
if core . log_console or core . log_file :
2025-05-08 08:53:19 +03:00
import logging # Если не создать логгер здесь, то он всё равно будет создан при первом вызове из библиотек или подмодулей
root_logger = logging . getLogger ( ) # Получить объект логгера, если он уже создан или создать новый корневой...
for handler in root_logger . handlers [ : ] : # ... т.к. запуск не из самого верхнего модуля
root_logger . removeHandler ( handler ) # Удалить созданные обработчики, если они есть
2025-05-09 20:32:32 +03:00
root_logger . setLevel ( min ( core . log_console_level ,
core . log_file_level ) ) # Установить минимальный уровень, ниже которого события не обрабатываются
if core . log_console :
2025-05-08 08:53:19 +03:00
console_handler = logging . StreamHandler ( )
2025-05-09 20:32:32 +03:00
console_handler . setLevel ( core . log_console_level )
2025-05-08 08:53:19 +03:00
console_formatter = logging . Formatter ( ' %(asctime)s - %(name)s - %(levelname)s - %(message)s ' )
console_handler . setFormatter ( console_formatter )
root_logger . addHandler ( console_handler )
2025-05-09 20:32:32 +03:00
if core . log_file :
2025-05-08 08:53:19 +03:00
file_handler = logging . FileHandler ( core . log_file_name )
2025-05-09 20:32:32 +03:00
file_handler . setLevel ( core . log_file_level )
2025-05-08 08:53:19 +03:00
file_formatter = logging . Formatter ( ' %(asctime)s - %(name)s - %(levelname)s - %(message)s ' )
file_handler . setFormatter ( file_formatter )
root_logger . addHandler ( file_handler )
logger = logging . getLogger ( __name__ ) # Создать логгер для этого модуля
2025-05-09 20:32:32 +03:00
if core . log_console :
2025-05-08 08:53:19 +03:00
logger . info ( " Console logging enabled " )
2025-05-09 20:32:32 +03:00
if core . log_file :
2025-05-08 08:53:19 +03:00
logger . info ( " File logging enabled " )
2021-12-14 12:51:47 +03:00
return manifest