Kaggle은 주 30시간을 기준으로 안내하며 수요와 자원에 따라 늘어날 수 있어요. 할당량은 토요일 00:00 UTC에 초기화돼요.
실전 가이드 · PIPER TTS
녹음에서
음성으로.
음성 데이터를 준비하고 Piper 모델을 학습하는 기본 단계예요. Kaggle 제한은 변경될 수 있으니 장시간 학습 전에 할당량을 확인하세요.
Piper TTS용 LJSpeech 데이터셋 만들기
LJSpeech는 Piper가 요구하는 표준 형식이에요. 각 문장이 별도의 WAV 파일이며 metadata.csv에 전사가 대응돼요.
data.zip
├── metadata.csv # nom_du_fichier|transcription
└── wavs/
├── 000001.wav
└── ...- 01
오디오 파일 모으기
처리와 재배포가 허용된 녹음을 사용하세요. 게임 위키, 보유한 미디어, 공개 데이터셋 등이 출처가 될 수 있어요.
Hugging Face에서 LJSpeech 데이터셋 찾기 ↗yt-dlp로 영상 소스 다운로드 - 02
문장 단위로 나누기
문장마다 WAV 파일 1개를 준비하세요. 자동 분할이나 정렬에는 다음 도구를 사용할 수 있어요.
- audiosplitter · 자동 분할
- Montreal Forced Aligner (MFA) · 강제 정렬
- faster-whisper + VAD · 전사와 타임스탬프
- Audacity · 소규모 데이터용 수동 편집
- 03
metadata.csv 만들기
파일마다 한 줄씩 작성하세요. 구분자는 세로 막대예요. 파일 이름은 wavs/ 안의 파일과 정확히 일치해야 해요.
000001.wav|이것은 예문입니다. 000002.wav|학습용 다른 문장입니다. - 04
아카이브 압축하기
metadata.csv와 wavs/ 폴더를 아카이브 루트에 넣으세요.
zip -r data.zip metadata.csv wavs/ - 05
Hugging Face에 업로드하기
데이터셋 저장소를 만드세요(예: user/wheatley-english-ljspeech). data.zip와 설정이 적힌 README.md를 추가하세요.
--- configs: - config_name: default data_files: - split: train path: data.zip --- - 06
Kaggle에서 음성 학습시키기
GPU 할당량은 Kaggle이 계정별로 부여하며 상황에 따라 달라져요. 장시간 세션을 시작하기 전에 카운터를 확인하세요.
Kaggle 문서에 따르면 CPU와 GPU 세션의 연속 제한은 12시간이에요. CPU 전용 노트북은 GPU 할당량을 쓰지 않지만 세션 시간 제한은 적용돼요.
Kaggle은 2026년 9월 15일에 Tesla P100을 종료했어요. 노트북에서는 T4 x2를 계속 사용할 수 있어요. Piper 학습에는 T4 x2를 선택하고 오래된 P100 안내를 따르지 마세요.
중단 후 이어하기
전체 학습은 12시간 세션을 초과하는 경우가 많아요. 이 프로젝트의 Piper 노트북은 Hugging Face 체크포인트에서 이어해요. 시간 초과나 할당량 소진 후에는 다시 실행해 최신 저장 체크포인트부터 계속하세요.
장시간 학습 전 확인 사항
- 노트북 설정, 프로필 또는 가속기 사용량 페이지에서 남은 할당량을 확인하세요.
- 사용하지 않는 GPU 세션은 중지하세요.
- T4 x2를 사용하세요. P100은 Kaggle에서 더 이상 제공되지 않아요.
Kaggle 할당량, 가속기, 화면은 변경될 수 있어요. 학습 전에는 계정에 표시된 정보를 반드시 확인하세요.
Piper 음성 사용하기
Piper를 설치하고 음성의 두 파일을 받은 뒤 로컬에서 WAV를 생성하세요. 아래 명령은 Open Home Foundation 관리 버전을 사용해요.
- 01
Piper 설치
Piper는 Python 패키지로 배포돼요. rhasspy/piper 저장소나 바이너리 압축 파일을 쓰는 오래된 안내는 구 버전을 가리켜요.
python -m pip install piper-ttspython -m piper.download_voices en_US-lessac-medium - 02
음성 다운로드
카탈로그에서 음성을 고르고 ONNX 모델과 대응하는 JSON 설정 파일을 다운로드하세요. 두 파일은 함께 보관하세요. JSON 경로는 모델 경로 뒤에 .json을 붙인 것이에요.
voice.onnx
voice.onnx.json - 03
WAV 파일 생성하기
먼저 Piper 카탈로그에서 음성을 다운로드하거나 아래 이름을 .onnx 파일 경로로 바꾸세요.
python -m piper -m ./voice.onnx -f output.wav -- "Bonjour, ceci est un test." - 04
파일에서 텍스트 읽기
python -m piper -m ./voice.onnx -f output.wav --input-file mon_texte.txt오디오 직접 재생하기
샘플링 주파수는 음성에 따라 달라요. voice.onnx.json을 확인하고 필요하면 22050을 바꾸세요.
echo "Bonjour." | python -m piper -m ./voice.onnx --output-raw | aplay -r 22050 -f S16_LE -c 1 -t raw - 05
Python에서 사용하기
import wave from piper import PiperVoice voice = PiperVoice.load("./voice.onnx") with wave.open("output.wav", "wb") as wav_file: voice.synthesize_wav("Bonjour le monde.", wav_file) - 06
Home Assistant와 함께 사용하기
Home Assistant는 Wyoming을 통해 Piper에 연결돼요. 설정 → 기기 및 서비스에서 Piper를 추가한 뒤 Piper TTS 엔티티로 tts.speak 동작을 사용하세요.
Home Assistant에서 Piper 설정하기 ↗Node-RED와 함께 사용하기
일부 안내에서 소개된 node-red-contrib-piper-tts 패키지는 공개 카탈로그에서 확인할 수 없었어요. 내장 Exec 노드에서 Piper 명령을 호출하는 방법이 있어요. 경로와 권한은 환경에 맞게 조정하세요.
- 07
출력 조정하기
품질은 학습 데이터와 선택한 음성에 따라 달라져요. length-scale을 높이면 느려지고 낮추면 빨라져요. noise-scale과 noise-w는 생성 편차를 조정해요.
python -m piper -m ./voice.onnx --length-scale 1.5 --noise-scale 0.667 --noise-w 0.8 -f lent.wav -- "Texte lent." python -m piper -m ./voice.onnx --length-scale 0.7 --noise-scale 0.667 --noise-w 0.8 -f rapide.wav -- "Texte rapide."
pipertts로 Node.js 프로젝트에 Piper 연동하기
pipertts는 Piper를 Node.js에서 쓸 수 있게 하며 파일 출력과 메모리 내 오디오를 지원해요. 권장 방식은 PiperNativeTTS예요. 프로세스 안에서 동작하는 100% 네이티브 추론(ONNX + 컴파일된 espeak 브리지)으로 Python이 필요 없고 래퍼보다 약 10배 빨라요. 음성(.onnx + .onnx.json)은 별도 파일로 유지돼요.
- 01
종속 항목 설치
문서에서는 Node.js 18 이상과 TypeScript 5 이상을 요구해요. 네이티브 방식은 추가로 필요 없이 일반 npm install이면 돼요. 기존 래퍼 방식(python3 -m piper 경유의 PiperTTS)은 Python과 Piper 모듈이 별도로 필요해요. 카탈로그 식별자를 지정하면 모델과 설정을 models/에 다운로드할 수 있어요.
npm install pipertts # mode wrapper uniquement : python3 -m pip install piper-tts - 02
카탈로그 음성으로 시작하기
import { PiperNativeTTS, resolveModelPathFromOptions } from "pipertts"; import * as fs from "node:fs"; const modelPath = await resolveModelPathFromOptions({ model: "en_US-lessac-medium", modelsDir: "./models", }); const tts = await PiperNativeTTS.load({ modelPath }); const { audio } = await tts.synthesize("Hello from Piper."); fs.writeFileSync("./hello.wav", audio); - 03
로컬 모델 사용하기
직접 다운로드한 음성은 ONNX 파일 경로를 전달하세요. 대응하는 .onnx.json 파일은 같은 위치에 두세요. 설정 위치가 다르면 configPath를 지정하세요.
import { PiperNativeTTS } from "pipertts"; const tts = await PiperNativeTTS.load({ modelPath: "./models/my-voice.onnx", }); const { audio, sampleRate } = await tts.synthesize("Hello.", { speakerId: 0 }); - 04
API와 출력 형식
synthesize()는 audio(Buffer), sampleRate, text를 반환해요. outputFile은 디스크에도 써요. 옵션: speakerId(다중 음성·다중 스타일), lengthScale(1보다 크면 느려지고 1보다 작으면 빨라짐), noiseScale, noiseWScale, sentenceSilence, normalizeAudio, volume, outputFormat(wav, raw, mp3, ogg, opus). mp3와 opus는 순수 JS 대체가 있으며 ogg는 FFmpeg이 필요해요. phonemize()와 synthesizeChunks()로 문장 단위의 저수준 접근이 가능해요.
- 05
기존 래퍼(PiperTTS)
PiperTTS는 python3 -m piper를 실행하며 합성마다 프로세스 1개를 써요. 약 10배 느리며 네이티브 엔진이 동작하지 않는 환경용이에요. Python과 Piper 모듈이 필요해요.
import { PiperTTS } from "pipertts"; const tts = await PiperTTS.create({ modelPath: "./models/en_US-lessac-medium.onnx", }); await tts.synthesizeToFile("Hello from the legacy wrapper.", "./hello.wav");
