คู่มือปฏิบัติ · PIPER TTS

จากเสียงบันทึก
สู่เสียงพูด

ขั้นตอนสำคัญในการเตรียมข้อมูลเสียงและฝึกโมเดล Piper ขีดจำกัดของ Kaggle อาจเปลี่ยนแปลงได้: โปรดตรวจสอบโควตาของคุณก่อนการฝึกที่ใช้เวลานาน

01โครงสร้างไฟล์เก็บถาวร

สร้างชุดข้อมูล LJSpeech สำหรับ Piper TTS

LJSpeech คือรูปแบบมาตรฐานที่ Piper คาดหวัง แต่ละประโยคคือไฟล์ WAV แยกกัน จับคู่กับคำถอดความใน metadata.csv

data.zip
├── metadata.csv   # nom_du_fichier|transcription
└── wavs/
    ├── 000001.wav
    └── ...
  1. 01

    รวบรวมไฟล์เสียง

    ใช้เสียงบันทึกที่คุณมีสิทธิ์ประมวลผลและเผยแพร่ต่อได้ แหล่งที่มาอาจเป็นวิกิเกม สื่อที่คุณเป็นเจ้าของ หรือชุดข้อมูลสาธารณะ

  2. 02

    ตัดเสียงเป็นประโยค

    เตรียมไฟล์ WAV 1 ไฟล์ต่อ 1 ประโยค สำหรับการตัดอัตโนมัติหรือการจัดแนว คุณสามารถใช้:

    • audiosplitter · การตัดอัตโนมัติ
    • Montreal Forced Aligner (MFA) · การจัดแนวแบบบังคับ
    • faster-whisper + VAD · การถอดความและเวลาประทับ
    • Audacity · การตัดด้วยตนเองสำหรับปริมาณน้อย
  3. 03

    สร้าง metadata.csv

    1 บรรทัดต่อ 1 ไฟล์ ตัวคั่นคือขีดแนวตั้ง ชื่อต้องตรงกับไฟล์ในโฟลเดอร์ wavs/ ทุกประการ

    000001.wav|นี่คือประโยคตัวอย่าง
    000002.wav|นี่คืออีกประโยคหนึ่งสำหรับการฝึก
  4. 04

    บีบอัดไฟล์เก็บถาวร

    วาง metadata.csv และโฟลเดอร์ wavs/ ไว้ที่รากของไฟล์เก็บถาวร

    zip -r data.zip metadata.csv wavs/
  5. 05

    อัปโหลดไปยัง Hugging Face

    สร้างที่เก็บข้อมูลชุดข้อมูล เช่น user/wheatley-english-ljspeech เพิ่ม data.zip และ README.md ที่มีการตั้งค่า:

    ---
    configs:
    - config_name: default
      data_files:
      - split: train
        path: data.zip
    ---
  6. 06

    เผยแพร่ในฟอรัม Piper

    สร้างกระทู้ในช่องชุดข้อมูลและการฝึก พร้อมลิงก์ Hugging Face และแท็กที่เหมาะสม

    เปิดช่อง Discord ↗
02KAGGLE · GPU

ฝึกเสียงบน Kaggle

Kaggle จัดสรรโควตา GPU ให้บัญชีของคุณ และอาจแตกต่างกันตามความพร้อมใช้งาน โปรดตรวจสอบตัวนับก่อนเริ่มเซสชันที่ใช้เวลานาน

โควตา GPU รายสัปดาห์30 ชั่วโมง · บางครั้งมากกว่า

Kaggle ระบุพื้นฐาน 30 ชั่วโมงต่อสัปดาห์ ซึ่งอาจสูงกว่านั้นขึ้นอยู่กับความต้องการและทรัพยากรที่มี โควตาจะรีเซ็ตในวันเสาร์เวลา 00:00 UTC

ระยะเวลาสูงสุดของหนึ่งเซสชัน12 ชั่วโมง

เอกสาร Kaggle ระบุขีดจำกัดต่อเนื่อง 12 ชั่วโมงสำหรับเซสชัน CPU และ GPU โน้ตบุ๊ก CPU ไม่ใช้โควตา GPU แต่ระยะเวลาเซสชันยังถูกจำกัด

ตัวเร่งความเร็วที่มีT4 x2

Kaggle ปลดระวาง Tesla P100 เมื่อวันที่ 15 กันยายน 2026 T4 x2 ยังมีในโน้ตบุ๊ก โปรดเลือกตัวนี้สำหรับการฝึก Piper แทนการทำตามคู่มือ P100 รุ่นเก่า

↻

ทำต่อหลังการหยุดชะงัก

การฝึกเต็มรูปแบบมักเกิน 12 ชั่วโมงของหนึ่งเซสชัน โน้ตบุ๊ก Piper ของโปรเจกต์นี้จะทำต่อจากเช็กพอยต์ Hugging Face: หลังการตัดการเชื่อมต่อหรือโควตาหมด ให้เรียกใช้อีกครั้งเพื่อทำต่อจากเช็กพอยต์ล่าสุดที่บันทึกไว้

ก่อนการฝึกที่ใช้เวลานาน

  • ตรวจสอบโควตาที่เหลือในการตั้งค่าโน้ตบุ๊ก โปรไฟล์ของคุณ หรือหน้าการใช้งานตัวเร่งความเร็ว
  • หยุดเซสชัน GPU เมื่อคุณไม่ได้ใช้งาน
  • ใช้ T4 x2; P100 ไม่มีบน Kaggle แล้ว

โควตา ตัวเร่งความเร็ว และอินเทอร์เฟซของ Kaggle อาจเปลี่ยนแปลงได้ โปรดตรวจสอบข้อมูลที่แสดงในบัญชีของคุณก่อนการฝึกเสมอ

03PIPER · LOCAL TTS

ใช้เสียง Piper

ติดตั้ง Piper รับไฟล์ 2 ไฟล์ของเสียงที่เลือก แล้วสร้าง WAV ในเครื่อง คำสั่งด้านล่างใช้เวอร์ชันที่ดูแลโดย Open Home Foundation

  1. 01

    ติดตั้ง Piper

    Piper เผยแพร่เป็นแพ็กเกจ Python คู่มือรุ่นเก่าที่ใช้ที่เก็บข้อมูล rhasspy/piper หรือไฟล์ไบนารีของที่เก็บนั้นหมายถึงรุ่นประวัติศาสตร์

    python -m pip install piper-tts
    python -m piper.download_voices en_US-lessac-medium
  2. 02

    ดาวน์โหลดเสียง

    เลือกเสียงในแคตตาล็อกแล้วดาวน์โหลดโมเดล ONNX กับไฟล์การตั้งค่า JSON คู่กัน เก็บทั้ง 2 ไฟล์ไว้ด้วยกัน เส้นทาง JSON คือเส้นทางโมเดลตามด้วย .json

    voice.onnx
    voice.onnx.json
  3. 03

    สร้างไฟล์ WAV

    ดาวน์โหลดเสียงจากแคตตาล็อก Piper ก่อน หรือแทนที่ชื่อด้านล่างด้วยเส้นทางไฟล์ .onnx ของคุณ

    python -m piper -m ./voice.onnx -f output.wav -- "Bonjour, ceci est un test."
  4. 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
  5. 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)
  6. 06

    กับ Home Assistant

    Piper เชื่อมต่อกับ Home Assistant ผ่าน Wyoming เพิ่ม Piper ใน การตั้งค่า → อุปกรณ์และบริการ แล้วใช้การกระทำ tts.speak กับเอนทิตี TTS Piper

    ตั้งค่า Piper ใน Home Assistant ↗

    กับ Node-RED

    แพ็กเกจ node-red-contrib-piper-tts ที่กล่าวถึงในคู่มือบางฉบับไม่ได้รับการยืนยันในแคตตาล็อกสาธารณะ ทางเลือกหนึ่งคือเรียกคำสั่ง Piper จากโหนด Exec ในตัว ปรับเส้นทางและสิทธิ์ให้เข้ากับการติดตั้งของคุณ

  7. 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."
04NODE.JS · TYPESCRIPT

ผสาน Piper ในโปรเจกต์ Node.js ด้วย pipertts

pipertts นำ Piper มาสู่ Node.js ทั้งแบบเขียนไฟล์หรือเสียงในหน่วยความจำ โหมดที่แนะนำคือ PiperNativeTTS: การอนุมานแบบเนทีฟ 100% ในกระบวนการ (ONNX + สะพาน espeak ที่คอมไพล์แล้ว) ไม่ใช้ Python เร็วกว่า wrapper ประมาณ 10 เท่า เสียง (.onnx + .onnx.json) ยังคงเป็นไฟล์แยกกัน

  1. 01

    ติดตั้งการพึ่งพา

    เอกสารระบุ Node.js 18+ และ TypeScript 5+ โหมดเนทีฟไม่ต้องการอย่างอื่น: npm install ครั้งเดียวก็พอ โหมด wrapper แบบคลาสสิก (PiperTTS ผ่าน python3 -m piper) ต้องการ Python และโมดูล Piper เพิ่ม การเลือกด้วยรหัสแคตตาล็อกอาจดาวน์โหลดโมเดลกับการตั้งค่าลงใน models/

    npm install pipertts
    # mode wrapper uniquement : python3 -m pip install piper-tts
  2. 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);
  3. 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 });
  4. 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() ให้การเข้าถึงระดับต่ำ ทีละประโยค

  5. 05

    Wrapper รุ่นเก่า (PiperTTS)

    PiperTTS เรียก python3 -m piper 1 กระบวนการต่อการสังเคราะห์ 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");