대본을 게임 속 목소리로 만들기
Unreal Engine 5.5-5.8용 VoiceDirector 단계별 안내입니다. 대사를 가져오고, 녹음하거나 생성한 테이크를 비교한 뒤 게임에서 재생할 오디오 에셋으로 게시하세요.
버튼과 필드 이름은 플러그인에 표시되는 영어로 유지합니다. 작업 방법은 한국어로 설명합니다.
VoiceDirector의 역할
#VoiceDirector는 Unreal 에디터에서 대사 음성을 제작하는 도구입니다. 직접 준비한 텍스트에 음성을 지정하거나 녹음을 가져오고, 들어 본 뒤 게임에 쓸 테이크를 선택합니다. 결과는 Unreal의 표준 오디오 에셋인 SoundWave입니다. 대화 연결을 설정하면 DialogueWave도 만들 수 있습니다.
| 탭 | 용도 |
|---|---|
| Lines | 대본 가져오기, 대사 선택, 테이크 듣기와 승인. |
| Voices | 캐릭터와 언어별 공급자 음성 할당. |
| Jobs | 생성 진행 상황 확인과 새 테이크 열기. |
| Publish | 게임 오디오 에셋 변경을 검토하고 적용. |
| Settings | 연결, 출력, DataTable 매핑 및 제한 설정. |
대사는 대본의 한 항목, 언어 변형은 그 대사의 특정 언어 버전, 테이크는 한 번의 녹음 또는 생성 결과입니다. 여러 테이크를 보관하면서 게임은 기존 소리를 계속 사용하게 할 수 있습니다.
기존 WAV로 시작할 수 있습니다. AI 생성은 선택 사항입니다. VoiceDirector는 대사를 쓰거나 번역하거나 목소리를 복제하지 않으며, 게임 실행 중 음성을 생성하지 않습니다.
설치하고 열기
#처음 Unreal 프로젝트 만들기
- Epic Games Launcher > Unreal Engine > Library에서 UE 5.5, 5.6, 5.7 또는 5.8을 실행합니다.
- Games > Third Person을 고르고 Blueprint, Desktop을 선택합니다. 블루프린트는 노드를 연결하는 시각적 프로그램이며, 이 안내에서는 C++가 필요 없습니다.
- 프로젝트 이름과 여유 공간이 있는 폴더를 지정하고 Create를 눌러 에디터를 기다립니다.
플러그인 추가
사용 중인 Unreal 버전용 Windows x64 빌드를 사용하세요. Fab 설치는 Launcher 라이브러리에서 해당 엔진 버전에 추가합니다. 프로젝트 설치는 에디터를 닫은 뒤 플러그인 폴더 전체를 YourProject/Plugins/VoiceDirector/에 넣습니다. Plugins가 없으면 만드세요.
YourProject/Plugins/VoiceDirector/VoiceDirector.upluginVoiceDirector 폴더가 두 번 중첩되지 않아야 합니다. 블루프린트 전용 프로젝트는 컴파일된 패키지와 제공되는 빌드 파일이 필요합니다. 소스만 있는 패키지는 C++ 컴파일러와 직접 빌드가 필요합니다.
- 프로젝트를 다시 열고 Edit > Plugins에서 VoiceDirector를 찾아 켭니다.
- 요청하면 에디터를 재시작합니다.
- Tools > VoiceDirector를 엽니다.
엔진 또는 프로젝트 중 한 곳에만 설치하세요. 같은 플러그인의 사본 두 개는 프로젝트 시작을 방해할 수 있습니다.
첫 재생 가능한 대사
#이 과정은 제공된 녹음을 사용하므로 Kokoro나 ElevenLabs를 먼저 설정할 필요가 없습니다.
바로 가져올 수 있는 첫 대사
CSV 한 줄과 “Keep your voice down.”이라고 말하는 실제 WAV입니다. 로컬 Kokoro로 생성한 예제이며, 가져올 때 서버나 계정은 필요 없습니다.
- Settings의 Output Content folder (/Game/...)에
/Game/VoiceDirector/Audio를 입력하고 Save Output Folder를 누릅니다./Game은 프로젝트의 Content 폴더이며 Windows 드라이브가 아닙니다. - 예제 파일 두 개를 찾기 쉬운 폴더에 내려받습니다.
- Lines > Import script에서 Import SourceId에
MyScript를 넣습니다. Import CSV를 눌러 예제 CSV를 선택합니다. - 미리 보기를 확인하고 Apply Import를 누릅니다. Full snapshot은 끕니다.
L-001의 언어en을 선택하고 Import WAV로 예제 WAV를 가져옵니다.- 필요하면 Select take를 누른 뒤 Play를 누릅니다. “Keep your voice down.”이 들립니다. Stop으로 멈춥니다.
- Approve take를 누릅니다.
- Publish 또는 Review publishing을 엽니다. Refresh Preview를 누르고 새 SoundWave 행을 체크한 뒤 Apply Selected Approved를 누릅니다.
- Ctrl + Space로 Content Drawer를 열고 Content > VoiceDirector > Audio로 갑니다. 다음은 게임에서 재생하기입니다.
좁은 창에서는 Sources & filters로 가져오기, Take review로 검토를 엽니다. 대사를 두 번 클릭해도 검토가 열립니다. VD_... 이름은 정상이며 Copy로 경로를 복사할 수 있습니다.
대본 작성과 가져오기
#스프레드시트나 텍스트 편집기에서 대사를 작성하고 쉼표로 구분된 UTF-8 CSV로 내보냅니다.
LineId,CharacterId,Culture,Text,Context
L-001,rowan,en,Keep your voice down.,At the city gate| 열 | 의미 |
|---|---|
| LineId | 고정 대사 ID. 텍스트를 고쳐도 유지합니다. |
| CharacterId | 음성 할당에 쓰는 고정 캐릭터 ID. |
| Culture | en, fr, ru 같은 언어 코드. |
| Text | 표시할 대사이며 필수입니다. |
| Context | 선택적인 연기 지시나 장면 메모. |
| SpokenText | 정확히 말할 선택적 텍스트. 비어 있으면 Text 사용. |
| SourceNamespace / SourceKey / SourceRevision | 선택적 원본 메타데이터. |
Lines > Import script에서 고정 Import SourceId를 정하고 Import CSV를 선택합니다. Added / Changed / Archived / Unchanged를 확인하고 Apply Import를 누릅니다. 미리 보기만으로는 변경되지 않습니다.
재가져오기에는 같은 SourceId와 LineId를 써야 ID와 기존 테이크가 남습니다. 원본 내 LineId/Culture 쌍은 고유해야 합니다. 같은 LineId에 여러 언어를 쓸 수 있지만 캐릭터는 같아야 합니다.
Full snapshot은 이 원본과 가져온 언어 범위에서 누락된 대사를 보관 처리합니다. 해당 범위를 완전히 대체할 때만 켭니다. 끄면 누락된 행도 유지됩니다. 보관 처리는 녹음을 삭제하지 않습니다.
쉼표가 있는 셀은 큰따옴표로 감싸고 내부 따옴표는 두 번 씁니다: "그는 ""기다려.""라고 말했다". 세미콜론 CSV는 쉼표로 변환하세요. 제한: 16 MiB, 10,000행.
Unreal DataTable 가져오기
#DataTable은 Unreal 안의 표 에셋입니다. CSV나 수동 JSON 없이 바로 선택할 수 있습니다.
- Settings > Script DataTable에서 에셋을 선택합니다.
- 열을 LineId, CharacterId, Culture, Text와 선택 항목 Context, SpokenText에 매핑합니다. String, Name, Text를 지원합니다.
@RowName은 행 이름을 LineId로 씁니다. - 원본은 DataTable 에셋 경로로 자동 결정됩니다. Preview DataTable Import를 누릅니다.
- Lines에서 확인하고 Apply Import를 누릅니다.
새 표 만들기
Content Browser에서 Blueprint Structure를 만들고 String 필드 LineId, CharacterId, Culture와 Text 필드 Text, Context, SpokenText를 추가해 저장합니다. 이 구조체를 행 형식으로 쓰는 Data Table을 만들고 예제 행을 입력합니다. 최대 10,000행입니다.
VoiceDirectorScriptRow도 에디터 가져오기 형식으로 제공됩니다. 패키징된 게임에서 표를 쓰려면 자신의 런타임 구조체를 사용하세요. 게시한 SoundWave는 일반 게임 에셋입니다.
캐릭터 음성 할당
#음성은 Kokoro 또는 ElevenLabs의 기존 목록에서 옵니다. 할당은 음성을 CharacterId + Culture와 연결하며 새 모델을 만들지 않습니다.
- 다음 절에 따라 공급자를 설정합니다.
- Voices에서 공급자를 고르고 Check Connection / List Voices를 누릅니다. 음성 생성 없이 목록만 읽습니다.
- 대본의 CharacterId와 Culture를 입력하고 Voice, Model, 사용 가능한 옵션을 선택한 뒤 Save Voice Assignment를 누릅니다.
- Lines에서 한 변형을 골라 Generate new take를 누릅니다.
예제: rowan, en, 음성 af_heart, 모델 kokoro. 음성이 해당 언어를 지원해야 합니다. WAV 가져오기는 할당이 필요 없습니다. 변경은 이후 생성에만 적용되고 이전 테이크는 원래 설정을 유지합니다.
로컬 Kokoro 설정
#Kokoro-FastAPI는 컴퓨터 또는 접속 가능한 서버에서 따로 실행합니다. VoiceDirector는 설치하거나 시작하지 않습니다. 의존성과 모델 저장 공간을 준비하세요.
- Kokoro-FastAPI v0.9.0 공식 설치 안내를 따릅니다. Windows CPU에서는 필수 구성 요소와 모델을 준비하고 백엔드 폴더에서
.start-cpu.ps1을 실행합니다. - 서비스와 모델 로딩을 기다립니다. 기본 로컬 설치는 브라우저에서
http://127.0.0.1:8880/docs로 확인합니다. - Settings의 Kokoro-FastAPI base URL을
http://127.0.0.1:8880/v1로 설정하고 Save Settings를 누릅니다. - Voices에서 목록을 읽고
af_heart,kokoro, 영어en, 속도1.0으로 시작합니다.
Kokoro 속도는 0.5-2.0입니다. 언어는 모델과 음성에 따라 다릅니다. 러시아어 텍스트와 WAV는 가져올 수 있지만 이 Kokoro 연결은 러시아어를 생성하지 않습니다. 적절한 다른 소스를 사용하세요.
생성 중에는 서버를 유지하세요. 게시한 게임 오디오는 서버 없이도 재생됩니다.
ElevenLabs 설정
#자신의 계정, 크레딧, 권한이 있는 키가 필요합니다. 생성은 계정 할당량을 사용하므로 큰 작업 전에 요금을 확인하세요.
- ElevenLabs의 Developers > API Keys에서 키를 만들고 Voices: Read, Text to Speech: Access를 허용합니다. 모델을 제한한다면 사용할 모델을 허용합니다.
- Windows 시작 검색에서 계정의 환경 변수 편집을 엽니다. 사용자 변수에서 새로 만들기를 눌러 이름은
VOICEDIRECTOR_ELEVENLABS_KEY, 값은 키로 입력하고 확인합니다. - Unreal과 Epic Games Launcher를 트레이 프로세스까지 완전히 종료한 뒤 다시 시작합니다.
- Voices에서 ElevenLabs를 고르고 Check Connection / List Voices로 사용 가능한 음성과 모델을 선택합니다.
- 할당을 저장하고 먼저 짧은 대사 하나를 생성해 듣습니다.
키는 환경 변수에 둡니다. Settings에는 키 입력란이 없습니다. 대본, 에셋, 스크린샷, 지원 메시지에 키를 넣지 마세요.
플러그인은 pcm_24000을 요청하고 PCM 결과로 WAV를 만듭니다. 목록 조회 성공이 이 형식의 생성 권한을 보장하지는 않습니다. 속도는 0.7-1.2이며 스타일과 speaker boost는 모델 지원 시에만 가능합니다.
기존 키는 More Actions (...) > Edit에서 바꿉니다. 공식 키 안내를 참고하세요. 권한, 할당량, 지역 접근 문제는 공급자 쪽에서 해결한 뒤 재시도합니다.
생성과 작업 대기열
#- Lines에서 변형을 고릅니다. 여러 개는 Ctrl 또는 Shift로 선택합니다.
- 하나면 Generate new take, 여러 개면 Generate selected입니다. 공급자, 요청 수, 문자 수, 비용을 확인하고 진행합니다.
- Jobs에서 Pause는 새 전송 중지, Resume은 재개, Cancel은 남은 작업 중지입니다.
- Completed의 Open take를 누르면 정확한 녹음을 Lines에서 열고 숨기는 필터를 해제합니다.
완료된 테이크는 아직 검토, 승인, 게시가 필요합니다. 진단은 복사할 수 있습니다. 한 배치 최대 1,000개 변형, TTS 한 요청 최대 5,000자입니다.
UnknownRemoteOutcome은 요청을 보냈고 서버가 완료했을 수도 있지만 결과를 받지 못했음을 뜻합니다. 다시 생성하기 전에 공급자 기록을 확인하세요. 취소는 이미 보낸 요청을 회수하지 않습니다.
테이크 듣기와 선택
#검토 패널에는 녹음한 문장, 출처, 시간, 길이, 실제 WAV로 계산한 파형이 나옵니다. 다른 대사를 고르면 해당 기록이 열립니다.
| 상태 | 의미 |
|---|---|
| Selected | 검토 중인 테이크이며 게임 오디오는 바뀌지 않습니다. |
| Approved | 이 언어 변형에서 승인한 연기. |
| In game / 게시됨 | 다음 게시를 적용할 때까지 게임 에셋에 들어 있는 테이크. |
| Current / Stale / Unknown | 현재 알려진 입력과 일치하는지 여부. 텍스트나 음성 변경으로 오래된 상태가 될 수 있습니다. |
| Human / AI | WAV 가져오기 또는 공급자 생성. 가져온 WAV도 외부 AI가 만든 것일 수 있습니다. |
Select take, Play, Stop을 사용하고 만족하면 Approve take를 누릅니다. 모든 테이크가 남아 비교할 수 있습니다. 파형은 읽기 좋게 조정되므로 음량은 들어 보고 비교하세요.
자신의 녹음 가져오기
한 변형을 고르고 Import WAV를 누릅니다. 형식은 little-endian RIFF WAV, 16비트 PCM, 24 또는 48 kHz, 모노 또는 스테레오, 최대 64 MiB입니다. MP3, 부동소수점 WAV, 24비트 PCM은 먼저 변환합니다.
More line actions에는 잠금, 번역 검토, 고정 ID를 유지한 이름 변경, 대화 연결이 있습니다. 승인을 바꾸기 전에 잠금을 풉니다. 동일 입력으로 또 만들려면 Create another take even if input matches를 켭니다.
오디오 에셋 게시
#게시에만 게임 오디오 에셋이 바뀝니다. 가져오기, 생성, 승인만 하면 이전 소리를 유지합니다.
- Publish > Refresh Preview를 엽니다.
- 경로와 작업을 확인합니다. Create는 생성, Update는 갱신, Conflict는 해결이 필요합니다.
- 원하는 승인 행과 필요한 기본 SoundWave 또는 대화 의존 행을 선택합니다.
- Apply Selected Approved를 누르고 결과를 봅니다. Copy는 경로 복사입니다.
외부에서 수정했거나 저장되지 않았거나 읽기 전용인 에셋은 무조건 덮어쓰지 않습니다. 문제를 해결하고 새로 고칩니다. 오래된 승인 테이크는 stale takes를 허용하는 명시적 옵션이 필요하므로 먼저 텍스트와 소리를 비교하세요.
승인된 테이크와 현재 게임 테이크는 서로 다를 수 있습니다. Publish가 그 변경을 적용합니다.
게임에서 대사 재생
#- 레벨을 열고 주 도구 모음의 Blueprints > Open Level Blueprint를 선택합니다.
- Event BeginPlay를 찾습니다. 없으면 그래프를 우클릭해 추가합니다.
- 흰색 실행 핀에서 연결을 끌어 Play Sound 2D 노드를 만듭니다.
- Sound에 게시한 SoundWave를 지정합니다.
- Compile을 누르고 블루프린트와 레벨을 저장한 뒤 에디터의 Play를 누릅니다.
레벨 시작 시 대사가 재생됩니다. 공간 속 캐릭터에는 위치 오디오 노드와 자신의 대화 로직을 사용하세요. 패키지에 포함되도록 게임에서 에셋을 참조해야 합니다.
재생은 에디터 모듈, 키, TTS 서버 없이 동작합니다. Epic의 Play Sound 2D 문서를 참고하세요.
언어와 대화 컨텍스트
#번역은 같은 LineId와 CharacterId에 다른 Culture를 씁니다. 예: L-001,rowan,en, L-001,rowan,fr. 번역문과 해당 언어의 음성은 직접 제공합니다.
기본 원본 문화는 en입니다. 기본 SoundWave와 새 현지화 버전을 함께 게시합니다. Unreal의 /Game/L10N/<culture>/... 구조를 사용합니다. 게임은 기본 에셋을 참조하고 활성 문화로 현지화를 선택합니다.
Project Settings > Packaging에 필요한 문화와 국제화 데이터를 포함하세요. 에디터 언어만 바꾸면 게임 대사가 설정되지는 않습니다.
DialogueWave
화자와 선택적 청자의 DialogueVoice 에셋을 만듭니다. More line actions에서 Dialogue speaker, 청자, 고정 Context key를 정하고 Save Dialogue Context를 누릅니다. 필요한 SoundWave와 DialogueWave를 함께 게시합니다.
DialogueVoice는 대화 메타데이터이며 음성 모델이 아닙니다. LineId당 컨텍스트 하나입니다. 다른 컨텍스트는 별도 ID를 사용합니다.
성우 녹음 받기
#- 대본을 준비하고 Settings > Export Actor Manifest CSV를 누릅니다.
- 성우에게 매니페스트를 전달하고 ID, 요청한 WAV 이름, 지원 형식을 유지하도록 합니다.
- Choose Actor Manifest로 원본을, Choose Returned WAV Folder로 받은 폴더를 선택합니다.
- Preview Actor Matching으로 준비됨, 누락, 모호한 일치를 확인하고 파일을 먼저 수정합니다.
- 준비된 행을 골라 Import Selected Actor WAVs를 누른 뒤 듣고 승인하고 게시합니다.
테이크에는 원래 매니페스트의 문장이 남습니다. 녹음 중 대본이 바뀌었다면 오래된 상태일 수 있으므로 실제 발화와 비교하세요.
설정과 생성 제한
#Settings에는 Kokoro URL, 출력, DataTable, 성우 도구, 대기열 제한이 있습니다. 연결과 생성은 Save Settings, 출력은 Save Output Folder로 저장합니다.
요청 수와 문자 수를 제한합니다. USD 추정에는 1,000자당 가격을 직접 입력합니다. 가격 -1은 알 수 없음, 예산 -1은 금액 제한 없음입니다. 예산을 켰지만 가격이 없으면 계산 가능할 때까지 클라우드 생성을 막습니다.
추정은 입력한 가격 기준입니다. 크레딧 잔액이나 최종 청구 보장이 아닙니다. 공급자 할당량도 확인하세요.
로컬 에디터 설정이며 일반 작업에 JSON 편집은 필요 없습니다.
데이터 보관과 복구
#프로젝트 전체를 백업하세요.
| 폴더 | 내용 |
|---|---|
| Content/ | 게시된 에셋과 원본 DataTable. |
| VoiceDirector/ | 대본, 테이크 기록, 저장한 원본 WAV. |
| Saved/VoiceDirector/ | 로컬 설정, 작업 및 게시 저널, 복구용 사본. |
SoundWave 하나만으로 전체 기록을 복구할 수 없습니다. 한 프로젝트에 쓰는 에디터는 하나입니다. 읽기 전용이면 다른 에디터를 닫고 현재 에디터도 재시작해 쓰기 권한을 얻습니다. 다른 프로세스가 쓰는 잠금은 삭제하지 마세요.
생성 중단 후 Jobs를 확인합니다. 보냈지만 결과 불명인 요청은 자동 재전송하지 않습니다. 공급자 기록을 먼저 봅니다.
Publish에서 감지된 Review interrupted publication을 쓰거나 Restore From Publish Journal로 이 프로젝트의 Saved/VoiceDirector/Publish/<batch>/Journal.json을 선택합니다. 확인 문구를 읽으세요. 해결까지 저널과 사본을 보관합니다. 외부 수정은 충돌로 처리하고 새 에셋은 검토용으로 남을 수 있습니다. 필요하면 프로젝트 사본과 진단을 보존하고 지원에 문의하세요.
문제 해결
#| 증상 | 확인 사항 |
|---|---|
| 플러그인이 없음 | Edit > Plugins 활성화, 재시작, Tools, 맞는 UE 빌드와 사본 하나. |
| 버튼 비활성 | 올바른 선택, 잠금, 읽기 전용, 가져오기/대기열 진행 여부. 게시에는 승인 필요. |
| CSV 오류 | UTF-8, 쉼표, 정확한 필수 헤더, 빈 ID 없음, 고유 LineId/Culture, 진단 읽기. |
| Kokoro 목록 없음 | 서버 실행, /docs 접속, 저장 URL의 /v1, 목록 새로 고침. |
| ElevenLabs 거절 | 재시작으로 변수 상속, Voices: Read, Text to Speech: Access, 모델/형식, 크레딧 및 API 접근. |
| HTTP 429 | 공급자 지시대로 기다리고 배치를 줄여 수동 재시도. 빠른 연속 전송 금지. |
| 파형이나 소리 없음 | 원본 WAV와 지원 PCM, 출력 장치와 볼륨. 누락 파일은 백업에서 복구. |
| 결과 불명 | 재생성 전에 공급자 기록 확인. |
| Conflict | 진단/경로 확인, 외부 변경·미저장·읽기 전용 해결 후 새로 고침. |
| 게임에서 무음 | 실행 핀 연결, Sound 지정, 컴파일/저장, 볼륨, 에셋과 문화가 빌드에 포함됨. |
자주 묻는 질문
#첫 과정에 결제가 필요한가요?
CSV/WAV 가져오기와 에셋 재생에는 공급자 계정이 필요 없습니다. ElevenLabs는 자체 요금과 크레딧을 사용합니다. 로컬 Kokoro는 서버와 모델 설치가 필요합니다.
텍스트와 목소리는 어디서 오나요?
텍스트는 직접 제공합니다. 오디오는 WAV 또는 공급자에서 옵니다. VoiceDirector는 테이크를 정리하며 이야기 작성이나 음성 학습은 하지 않습니다.
C++나 JSON이 필요한가요?
컴파일된 패키지는 블루프린트 전용 프로젝트에서 동작합니다. 음성, 설정, DataTable은 화면에서 조작합니다. 소스 빌드는 별도의 개발 작업입니다.
새 테이크가 바로 게임 소리를 바꾸나요?
아니요. 듣고 승인한 뒤 게시를 적용해야 합니다. 그 전에는 이전에 게시한 테이크를 씁니다.
언어를 바꾸면 같은 항목으로 돌아오나요?
네. 현재 항목을 유지합니다. 버튼 이름은 플러그인과 같은 영어여서 찾기 쉽습니다.
패키징 게임에서 새 음성을 생성하나요?
VoiceDirector 1.0.0은 에디터 제작 도구입니다. 게임은 게시된 표준 에셋을 재생하며 실행 중 TTS는 제공하지 않습니다.
도움받기
#nexusforgeuesupport@gmail.com으로 VoiceDirector/Unreal 버전, 공급자, 재현 단계, 오류 문구, 관련 탭 스크린샷을 보내세요.
API 키는 보내지 마세요. 공유 가능한 작은 예제가 비공개 프로젝트 전체보다 유용합니다. 복구를 조사하기 전에 사본을 보관하세요.