transcriptrion-service

0

Описание

Языки

  • Go90,2%
  • Python6,2%
  • Dockerfile3,6%
README.md

transcriptrion-service

Сервис для сохранения аудиозаписей вопросов и ответов в БД с их последующей отправкой на транскрибацию.

Состоит из двух микросервисов: сервиса, отвечающего за запись аудо-байтов вопросов и ответов и их транскрипций в БД (Stenographer), и сервиса, отвечающего за транскрибацию аудиозаписей (Transcriptor).

Stenographer

Использует GORM для записи аудиобайтов и транскрипций в БД PostgreSQL. Слушает порт 8080 по http, по которому принимает запросы от фронт-энд сервисов, и поддерживает эндпоинты:

  • "/save-answer": в теле запроса должен быть json объекта Answer с его аудио-байтами. Сохраняет ответ (Answer) в БД в таблицу answer.
  • "/save-question": в теле запроса должен быть json объекта Question с его аудио-байтами. Сохраняет вопрос (Question) в БД в таблицу question.
  • "/get-question-and-answer?question_id=A": получает транскрипцию вопроса и ответа по ID вопроса, равному А.
  • "/get-questions-and-answers?interview_id=A": получает транскрипции всех вопросов и ответов по ID собеседования, равному А.
  • "/transcript-interview?interview_id=A": возвращает стенограмму всего собеседования по ID собеседования, равному А, в примерно таком формате:
Интервьюер: Тогда вопрос: что такое мьютекс? Ответчик: Мьютекс - это примитив синхронизации, обеспечивающий взаимное исключение исполнения критических участков кода. Интервьюер: Отлично, ответ принят.

В сервисе присутствует 5 параллельно исполняемых процесса:

  • HandleRequests - слушает запросы по порту 8080 на эндпоинты, описанные выше.
  • TranscribeQuestion - с интервалом TRANSCRIPTOR_INTERVAL проверяет наличие нетранскрибированных записей в таблице question. Если таковые есть, отправляет их сервису Transcriptor на транскрипцию. После получения транскрипции записывает ее в поле таблицы.
  • TranscribeAnswer - делает то же, что и предыдущий процесс, но с таблицей Answer.
  • SquashTranscribedAnswers - собирает ответы в рамках одного запроса (одинакового question_id) в один ответ. Ожидает финального чанка с интервалом TRANSCRIPTOR_SQUASH_INTERVAL, затем удаляет все такие ответы и заменяет их одним с финальной транскрипцией. Этот процесс необходим, поскольку аудио-чанков ответа может прийти несколько.
  • SquashTranscribedQuestions - делает то же, что и предыдущий процесс, но с таблицей Answer.
  • SendSummarizedAnswersToQM - отправляет неоцененные ответы сервису QuestionManager для оценки, и затем записывает его ответ в БД.

Переменные окружения для Stenographer:

  • DB_ADDRESS=db - адрес БД
  • DB_PORT=5432 - порт БД
  • DB_USER=user - пользователь БД
  • DB_PASSWORD=password - пароль БД
  • DB_NAME=postgres - имя БД
  • TRANSCRIPTOR_ADDRESS='transcriptor:8000' - адрес сервиса Transcriptor
  • TRANSCRIPTOR_INTERVAL=2000 - интервал поиска нетранскрибированных записей и отправки их на транскрибацию
  • TRANSCRIPTOR_SQUASH_INTERVAL=5000 - интервал поиска и сквоша ответов
  • QUESTION_MANAGER_EVALUATION_INTERVAL=10000 - интервал поиска неоцененных ответов

Transcriptor

Написан на Python, использует Speech2Text модель whisper-v3-turbo. Слушает 8000 порт, принимает запрос с телом из аудио-байтов и возвращает транскрипцию полученной аудиодорожки. Загружает модель только первый раз, затем использует ее из локальной папки transcriptor/local_model.

Запуск сервиса

Сервис завязан на взаимодействие с фронт-энд компонентами. Запускается командой

Stenographer будет доступен для http-запросов на порту 8080, Transcriptor - на 8000. После запуска Stenographer будет ждать http-запросы конкретной структуры от фронт-энд компонент.