Skip to content

① 데이터 준비

SBV2 학습에는 (wav 파일, 대응되는 텍스트) 쌍과 화자 메타데이터가 필요합니다.

녹음본만 가지고 이걸 수작업으로 만드는 건 시간이 많이 걸리는 일이라, HayaKoe는 이 과정을 브라우저 기반 GUI로 묶어 놓았습니다.

위치는 dev-tools/preprocess/ 입니다.

준비

이 단계는 영상에서 오디오를 추출하는 데 FFmpeg 를 사용합니다.

ML 의존성은 전체 흐름 페이지의 준비하기 에서 받은 uv sync 에 모두 포함되어 있지만, FFmpeg 는 시스템 패키지라서 별도 설치가 필요합니다.

FFmpeg 설치 (Ubuntu / Debian)

bash
sudo apt update
sudo apt install ffmpeg

설치가 끝나면 버전이 출력되는지 확인합니다.

bash
ffmpeg -version

실행

전처리 도구 실행

bash
# 레포 루트에서
uv run poe preprocess

브라우저로 http://localhost:8000 에 접속하면 대시보드를 볼 수 있습니다.

실행했더니 "address already in use" 오류가 뜬다면

8000번 포트를 다른 프로그램이 이미 쓰고 있다는 뜻입니다.

오류 예시는 보통 이런 모양입니다.

text
ERROR:    [Errno 98] error while attempting to bind on address
('0.0.0.0', 8000): address already in use

--port 옵션으로 비어 있는 다른 포트를 지정해서 다시 실행하면 됩니다 (예: 8123).

bash
uv run poe preprocess --port 8123

이 경우 접속 주소도 http://localhost:8123 으로 바뀝니다.

기본 워크플로우

대시보드에 처음 들어가면 다음과 같은 화면이 보입니다.

HayaKoe 전처리 대시보드 메인 화면 — 상단 워크플로우 가이드와 단계별 카드

상단의 WORKFLOW 영역이 전체 흐름을 한눈에 보여주고, 그 아래로 같은 단계가 카드 형태로 펼쳐집니다.

위에서부터 순서대로 따라가면 되며, 앞 단계가 끝나야 다음 단계 카드가 활성화됩니다.

1. 화자 등록

학습 대상이 되는 화자의 이름을 등록합니다.

화자명은 본인이 알아볼 수 있는 식별자면 무엇이든 괜찮습니다 (예: tsukuyomi).

2. 영상 업로드

학습 소스가 될 영상을 업로드합니다.

영상뿐 아니라 mp3·wav·flac 같은 오디오 파일도 그대로 받을 수 있습니다 — 내부에서 FFmpeg 가 동일하게 처리합니다.

업로드가 끝나면 영상 카드가 목록에 추가되고, 카드를 클릭하면 해당 영상의 전처리 파이프라인 페이지로 이동합니다.

영상별 6단계 파이프라인

영상 상세 페이지에 들어가면 상단에 6단계 진행 바가 뜨고, 아래 NEXT STEP 카드의 버튼으로 현재 단계를 하나씩 실행합니다.

각 단계가 끝나면 자동으로 "완료" 로 바뀌고, 다음 단계가 열립니다.

중간에 끊기고 다시 들어와도 남은 단계부터 이어갑니다.

1. 추출

오디오 추출 단계 — 상단 진행 바에서 1단계 활성, NEXT STEP 카드에 '추출 실행' 버튼

원본 데이터에서 음성만 추출하여 저장합니다.

추출이 끝나면 다음 단계로 넘어가면 됩니다.

내부 동작

내부적으로 FFmpeg 를 이용해 extracted.wav 파일을 추출합니다.

업로드한 파일이 이미 mp3·wav·flac 같은 오디오 파일이면 내용은 그대로 두고 포맷만 wav 로 변환합니다.

2. 배경음 제거

배경음 제거 단계 — 2단계 활성, NEXT STEP 카드에 '배경음 제거 실행' 버튼

BGM·효과음 같은 배경 소리를 걷어내고, 사람 목소리만 남깁니다.

파일 길이에 비례해 수 분이 걸릴 수 있으니 기다려 주세요.

내부 동작

audio-separator 라이브러리로 보컬만 분리해 vocals.wav 로 저장합니다.

3. VAD 세그먼팅

VAD 세그먼팅 단계 — 빠른 설정과 세부 파라미터 입력, 'VAD 세그먼팅 실행' 버튼

긴 녹음을 무음 구간 기준으로 짧은 문장 단위로 자릅니다.

기본값으로 먼저 실행해 보고, 분할 결과가 마음에 안 들면 네 개 파라미터를 조정해서 같은 영상에서 다시 추출할 수 있습니다.

  • 세그먼트 최소 길이 (초) — 이보다 짧은 음성은 버립니다. TTS 학습에는 1-2초를 권장합니다.
  • 세그먼트 최대 길이 (초) — 이보다 긴 대사는 자동으로 쪼갭니다. 5-15초가 적당합니다.
  • 음성 감지 임계값 — 일단 낮은 값(0.2~0.3)으로 시작해서, 잡음이 너무 많이 잡히면 조금씩 높이는 방향을 추천합니다.
  • 대사 간 최소 무음 (ms) — 일단 기본값으로 시작하세요. 여러 화자가 연속해서 말해 한 세그먼트에 섞이면 값을 줄이고, 한 대사가 너무 짧게 잘리면 값을 늘리는 방향으로 튜닝합니다.
내부 동작

Silero VAD 로 음성 활동 구간을 감지하고, 위 파라미터에 맞춰 잘라낸 결과를 vad.jsonsegments/unclassified/*.wav 로 저장합니다.

다시 실행하면 segments/unclassified/ 가 덮어씌워집니다.

4. 분류

분류 단계 — 세그먼트가 자동 재생되고, 화자 번호 키나 버튼으로 배정

잘라낸 세그먼트가 하나씩 자동 재생됩니다.

들리는 목소리의 화자 번호 키(1-9)나 버튼을 눌러 배정하세요.

잡음·음악·등록하지 않은 사람의 목소리는 버리기(D) 로 제외합니다.

동작
1-9해당 번호의 화자로 배정
D버리기
R다시 듣기
Z되돌리기

상단 진행 바에서 남은 세그먼트 개수를 확인할 수 있고, 전부 처리하면 분류 완료 버튼을 눌러 다음 단계로 넘어갑니다.

내부 동작

분류 결과는 segments/<화자>/ 구조로 저장됩니다.

5. 전사

전사 단계 — NEXT STEP 카드에 '전사 실행' 버튼

각 세그먼트의 음성을 듣고 일본어 텍스트로 자동 변환합니다.

변환 결과는 다음 단계에서 직접 수정할 수 있으니, 여기서는 실행 버튼만 누르면 됩니다.

내부 동작

Whisper 모델로 전사한 결과를 transcription.json 에 저장합니다.

6. 검토

검토 단계 — 세그먼트 목록과 일본어 텍스트 편집 UI, 상단에 '검토 완료' 버튼

자동 전사 결과를 확인하고 오류를 수정합니다.

일본어를 모른다면 일단 넘어가도 괜찮습니다. 학습 후 품질이 낮다고 느껴지면 그때 돌아와 수정해도 좋습니다.

  • 재생 버튼 을 눌러 실제 발화를 들으며 텍스트와 비교합니다.
  • 텍스트를 클릭하면 바로 수정 할 수 있습니다 (Enter 로 저장, Esc 로 취소).
  • 의미 없는 구간이나 잘못된 세그먼트는 × 버튼으로 삭제합니다.
  • 전부 확인했으면 우측 상단 검토 완료 버튼을 눌러 다음 단계로 넘어갑니다.
내부 동작

검토 완료 마커는 review_done.json 에 저장됩니다.

여러 영상으로 데이터 모으기

한 화자에 대해 여러 개의 영상을 업로드할 수 있습니다.

영상마다 위 6단계를 반복해서 데이터를 쌓을수록 학습 품질이 올라갑니다. 처리가 끝난 데이터 기준으로 최소 10분, 30분 이상이면 대개 충분 합니다.

영상 상세 페이지 좌측 상단의 ← 목록 버튼으로 대시보드에 돌아가 다음 영상을 업로드하세요. 모든 영상의 검토까지 끝난 뒤 아래 데이터셋 생성 단계로 넘어갑니다.

데이터셋 생성

모든 영상의 검토까지 끝나면 대시보드에서 데이터셋 생성 버튼이 활성화됩니다.

val_ratio 한 값만 지정하면 학습용 데이터셋이 자동으로 만들어집니다 (기본 0.1).

val_ratio 란?

전체 데이터에서 학습에 쓰지 않고, 학습이 잘 되고 있는지 중간 점검에 쓸 비율 입니다.

학습에 사용한 데이터만으로는 모델이 그 문장만 외우고 새 문장은 어색하게 만들 수 있습니다. 그래서 일부 데이터를 일부러 빼 두고, 학습 도중 그 데이터로 합성한 결과가 자연스러운지 따로 확인합니다.

기본값 0.1 (10%) 이면 대부분의 경우 충분합니다.

생성된 데이터셋은 ② 전처리 & 학습 CLI 가 자동으로 인식하므로, 바로 다음 단계로 넘어갈 수 있습니다.

내부 동작 — 데이터셋 구조와 기본 설정

생성되는 디렉토리 구조:

data/dataset/<speaker>/
├── audio/                          # 모든 영상의 세그먼트를 한곳에 복사
│   └── <video_id>_<orig_seg>.wav
├── esd.list                        # <abspath>|<speaker>|JP|<text>
├── train.list                      # esd.list의 (1 - val_ratio) 랜덤 분할 (seed 42)
├── val.list                        # esd.list의 val_ratio 랜덤 분할
└── sbv2_data/
    └── config.json                 # SBV2 JP-Extra 기본 설정

config.json 의 주요 기본값:

  • model_name: "hayakoe_<speaker>"
  • version: "2.7.0-JP-Extra"
  • train.epochs: 500, batch_size: 2, learning_rate: 0.0001
  • train.eval_interval: 1000, log_interval: 200
  • data.sampling_rate: 44100, num_styles: 7
  • style2id: Neutral / Happy / Sad / Angry / Fear / Surprise / Disgust

이 값들은 ② 전처리 & 학습 단계의 학습 설정 편집 에서 바꿀 수 있습니다.

내부 동작 — data/ 루트 전체 구조

--data-dir ./data 기준 최종 구조:

data/
├── speakers.json         # 등록된 화자 목록
├── videos/               # 영상별 전처리 작업 공간
│   └── <001, 002, ...>/
│       ├── source.<ext>
│       ├── meta.json
│       ├── extracted.wav
│       ├── vocals.wav
│       ├── vad.json
│       ├── segments/
│       ├── classification.json
│       ├── transcription.json
│       └── review_done.json
└── dataset/              # 학습 단계의 입력
    └── <speaker>/        # ← CLI가 이 경로를 자동 인식

CLI 는 data/dataset/ 아래에서 esd.list 또는 sbv2_data/esd.list 를 가진 디렉토리를 자동으로 리스트업합니다.

다음 단계