Мобильное приложение "Переводчик мансийского языка"
Мобильное приложение перевода реализовано на Flutter (frontend) и FastAPI (backend). Приложение отправляет текст на сервер, где запрос обрабатывается через языковую модель, после чего результат возвращается пользователю.
Разработка переводчика мансийского языка актуальна для сохранения и возрождения культуры и языка малочисленных народов ханты и манси. Это способствует поддержке их идентичности, помогает в образовании и коммуникации, а также сохраняет уникальное языковое наследие для будущих поколений.
Приложение уникально, так как аналогов для перевода с/на мансийский язык практически нет. Использует современные технологии (Flutter и FastAPI), обеспечивая высокую производительность и кроссплатформенность.
Проект Mansirus лицензирован под Apache License 2.0. Модель машинного перевода, используемая в приложении, разработана Югорским НИИ информационных технологий (ЮНИИТ) и также лицензирована под Apache License 2.0.
Проект разработан в рамках конкурса «Молодой изобретатель Югры» 2024г. Приложение было разработано всего за одну неделю. Этот сжатый срок разработки может повлиять на качество и функциональность приложения. В результате, некоторые аспекты, такие как тестирование, оптимизация и пользовательский интерфейс, могли быть упрощены или не полностью реализованы.
Несмотря на это, я стремился создать рабочий прототип, который может быть улучшен и доработан в будущем на основе отзывов пользователей и дополнительных исследований.
⚠️ Нарушение принципа единственной ответственности (SRP): Классы, такие как TranslationViewModel и TranslationService, выполняют несколько задач (управление состоянием, взаимодействие с API, логирование). Это может привести к усложнению и затруднениям в тестировании и поддержке.- ❌ Обработка ошибок: Обработка ошибок реализована, но можно улучшить. Рассмотреть возможность выбрасывания пользовательских исключений вместо возврата строки с сообщением.
- 🔗 Конфигурация API: URL-адреса API жестко закодированы. Вынести их в конфигурацию или использовать переменные окружения.
- ⏱️ Таймауты: Таймауты установлены, но для checkApiAvailability можно использовать более короткий таймаут.
Существует две вариации использования API:
- Можно развернуть API локально.
- Если вы разворачиваете свой API, используете файл
translation_custom_service.dart
. В этом файле вы можете настроить логику обработки запросов и интеграцию с вашей моделью перевода.
- Можно использовать API от ЮНИИТ, если оно рабочее.
- Если вы используете API от ЮНИИТ, используйте файл
translation_uriit_service.dart
. Этот файл уже настроен для работы с API ЮНИИТ и включает необходимые параметры для взаимодействия с их сервисом, но убедитесь, что apiUrl корректный.
Для развертывания собственного API сервера выполните следующие шаги:
-
Установите необходимые библиотеки. Вам понадобятся следующие библиотеки:
- Flask
- Flask-CORS
- transformers
Вы можете установить их с помощью pip:
pip install Flask Flask-CORS transformers
-
Создайте файл app.py и вставьте в него следующий код:
from flask import Flask, request, jsonify
from flask_cors import CORS
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
app = Flask(__name__)
CORS(app) # Включаем CORS для всего приложения
# Загрузка модели и токенизатора
tokenizer = AutoTokenizer.from_pretrained("Neira/nllb-200-3.3B-ru-mns-2.0.2", tgt_lang="rus_Cyrl", src_lang="mancy_Cyrl", token="256151")
model = AutoModelForSeq2SeqLM.from_pretrained("Neira/nllb-200-3.3B-ru-mns-2.0.2", token="256151")
def translate_text(text, direction):
# Токенизация текста
inputs = tokenizer(text, return_tensors="pt")
# Перевод текста
outputs = model.generate(**inputs)
translated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
return translated_text
@app.route('/translate/<direction>', methods=['POST'])
def translate(direction):
data = request.get_json()
text = data.get('text', '')
if not text:
return jsonify({'error': 'Text is required'}), 400
# Проверка направления перевода
if direction not in ['ru_to_mns', 'mns_to_ru']:
return jsonify({'error': 'Invalid translation direction'}), 400
# Выполнение перевода
translated_text = translate_text(text, direction)
return jsonify({'translated_text': translated_text})
@app.route('/health', methods=['GET'])
def health_check():
return jsonify({'status': 'API is running'}), 200
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000)
- Запустите сервер:
python app.py
- Теперь ваш API сервер будет доступен по адресу http://localhost:8000. Вы можете использовать его для перевода текста между мансийским и русским языками.