LINUX.ORG.RU

Argos Translate: офлайн-переводчик для Linux

 , ,


1

3

Понадобилось переводить офлайн. Устанавливать программу для Windows через wine желания не было. Решением стала программа Argos Transllate. Она написана на Python, работает в терминале, и есть графический интерфейс пользователя. Об опыте установки и использования этой программы и будет написано ниже.

Установка: ничто не предвещало беды

Автор предлагает устанавливать программу так: $ pip install argostranslate. Доверимся автору и попробуем:

$ pip install argostranslate

Команда «pip» не найдена, но может быть установлена с помощью:
sudo apt install python3-pip

Обычное дело, не хватает нужной программы, установим её:

$ sudo apt install python3-pip

Следующие НОВЫЕ пакеты будут установлены:
  binutils binutils-common binutils-x86-64-linux-gnu build-essential bzip2 dpkg-dev
  fakeroot g++ g++-13 g++-13-x86-64-linux-gnu g++-x86-64-linux-gnu gcc gcc-13
  gcc-13-x86-64-linux-gnu gcc-x86-64-linux-gnu javascript-common
  libalgorithm-diff-perl libalgorithm-diff-xs-perl libalgorithm-merge-perl libasan8
  libbinutils libc-dev-bin libc-devtools libc6-dev libcc1-0 libcrypt-dev
  libctf-nobfd0 libctf0 libdpkg-perl libexpat1-dev libfakeroot
  libfile-fcntllock-perl libgcc-13-dev libgprofng0 libhwasan0 libitm1 libjs-jquery
  libjs-sphinxdoc libjs-underscore liblsan0 libpython3-dev libpython3.12-dev
  libquadmath0 libsframe1 libstdc++-13-dev libtsan2 libubsan1 linux-libc-dev
  lto-disabled-list make manpages-dev patch python3-dev python3-pip
  python3-setuptools python3-wheel python3.12-dev rpcsvc-proto zlib1g-dev

Чёт многовато всего устанавливается, добавим опцию --no-install-recommends:

$ sudo apt install python3-pip --no-install-recommends

Следующие НОВЫЕ пакеты будут установлены:
  python3-pip python3-setuptools python3-wheel

Отлично, установили pip, теперь можно вернутся к $ pip install argos-translate, пробуем и получаем ошибку:

error: externally-managed-environment

If you wish to install a non-Debian packaged Python application,
    it may be easiest to use pipx install xyz, which will manage a
    virtual environment for you. Make sure you have pipx installed.

Ну ооокей, установим pipx который which will manage a virtual environment for you, делаем:

$ sudo apt install pipx

Следующие НОВЫЕ пакеты будут установлены:
  pipx python3-argcomplete python3-packaging python3-pip-whl python3-platformdirs
  python3-psutil python3-setuptools-whl python3-userpath python3-venv
  python3.12-venv

Готово. Теперь пробуем установить argos-translate. Это который раз? Третий, кажется ;-)

$ pipx install argos-translate

installed package argostranslate 1.9.6, installed using Python 3.12.3
  These apps are now globally available
    - argos-translate
    - argospm
⚠️  Note: '/home/ivanov/.local/bin' is not on your PATH environment variable.
    These apps will not be globally accessible until your PATH is updated. Run
    `pipx ensurepath` to automatically add it, or manually modify your PATH in your
    shell's config file (i.e. ~/.bashrc).
done! ✨ 🌟 ✨

Ничего не предвещало беды, но что то оно долго устанавливалось… Ну прям долго. Это на нормальном ПК и скорости подключения 100 Мбит/с. Что же оно такое качало? Что же оно устанавливало? И сколько это все занимает места на диске? Давайте посмотрим:

du -sh .cache/pip ./.local/share/pipx/venvs/argostranslate

2,9G	.cache/pip
5,3G	./.local/share/pipx/venvs/argostranslate

АААА! Ух тыыы! Какая красотааа! Удивлению моему не было предела. И это при том, что корень без /home использует диск на 8,2Gib. То есть один переводчик использует столько же места на диске, как и сама система, прикольно :-)

Ради интереса проверим, работает ли оно:

$ pipx ensurepath #Добавим путь .local/bin в переменную $PATH. Закрываем окно терминала и открываем новое. 

Запускаем:

$ argos-translate --from-lang en --to-lang ru "hello"
usage: argos-translate [-h] [--from-lang FROM_LANG] [--to-lang TO_LANG] [TEXT]
argos-translate: error: 'en' is not an installed language.

Нет, не работает. Не установлена поддержка языка. И это при скачанных восьми гигабайтах… Хорошо, установим поддержку языка:

$ ./.local/bin/argospm install translate-en_ru

Скачалось и установилось быстро. Проверяем работу:

$ argos-translate --from-lang en --to-lang ru "hello"

/home/ivanov/.local/share/pipx/venvs/argostranslate/lib/python3.12/site-packages/stanza/models/tokenize/trainer.py:85: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature.
  checkpoint = torch.load(filename, lambda storage, loc: storage)
привет

Предупреждение больше, чем перевод… На этом моменте хочется удалить программу, всё что она скачала, и пойти искать другое решение. Однако я решил попробовать другой способ установки, также описанный автором программы.

Установка, способ второй: 8Gib дискового пространства снова на воле

Удалим всё то, что пришло и «скромно» заняло место на диске:

$ rm -rf  ./.cache/pip ./.cache/pipx ./.local/share/pipx ./.local/bin/argos* ./.local/share/argos-translate/ ./.local/cache/argos-translate

$ sudo apt purge pip pipx -y && sudo apt autopurge -y

# Не забудьте удалить .local/bin путь из переменной $PATH, отредактировав для этого ваши .profile .bashrc .bash_profile

Устанавливаем другим способом. Нам понадобится git, чтобы клонировать репозиторий программы:

$ sudo apt install git

Клонируем репозиторий:

$ git clone https://github.com/argosopentech/argos-translate.git
Получение объектов: 100% (3862/3862), 3.75 МиБ

Теперь, перейдем в скачанный репозиторий и создадим в нем виртуальное окружение:

$ cd argos-translate

$ sudo apt install python3-virtualenv --no-install-recommends

$ virtualenv env

Отлично, активируем созданное окружение и установим всё необходимое:

$ source ~/argos-translate/env/bin/activate

$ pip install -e .

Установилось быстро, места на диске употребило 600Mib. Многовато, но не 8Gib как было.

Теперь установим поддержку нужного перевода и сделаем тест:

$ argospm install translate-en_ru

$ argos-translate -f en -t ru "Argos Translate uses OpenNMT for translations and can be used as either a Python library, command-line, or GUI application. "

Argos Translate использует OpenNMT для переводов и может использоваться как библиотека Python, командная строка или приложение GUI.

It’s finally over! Мог бы подумать пользователь, но нет. Оказалось, что программа медленно переводит текст, не важно какой он величины. Программа каждый раз загружает себя в ОЗУ, выполняет работу, и? И выгружается из ОЗУ. Оно и понятно, зачем ей быть постоянно загруженной? Однако когда переводы один за другим, хочется скорости, чтобы программа не выгружалась.

Для этого есть скрипт. Создадим его $ touch ~/argos-translate/env/bin/argos-fast && chmod u+x ~/argos-translate/env/bin/argos-fast и укажем содержимое:

#!/usr/bin/env python3

# argos repl
# reduce translation time
# from (13 + 8 + 2) = 23 seconds to 2 seconds
# https://github.com/argosopentech/argos-translate

src_lang = "en"
dst_lang = "ru"

import time

# If the readline module was loaded, then input() will use it
# to provide elaborate line editing and history features.
import readline

# 13 seconds
print("importing argostranslate... ", end="")
t1 = time.time()
import argostranslate.translate
t2 = time.time()
print(f"done in {(t2 - t1):.1f} seconds")

# hide warnings: "Language %s package %s expects mwt, which has been added"
import logging
logging.getLogger("stanza").disabled = True

prompt_format = "{}: "
src_prompt = prompt_format.format(src_lang)
dst_prompt = prompt_format.format(dst_lang)

# load the language model
# 8 seconds
print("loading the language model... ", end="")
t1 = time.time()
argostranslate.translate.translate("hello", src_lang, dst_lang)
t2 = time.time()
print(f"done in {(t2 - t1):.1f} seconds")

print()

while True:
    try:
        src = input(src_prompt)
    except (EOFError, KeyboardInterrupt):
        break
    # translate
    # 2 seconds
    t1 = time.time()
    dst = argostranslate.translate.translate(src, src_lang, dst_lang)
    dt = time.time() - t1
    print(dst_prompt + dst + "\n")
    #print(dst_prompt + dst + "\n" + f"dt = {dt}\n") # debug: print time

Запускаем скрипт и видим приглашение к переводам:

$ argos-fast 
importing argostranslate... done in 9.6 seconds
loading the language model... done in 8.1 seconds

en: Hello my wife
ru: Привет моей жене

en:

Установка графического пользовательского интерфейса

Если вам нужен графический пользовательский интерфейс, установите его:

$ pip install argostranslategui #Замечание! ГПИ устанавливать ТОЛЬКО после установки консольного argostranslate, иначе он скачает 8Gib ;-)

Выглядит ГПИ так. Шрифт мелкий, на системные настройки не реагирует. Его можно увеличить из gnome-tweaks увеличением scaling-factor, что не приемлемо для меня. Но возможно, кому то подойдет.

Как запускать?

Чтобы запустить программу нужно активировать окружение: $ source argos-translate/env/bin/activate, тогда будут доступны argos-translate, argos-translate-gui, argos-fast.

Деактивируется окружение командой $ deactivate.

Опыт использования

Переводит программа хорошо и быстро. Но не любит переносов строки, например если скопировать абзац за раз из PDF, то переведет плохо. Если скопировать тот же абзац но по одной строке, переведет отлично.

Если использовать скрипт argos-fast или ГПИ, то оперативной памяти программа употребит 700-800Mib. Если использовать просто программу, то потребление озу будет пиком, то есть употребит 800Mib,перевод выполнит, и сбросит.

Надеюсь эта краткая заметка будет полезна тем, кому нужен нативный офлайн-переводчик для Linux :-). Спасибо за внимание и чтение.



Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 4)

If you wish to install a non-Debian packaged Python application, it may be easiest to use pipx install xyz

Ага, я так wlc в третий раз поставил, который иначе не хотел повторно устанавливаться, хотя раньше ставился как раз через pip3. :)

Питоняши (c) наверняка объяснят ТСу, что он делал не так, а я считаю материал интересным и полезным. Но конечно, интересно, что за алгоритмы у этой программы под капотом. Нейросети?..

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

хотя раньше ставился как раз через pip3

Что нужно создавать виртуальное окружение для программ на пайтон, я знал. Но другой пользователь может и не знать. Поэтому так и писал, с позиции пользователя нулевого опыта.

Питоняши (c) наверняка объяснят ТСу, что он делал не так

Тут больше вопрос к автору программы. Можно было описать только один метод установки вместо двух. Где клонируется репозиторий гита. Но автор почему то описал именно два (sic!) метода установки, и при первом копируется 8Gib пакетов.

Но конечно, интересно, что за алгоритмы у этой программы под капотом. Нейросети?..

Не вникал в техническую часть, нужны были оффлайн переводы и я удовлетворился что нашел этот священный грааль ;-) но сам автор пишет что это: OpenNMT is an open source ecosystem for neural machine translation and neural sequence learning.

bloody_enterprise
() автор топика
Ответ на: комментарий от bloody_enterprise

Можно было описать только один метод установки вместо двух. Где клонируется репозиторий гита. Но автор почему то описал именно два (sic!) метода установки

Ну всё-таки клонирование репозитория – достаточно сложный метод, для разработчиков. Другое дело, что в случае питонософта «пользовательские» методы установки, бывает, оказываются ненамного проще, а и то и совсем не проще, как, видимо, и случилось в описанном примере (см. также прошлогодний опрос с неоднозначными результатами, там комментарии не менее интересны, чем распределение голосов).

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)

Не хочу занудствовать, но если использовать GPU, то не проще тогда ollama + какая-нибудь модель для перевода?

IPR ★★★★★
()
Ответ на: комментарий от kirill_rrr

Очевидно что нет. Оно же скачивает зависимости. У себя я использовал виртуальную машину c Debian, минимальной установки. В ней и поставил это всё. Хожу туда по ssh.

bloody_enterprise
() автор топика
Ответ на: комментарий от bloody_enterprise

А узнать список зависимостей и поставить без помощи пипа?

Хотя с другой стороны, необходимость изолировать всё это наглухо не отменяется.

kirill_rrr ★★★★★
()
Последнее исправление: kirill_rrr (всего исправлений: 1)
Ответ на: комментарий от kirill_rrr

А узнать список зависимостей и поставить без помощи пипа?

Это называется опакечиванием и делается мейнтейнерами дистрибутивов, либо пользователями, которые могут. Поиск показывает, что для Debian пока никто не удосужился это сделать, а в Arch к примеру есть пакеты:

https://aur.archlinux.org/packages/argos-translate

Так что вопросы/претензии к автору программы выше не обоснованы - он будучи питоняшей привёл стандартные для питоняш способы установки.

Кстати ещё есть LibreTranslate, предоставляющий веб-интерфейс и API.

pisemsky
()

Хорошо - это насколько хорошо? Гугл уже и с патентами неплохо справляется. Лучше профессионального переводчика, не знающего специфики патентов и не догадывающегося о ее существовании. И даже Чехова после Гугла можно читать не без удовольствия, если не брать во внимание странный местами выбор слов.

Так или иначе, радует, что такая штука доступна локально в качестве, устраивающем по меньшей мере одного ЛОРчанина.

Статья шедеврально написана. Путь героя, сюжетные повороты, испытания, трехактная структура… Хоть кино снимай.

Vidrele ★★★
()

Я пользуюсь следующим локальным переводчиком: https://github.com/XapaJIaMnu/translateLocally.

Вроде, с ним было на порядки меньше мороки. Из коробки там, вроде, нет модели с русским языком, поэтому пришлось поискать подходящую модель в интернете.

rOgret
()

Я пользуюсь: DeepL CLI

К библиотеке просто написал небольшое приложение, чтобы показывало перевод выделенного в окне.

#!/usr/bin/python3

import os
import sys
import asyncio

from deepl import deepl
from PyQt5.QtWidgets import QApplication,QWidget,QTextEdit,QVBoxLayout,QMessageBox
from PyQt5.QtGui import QFont
from asyncqt import QEventLoop

class TextEditWindow(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.closeFunc = None

        self.setWindowTitle("Translation")
        self.resize(500, 470)

        self.textEdit = QTextEdit()
        self.textEdit.setReadOnly(True)

        font = QFont("Liberation Serif", 14)

        self.textEdit.setFont(font)

        layout = QVBoxLayout()
        layout.addWidget(self.textEdit)
        self.setLayout(layout)

    def closeEvent(self, event):
        if self.closeFunc:
            self.closeFunc()

    def setText(self, text):
        self.textEdit.setPlainText(text)

    def setClose(self, closeFunc):
        self.closeFunc = closeFunc

    def textTranslated(self, future):
        result = future.result()
        self.setText(result)

    async def translate(self, dl, selected_text):
        try:
            return await dl.translate_async(selected_text)
        except Exception as e:
            return str(e)


if __name__ == '__main__':
    selected_text = os.popen('xsel').read()

    dl = deepl.DeepLCLI("en", "ru", timeout=30000, use_dom_submit=True)
    app = QApplication(sys.argv)

    if not selected_text:
        msg = QMessageBox()
        msg.setIcon(QMessageBox.Information)
        msg.setWindowTitle("Translation")
        msg.setText("No text selected!")
        msg.setStandardButtons(QMessageBox.Ok)
        msg.exec_()
        sys.exit(0)

    loop = QEventLoop(app)
    asyncio.set_event_loop(loop)

    def cancel_translation():
        task.cancel()

    win = TextEditWindow()
    win.setClose(cancel_translation)
    win.setText("Translating...")
    win.show()

    task = loop.create_task(win.translate(dl, selected_text))
    task.add_done_callback(win.textTranslated)

    sys.exit(app.exec_())
Skullnet ★★★★★
()
Ответ на: комментарий от rOgret

Это не оффлайн перевод, но я просто поделился ссылкой на приложение.

Skullnet ★★★★★
()
Ответ на: комментарий от hobbit

Но конечно, интересно, что за алгоритмы у этой программы под капотом. Нейросети?..

Да. А по зависимости от pytorch разве не заметно?

rebforce
()

А существует какой-нибудь онлайн вариант, чтобы через API получать какой-нибудь JSON с переводом? Раньше вроде было (гугл?), но потом что-то случилось.

dmitry237 ★★★★
()
Ответ на: комментарий от dmitry237

онлайн вариант, чтобы через API получать какой-нибудь JSON с переводом

LibreTranslate, можно самостоятельно развернуть или использовать готовый инстанс, например https://translate.disroot.org/

Под капотом используется сабжевый переводчик.

pisemsky
()

Почему-то всегда «программа офлайн-переводчик» вызывает смешанные чувства - возникает пресуппозиция что её создатели наверняка заморочились с интерфейсом и забили на собственно SotA-подходы непосредственно к переводу, хотя если логически подумать - вроде они все должны руку на пульсе держать. Читаешь такую статью, в которой описаны проблемы с virtualenv и составом пакета, без разбора для чего оно там было нужно и как вообще устроено, и уже не хочется идти смотреть что же там в OpenNMT сейчас происходит.

(выше уже упомянули что можно взять ollama, и запустить там любую модельку, и дергать её с промптом для хорошего перевода на свой вкус, получится лучше любой васянской поделки с гуем вокруг OpenNMT)

ei-grad ★★★★★
()

pip install argostranslate
pipx install argos-translate

Почему один раз тире нет, второй раз - есть?

Xintrea ★★★★★
()
Ответ на: комментарий от IPR

так и делаю кстати скачал lmstudio, в ней же выбрал модельку поприличнее, в ней же все чатики и история ведутся, все локально, красиво, в системе не прописывается, ни от чего не зависит, работает шустро на любой современной видюхе

ddf
()

В NixOS это всё делается простым nix-shell -p python3Packages.argostranslate.

hateyoufeel ★★★★★
()

Шрифт мелкий, на системные настройки не реагирует. Его можно увеличить из gnome-tweaks увеличением scaling-factor, что не приемлемо для меня.

Там же QT5. Просто сделай

export QT_SCALE_FACTOR=1.5
export QT_FONT_DPI=96

перед запуском

adn ★★★★
()

Ужас. Боль. Современность. Пиптонообразие.

Я, конечно понимаю, перевод с помощью новомодной ИИ. Но неужели он в таком виде лучше чем старый добрый Голдендикт?

А питон - вот насколько я люблю питон, настолько же ненавижу его экосистему, все эти пипы, торчи

R_He_Po6oT ★★★★★
()
Ответ на: комментарий от R_He_Po6oT

Я, конечно понимаю, перевод с помощью новомодной ИИ. Но неужели он в таком виде лучше чем старый добрый Голдендикт?

Голдендикт — это словарь, а не переводчик.

CrX ★★★★★
()
Ответ на: комментарий от CrX

Я понимаю, но автор после всех мучений получил переводчик, который даже абзацами не переводит. После всех мучений. Так и Голдендикт мог, не? Давно пользовался, но кажется там была возможность переводить предложения. Хотя... Может это он через гугл делал.

R_He_Po6oT ★★★★★
()
Ответ на: комментарий от R_He_Po6oT

Я понимаю, но автор после всех мучений получил переводчик, который даже абзацами не переводит.

Переводит же, просто переносы строк не любит. Причём, я так понимаю, дело не в переносах строк между абзацами, а в переносах строк как раз там, где их не должно быть — внутри абзаца, при копировании из PDF. А это фиксится простейшим скриптом, который при копировании тупо эти переносы все на пробел будет заменять, да и всё. Хоть бы даже и с помощью tr.

Это довольно логичное следствие того, что наверное модель «воспринимает» перенос строки как конец предложения. Человек, в принципе, тоже часто так делает.

Так и Голдендикт мог, не? Давно пользовался, но кажется там была возможность переводить предложения. Хотя… Может это он через гугл делал.

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

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)
Ответ на: комментарий от R_He_Po6oT

Так и Голдендикт мог, не? Давно пользовался, но кажется там была возможность переводить предложения. Хотя… Может это он через гугл делал.

Нет, и не мог, и сейчас не может.

dataman ★★★★★
()
Ответ на: комментарий от CrX

внутри абзаца, при копировании из PDF

Ах воот... Это я упустил из виду. Да, но при импорте из pdf у меня вообще иногда белиберда получается. Это хорошо, если у него только переносы портят. У меня иногда непонятно какие символы вылезают и слова склеены, или из другого столбца прихватит. При чём в официальной документации такое встречается. Заметил ещё, что есть разница -вставлять через ctrl+C, ctrl+V, или средней кнопкой мыши. Когда мышью, даже мусора меньше. Вот.

R_He_Po6oT ★★★★★
()
Ответ на: комментарий от dataman

Буквоедствуй сколько хочешь. Но когда я смотрю на современные машинные переводы - меня мучает мысль - куда ушли все эти гигаватты и терабайты, «кремний» и человекочасы? Очень напоминает те «неправильные» переводы.

R_He_Po6oT ★★★★★
()
Ответ на: комментарий от R_He_Po6oT

Я не буквоедствую, а очищаю информацию от дезы. Для других, более доверчивых, читателей.

dataman ★★★★★
()
Ответ на: комментарий от CrX

Так оффлайн же. Откуда оно берет лексику? Чет я не въезжаю. Или при установке оно стянет на комп еще гигабайты каких-то данных?

Gonzo ★★★★★
()
Ответ на: комментарий от Gonzo

Там для каждой пары языков отдельно ставится, в ОП: $ ./.local/bin/argospm install translate-en_ru. Сколько весит, не знаю знаю.

CrX ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.