transcriptrion-service
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-запросы конкретной структуры от фронт-энд компонент.