Realtime Speech-to-Text

OvenMediaEngine Enterprise 0.20.0.0-1 버전부터 Whisper를 활용한 Realtime Speech-to-Text (STT) 기능을 지원합니다.

OvenMediaEngine (OME) 0.20.0 이상 버전부터 whisper.cpp와의 연동을 통해 실시간 자동 자막을 지원합니다. 이 기능은 Live Audio Stream을 실시간으로 Text로 변환하며, 인식된 음성을 선택적으로 영어로 번역할 수 있습니다.

실시간 변환 성능을 위해 NVIDIA GPU가 필요합니다. CPU를 통한 추론은 속도가 느려 번역 싱크가 맞지 않거나 불완전한 텍스트를 출력할 수 있으므로 지원하지 않습니다.

Prerequisites

NVIDIA GPU 및 Driver

다음 명령어를 사용하여 GPU 및 Driver 상태를 확인하십시오:

Driver가 설치되어 있지 않은 경우, NVIDIA 웹사이트에서 다운로드하거나 OvenMediaEngine Repo에서 제공하는 helper script를 사용하십시오.

circle-exclamation

CUDA Toolkit

GPU Acceleration을 사용하여 whisper.cpp를 빌드하려면 CUDA Toolkit이 필요합니다.

whisper.cpp 빌드 및 설치

OvenMediaEngine 소스 루트 경로에서 최신 prerequisites.sh 스크립트를 실행하여 whisper.cpp를 빌드하고 설치하십시오.

STT Configuration

STT Configuration은 두 개의 섹션으로 나뉩니다.

  • Server.xml 내 <Modules><Whisper>: 시작 시, Model File을 GPU 메모리에 미리 로드합니다.

  • <Application><Subtitles>: STT Output이 기록될 Subtitle Rendition (label, language 등)을 정의합니다.

  • <Application><OutputProfiles><MediaOptions><STT>: STT Engine을 통해 입력된 Audio Track을 Subtitle Rendition에 연결합니다.

circle-exclamation

Step 1: Model 사전 로드 (Server.xml)

Server 시작 시, 로드할 Whisper Model File을 <Modules><Whisper> 내부에 선언하십시오. 여러 개의 <PreloadModel> 항목을 사용할 수 있습니다. GPU 활용도를 극대화하기 위해 Model은 File Size가 큰 순서대로 로드됩니다.

<PreloadModel> 항목은 다음 필드를 가집니다:

Key
Description

Path

Model File의 경로입니다. 절대 경로 또는 Configuration Directory 기준 상대 경로를 지정하여 사용할 수 있습니다.

Devices

Model을 로드할 CUDA Device 인덱스 목록입니다. 쉼표로 구분하여 입력합니다.

  • 사용예: 0, 0,1, 2

all로 설정하면 사용 가능한 모든 GPU에 로드합니다. 이를 생략하면 기본값은 Device 0입니다.

circle-info

<PreloadModel>은 선택 사항입니다. 생략하면 해당 Model은 이를 사용하는 첫 번째 Stream이 Publish될 때, On-demand 방식으로 로드됩니다. 따라서, 프로덕션 환경에서는 첫 번째 Stream에서 발생할 수 있는 지연을 최소화하기 위해 사전 로드를 권장합니다.

Step 2: Subtitle Rendition 정의

STT Output이 기록될 Subtitle Track을 정의합니다. <Subtitles>에 대한 자세한 내용은 Subtitles 섹션을 참조하십시오.

Step 3: OutputProfiles에서 STT 구성

<OutputProfiles><MediaOptions><STT> 내 Audio-to-Subtitle 매핑마다 하나의 <Rendition>을 추가하십시오. <OutputSubtitleLabel> 값은 <Subtitles>에 정의된 <Label>과 일치해야 합니다.

<STT><Rendition> configuration에는 다음 옵션이 포함됩니다:

Key
Description

Engine

사용할 STT Engine을 선택합니다.

  • 현재는 whisper만 지원합니다.

Model

whisper.cpp Model File의 경로입니다. 절대 경로 또는 Configuration Directory (Server.xml이 위치한 경로) 기준, 상대 경로를 사용할 수 있습니다.

InputAudioIndex

변환할 Input Stream 내 Audio Track의 Index입니다.

  • 기본값은 0이고, 이는 첫 번째 Audio Track을 의미합니다.

OutputSubtitleLabel

변환 결과를 기록할 Subtitle Rendition의 Label입니다. 이 값은 <Subtitles>에 정의된 값을 사용합니다.

SourceLanguage

Input Audio의 언어 코드입니다. ISO 639-1 형식을 사용합니다.

  • 언어 코드 예: ko, en, ja

자동 감지 기능을 사용하려면 auto로 설정하십시오.

Translation

true로 설정하면 인식된 Text를 영어로 번역합니다.

  • 현재 Whisper는 영어 번역만 지원합니다.

StepMs

각 추론 호출 전에 수집할 새로운 Audio 길이 (밀리초)입니다.

  • 기본값은 2000입니다.

이값을 낮추면 Subtitle 지연은 줄어들지만 GPU 부하가 증가할 수 있습니다.

LengthMs

각 추론 호출 시, Whisper에 전달되는 Audio Window의 전체 길이 (밀리초)입니다.

  • 기본값은 10000입니다.

Window가 클수록 Model이 더 많은 문맥을 확보할 수 있어 정확도 향상에 도움을 줄 수 있습니다.

KeepMs

Context Reset 이후 이전 Window에서 다음 Window로 유지할 Audio 길이(밀리초)입니다.

  • 기본값은 1500입니다.

Window 경계에서 단어가 잘리는 현상을 줄이는 데 도움을 줄 수 있습니다.

Modules

이 STT Rendition을 실행할 GPU를 선택합니다. Video Encoder Modules와 동일한 형식 (nv:0, nv:1)을 사용합니다. 이를 생략하면 GPU 0이 선택되며, 여러 Rendition을 서로 다른 GPU에 분산하려는 경우에 사용하십시오.

Model

Model File을 https://huggingface.co/ggerganov/whisper.cpparrow-up-right에서 다운로드할 수 있습니다:

  1. ggml-small.bin과 같은 더 작은 Model은 더 빠른 추론 속도를 제공하는 대신 정확도가 낮습니다.

  2. ggml-medium.bin 또는 ggml-large.bin과 같은 더 큰 Model은 더 높은 정확도를 제공하지만, 그만큼 더 많은 GPU 메모리와 연산 시간이 필요합니다.

REST API를 통한 Runtime Control

STT는 Server를 재시작하거나 Stream을 다시 생성하지 않아도 Runtime 중 일시 중지하거나 재개할 수 있습니다. 이 기능은 특정 Stream에서 일시적으로 변환을 비활성화해야 하는 경우에 유용합니다. 예를 들어, 광고 중이거나, 해당 Stream 내 Audio 비중이 낮은 경우 이 기능을 통해 GPU Resource를 절약할 수 있습니다.

요청/응답 상세 및 오류 코드를 포함한 전체 API는 STT Control을 참조하십시오.

Endpoint
Description

POST :enableStt

해당 Stream에 대해 STT 추론을 재개합니다.

POST :disableStt

STT 추론을 일시 중지하며, GPU 처리 없이 Audio Frame을 Drop합니다.

POST :sttStatus

현재 활성화 상태와 Rendition별 Configuration을 조회합니다.

시작 시, STT 비활성화하기

<STT> Block 내부에 <Enable>false</Enable>를 설정하면, STT가 비활성화된 상태 (일시 중지 상태)로 시작할 수 있습니다. 이 경우 Stream이 :enableStt Call을 받기 전까지 GPU 추론을 수행하지 않습니다.

Last updated