This commit is contained in:
APodoinikov 2025-10-11 12:55:30 +07:00
parent 09aee947f8
commit deed8d176b
8 changed files with 145 additions and 68 deletions

View file

@ -110,6 +110,11 @@
* * default_to_lang - двухбуквенный код языка, будет использован, как язык, на который необходимо перевести, если он не был явно указан.
* * sleep_after_translate - время в секундах (может быть дробным, например, 0.1), которое севрис будет ожидать после завершения перевода.
* Группа **rest_log_params** - параметры логирования запросов и ответов перевода.
* * translate_req_text - логирование исходного текста
* * translate_resp_text - логирование текста перевода
* * translate_validation_errors - логирование ошибок в текстах запросов
* **v** - служебное значение, версия плагина. При повышении версии плагин дополнит файл конфигурации новыми параметрами.
### Как текст разбивается на части при использовании параметра split_expected_length

View file

@ -0,0 +1,38 @@
# Плагин обработки файлов: media
Часть параметров, общих для всех плагинов, описана [здесь](../processing_files.md).
## Параметры плагина
* **model** - модель для распознавания звука. Модели можно увидеть например [здесь](https://github.com/openai/whisper/blob/main/whisper/__init__.py).
Вот этот список: tiny.en, tiny, base.en, base, small.en, small, medium.en, medium, large-v1, large-v2, large-v3, large, large-v3-turbo, turbo
* **cuda** - `true` - использовать видеокарту (быстрее), `false` - использовать cpu (медленнее).
* **cuda_device_index** - если в системе несколько видеокарт, можно выбрать ту, в которую будет загружена модель.
Номер и имя видеокарты указывается при старте приложения в логе, вида `INFO GPU #0: NVIDIA GeForce RTX 4090`.
`0` - указываемый в параметре номер.
* **unload_model_after_processing** - выгружать модель из памяти после завершения обработки списка файлов. Можно использовать, если на карте мало памяти.
* **translate_after_processing** - переводить субтитры сразу после распознавания. По умолчанию, будет запущен обработчик [srt-Файлов](file_srt.md).
* **output_file_name_template** - шаблон для имени файла.
Следующие пункты подробно описаны в документации к Whisper, например здесь https://github.com/openai/whisper/blob/main/whisper/transcribe.py, поэтому ниже общее описание.
* **temperature** - массив значений точности распознавания.
* **condition_on_previous_text** - основываться на предыдущем тексте.
* **word_timestamps** - временные метки для слов - нужно для корректного создания субтитров.
* **hallucination_silence_threshold** - порог галлюцинаций (додумывания текста) при распознавании.
* **carry_initial_prompt** - если True, то значение `initial_prompt` будет добавлено в каждый вызов функции декодирования.
* **initial_prompt** - подсказки дял перевода, например, чтобы помочь распознавать трудные слова.
* **compression_ratio_threshold** - считать распознавание неудачным при значении выше этого параметра.
* **logprob_threshold** - если средняя логарифмическая вероятность ниже этого значения, считать распознавание неудачным

View file

@ -0,0 +1,15 @@
# Плагин обработки файлов: srt
Часть параметров, общих для всех плагинов, описана [здесь](../processing_files.md).
## Параметры плагина
* **text_format** - параметры форматирования текста в обрабатываемом файле.
* * **original_prefix** - символы, которые будут подставлены в начале оригинального текста.
* * **original_postfix** - символы, которые будут подставлены в конце оригинального текста.
* * **translate_prefix** - символы, которые будут подставлены в начале переведенного текста.
* * **translate_postfix** - символы, которые будут подставлены в конце переведенного текста.
* **remove_src_filename_postfix** - удаление из имени исходного файла постфикса. Постфикс может пригодиться, чтобы выбирать по части имени исходные и переведенные файлы.
* **translate_delimiter** - разделитель между оригиналом и переводом.

View file

@ -17,6 +17,10 @@
* **file_txt** - [документация](plugins-file-processing/file_txt.md). Перевод книг в формате txt.
* **file_media_whisper** - [документация](plugins-file-processing/file_media_whisper.md). Распознавание текста в медиа-файлах. Поддерживаются практически все файлы, которые может прочитать ffmpeg.
* **file_srt** - [документация](plugins-file-processing/file_txt.md). Перевод субтитров srt. Можно найти существующие субтитры, или распознать звуковую дорожку через плагин `file_media_whisper`.
## Параметры, которые задаются в основной конфигурации
Некоторые параметры не настраиваются в плагинах, например, пути для исходных / обработанных файлов.

View file

@ -6,67 +6,6 @@
Модули могут работать независимо, используя только функционал сервиса, или вызывать внешние приложения.
Параметры, использование моделей и прочее более подробно указано в документации для каждого плагина отдельно.
## Перевод через REST API
Сервис поддерживает перевод через REST-запросы. Просмотреть API можно здесь по адресу host:port/docs,
по умолчанию здесь: http://127.0.0.1:4990/docs
Базовый запрос для перевода: POST http://127.0.0.1:4990/translate
Минимальное работающее тело запроса выглядит так:
```json
{
"text": "hi"
}
```
Для такого запроса будут автоматически выбраны язык оригинала, язык на который нужно выполнить перевод,
плагин для перевода - все это задается через [параметры](options.md).
Все параметры для перевода можно переопределить вручную.
```json
{
"text": "hi",
"context": "context",
"from_lang": "en",
"to_lang": "ru",
"translator_plugin": "lm_studio"
}
```
В этом запросе:
* **text** - текст для перевода
* **context** - дополнительный контекст. Например, можно указать, чтобы какое-то имя переводилось определенным образом,
или дать понять, какого стиля переводимый текст - художественный, научный, юридический и т. д.
* **from_lang** - двухбуквенный код языка оригинала. Коды можно посмотреть в файле [common.js](../../static/common.js) проекта.
* **to_lang** - двухбуквенный код языка, на который нужно выполнить перевод.
* **translator_plugin** - плагин дял перевода. Он должен быть загружен в сервис.
Также можно выполнить GET запрос и передат ьвсе параметры в него, например
http://127.0.0.1:4990/translate?text=hi&from_lang=en&to_lang=ru&context=context&translator_plugin=lm_studio
Ответ:
```json
{
"result": "Здравствуйте!",
"parts": [
{
"text": "hi",
"translate": "Здравствуйте!",
"paragraph_end": true
}
],
"error": null
}
```
* **result** - результат перевода.
* **parts** - если текст в процессе перевода был разбит на несколько частей, в этом массиве будут представлены
все части, и перевод каждой из частей. Это может пригодиться для понимания того, почему перевод был выполнен
не полностью и подобрать более подходящие параметры разбиения текста на части.
* * **parts[].text** - часть исходного текста, на исходном языке, после преобразований.
* * **parts[].translate** - перевод части текста
* * **parts[].paragraph_end** является ли часть последним предложением в параграфе (необходимо для соединения частей в поле результата `result`).
* **error** - если перевод был выполнен успешно - null, иначе - текст ошибки.
## Список поддерживаемых плагинов
* **kobold_cpp** - [проект](https://github.com/LostRuins/koboldcpp), [документация](plugins-translate/kobold_cpp.md).
@ -96,4 +35,76 @@ http://127.0.0.1:4990/translate?text=hi&from_lang=en&to_lang=ru&context=context&
* **no_translate** - этот плагин не является переводчиком, поэтому не имеет параметров.
Возвращает в ответе переданный в запросе текст без изменений.
Его можно использовать для отладки при работе с параметрами и разработке функционала сервиса.
Его можно использовать для отладки при работе с параметрами и разработке функционала сервиса.
## Перевод через REST API
Сервис поддерживает перевод через REST-запросы. Просмотреть API можно здесь по адресу host:port/docs,
по умолчанию здесь: http://127.0.0.1:4990/docs
Базовый запрос для перевода: POST http://127.0.0.1:4990/translate
Минимальное работающее тело запроса выглядит так:
```json
{
"text": "hi"
}
```
Для такого запроса будут автоматически выбраны язык оригинала, язык на который нужно выполнить перевод,
плагин для перевода - все это задается через [параметры](options.md).
Все параметры для перевода можно переопределить вручную.
```json
{
"text": "hi",
"context": "context",
"from_lang": "en",
"to_lang": "ru",
"translator_plugin": "lm_studio"
}
```
В этом запросе:
* **text** - текст для перевода
* **context** - дополнительный контекст. Например, можно указать, чтобы какое-то имя переводилось определенным образом,
или дать понять, какого стиля переводимый текст - художественный, научный, юридический и т. д.
* **from_lang** - двухбуквенный код языка оригинала. Коды можно посмотреть в файле [common.js](../../static/common.js) проекта.
* **to_lang** - двухбуквенный код языка, на который нужно выполнить перевод.
* **translator_plugin** - плагин дял перевода. Он должен быть загружен в сервис.
Также можно выполнить GET запрос и передать все параметры в него, например
http://127.0.0.1:4990/translate?text=hi&from_lang=en&to_lang=ru&context=context&translator_plugin=lm_studio
Ответ:
```json
{
"result": "Здравствуйте!",
"parts": [
{
"text": "hi",
"translate": "Здравствуйте!",
"paragraph_end": true
}
],
"error": null
}
```
* **result** - результат перевода.
* **parts** - если текст в процессе перевода был разбит на несколько частей, в этом массиве будут представлены
все части, и перевод каждой из частей. Это может пригодиться для понимания того, почему перевод был выполнен
не полностью и подобрать более подходящие параметры разбиения текста на части.
* * **parts[].text** - часть исходного текста, на исходном языке, после преобразований.
* * **parts[].translate** - перевод части текста
* * **parts[].paragraph_end** является ли часть последним предложением в параграфе (необходимо для соединения частей в поле результата `result`).
* **error** - если перевод был выполнен успешно - null, иначе - текст ошибки.
### Запросы sugoi-like
Это запросы в формате [Sugoi-Japanese-Translator](https://github.com/leminhyen2/Sugoi-Japanese-Translator),
нужны для интеграции с другими приложениями, которые поддерживают sugoi-translator - таким образом, указав в настройках
внешнего приложения адрес этого приложения, можно осуществить интеграцию.
Например, sugoi-translator поддерживают:
* [translator-plusplus](https://dreamsavior.net/translator-plusplus/)
* [LunaTranslator](https://docs.lunatranslator.org/en/)
Поддерживается GET и POST варианты запросов, оба этих запроса находятся по пути `/translate/sugoi-like`.

View file

@ -107,7 +107,7 @@ async def translate_post(req: dto.TranslateReq) -> dto.TranslateResp:
async def translate_sugoi_like_post(req: dto.SugoiLikePostReq, from_lang: str = "", to_lang: str = "", context: str = None,
translator_plugin: str = "") -> list[str]:
"""
Translate text. Request and response like a sugoi translator - https://github.com/leminhyen2/Sugoi-Japanese-Translator/tree/main
Translate text. Request and response like a sugoi translator - https://github.com/leminhyen2/Sugoi-Japanese-Translator
This allows the query to be used in integration programs such as a Translator++ - http://dreamsavior.net/docs/translator/
:param req:
@ -144,7 +144,7 @@ async def translate_sugoi_like_post(req: dto.SugoiLikePostReq, from_lang: str =
async def translate_sugoi_like_post(text: str, from_lang: str = "", to_lang: str = "", context: str = None,
translator_plugin: str = "") -> dto.SugoiLikeGetResp:
"""
Translate text. Request and response like a sugoi translator - https://github.com/leminhyen2/Sugoi-Japanese-Translator/tree/main
Translate text. Request and response like a sugoi translator - https://github.com/leminhyen2/Sugoi-Japanese-Translator
This allows the query to be used in integration programs such as a Translator++ - http://dreamsavior.net/docs/translator/
:param str text: text to translate.

View file

@ -32,8 +32,10 @@ def start(core: AppCore):
"no_speech_threshold": 0.6,
"word_timestamps": True,
"hallucination_silence_threshold": 1,
"prompt": "",
"carry_initial_prompt": False,
"initial_prompt": "",
"compression_ratio_threshold": 2.4,
"logprob_threshold": -1.0,
"output_file_name_template": "%%source%%.src_sub",
},
@ -84,8 +86,10 @@ def file_processing(core: AppCore, file_struct: ProcessingFileStruct, req: Proce
no_speech_threshold=options["no_speech_threshold"],
word_timestamps=options["word_timestamps"],
hallucination_silence_threshold=options["hallucination_silence_threshold"],
prompt=options["prompt"],
carry_initial_prompt=options["carry_initial_prompt"],
initial_prompt=options["initial_prompt"],
compression_ratio_threshold=options["compression_ratio_threshold"],
logprob_threshold=options["logprob_threshold"]
)
if transcribe:

View file

@ -22,7 +22,7 @@ def start(core: AppCore):
"translate_prefix": "<i>",
"translate_postfix": "</i>",
},
"remove_src_postfix": ".src_sub",
"remove_src_filename_postfix": ".src_sub",
"translate_delimiter": "\n",
"output_file_name_template": {
"preserve_original": "%%source%%.%%from_lang%%_%%to_lang%%",
@ -73,7 +73,7 @@ def file_processing(core: AppCore, file_struct: ProcessingFileStruct, req: Proce
def processed_file_name(core: AppCore, file_struct: ProcessingFileStruct, req: ProcessingFileDirReq) -> str:
options = core.plugin_options(plugin_name)
src_postfix = options["remove_src_postfix"]
src_postfix = options["remove_src_filename_postfix"]
return file_processor.file_name_from_template(file_struct=file_struct, req=req, options=options).replace(src_postfix + ".", ".")