Skip to content
ระบบเพลง + เนื้อเพลงสำหรับฝึกภาษา

ระบบเพลง + เนื้อเพลงสำหรับฝึกภาษา

yt-dlp โหลด FLAC + ซับ → srt-clean ทำความสะอาดอัตโนมัติ → mpv แสดงเนื้อร้องทีละบรรทัด
Language-learning music pipeline

ใช้ทำอะไร (Purpose)

yt-dlp "URL" ─► FLAC 44.1/16 + ปก + metadata + ซับ (คนพิมพ์ก่อน auto)
             ─► [Exec] srt-clean ─► ตัด [music]/>> + แก้เวลาทับ + เก็บ .orig
mpv          ─► ปก + เนื้อร้องทีละบรรทัด + ปุ่มฝึกภาษา ─► PipeWire ─► GEMAUDIO

FLAC 44.1/16 = เปิดในวิทยุรถได้ (ความเข้ากันได้ชนะความสมบูรณ์แบบ)

srt-clean: ออกแบบจากข้อมูลจริง

สมมติฐานเดิม (ผิด): ซับแบบ rolling บรรทัดซ้ำ
ข้อมูลจริง: แต่ละช่วงบรรทัดเดียว แต่ เวลาทับกัน 1–2 วินาที → mpv ซ้อน 2 บรรทัดแล้วเลื่อน = “วิ่งขึ้นลง”

#6  00:23.280 → 00:27.680   You can tell me every morning
#7  00:26.080 → 00:29.160   before your feet touch the     ← เริ่มก่อน #6 จบ

(sub-fix-timing ของ mpv แก้ได้แค่ทับ ≤ 0.2 วินาที)

วิธีแก้: ตัด [...] + >> → ลบช่วงว่าง → end = min(end, next.start)

ทดสอบ edge case:

กรณีผล
ไฟล์จริงทับ 0, ป้ายเหลือ 0
ท่อนซ้ำ (chorus)คงอยู่ครบ
ชื่อไฟล์มี [ ]หาเจอถูก
เพลงไม่มีซับข้าม ไม่ error (ไม่ให้ yt-dlp รายงานล้ม)
รันซ้ำผลเหมือนเดิม

เทียบกับ clean_srt.py เดิม: ไฟล์จริงได้ผลเหมือนกัน แต่ dedupe_rolling ลบประโยคซ้ำของท่อนฮุก และสร้าง .clean.srt (ชื่อหาย .en → mpv โหลด 2 แทร็ก)

ติดตั้ง (Setup)

mkdir -p ~/dotfiles/mpv/.config/mpv ~/dotfiles/yt-dlp/.config/yt-dlp ~/dotfiles/bin/.local/bin
mkdir -p ~/.local/bin                                   # กัน folding
sha256sum ~/Downloads/srt-clean                         # ตรวจกับ hash ที่ผู้ส่งให้
mv ~/Downloads/srt-clean ~/dotfiles/bin/.local/bin/srt-clean && chmod +x ~/dotfiles/bin/.local/bin/srt-clean
mv ~/Downloads/mpv.conf ~/dotfiles/mpv/.config/mpv/mpv.conf
sudo pacman -S python-mutagen                           # ฝังปกลง FLAC (ห้าม pip)
cd ~/dotfiles && stow -t ~ -nv mpv yt-dlp bin && stow -t ~ -v mpv yt-dlp bin
type srt-clean                                          # /home/green/.local/bin/srt-clean
  • ไฟล์จากเว็บไม่มี x เสมอ = ป้องกันพื้นฐาน → chmod +x อย่างตั้งใจ
  • mv ทับไฟล์ → สิทธิ์ของไฟล์ใหม่มาแทน ต้อง chmod ซ้ำ
  • ~/.local/bin อยู่ลำดับแรกใน PATH → ระวัง PATH hijacking (type sudo ต้องเป็น /usr/bin)

Config ที่ใช้ (Configuration)

~/.config/yt-dlp/config

-x
--audio-format flac
--postprocessor-args "ffmpeg:-ar 44100 -sample_fmt s16"
--restrict-filenames
--embed-metadata
--embed-thumbnail
--convert-thumbnails jpg
--write-subs
--write-auto-subs
--sub-langs en
--convert-subs srt
-P ~/Music
-o "%(title)s.%(ext)s"
--download-archive ~/Music/.yt-archive.txt
--exec "after_move:srt-clean %(filepath)q"

mpv.conf: force-window, background-box, slang=en (ไม่มี sid=1), sub-auto=fuzzy, volume-max=100

ปุ่มฝึกภาษา: Ctrl+←/→ บรรทัดก่อน/ถัดไป, l วนท่อน, [ ] ช้า/เร็ว, v ซ่อนเนื้อ, z x เลื่อนซับ

ทดสอบว่าใช้ได้ (Verification)

yt-dlp "https://youtu.be/a4IXCePTs4g"      # ตัด ?si= ทิ้ง (share ID ผูกบัญชีคนแชร์)
mpv ~/Music/Every_Day_I_Stay*.flac
  • [Exec] Executing command: srt-clean ... + ...en.srt: 163 -> 106 ช่วง
  • mpv: --sid=1 แทร็กเดียว (.orig ไม่ถูกโหลด), แสดงปก, metadata ครบ

ปัญหาที่เคยเจอ & สิ่งที่ทายผิด (Troubleshooting)

เหตุการณ์บทเรียน
module mutagen was not found → แนะนำ pipใช้ python-mutagen จาก pacman (pip ทับ = route สองระบบตีกัน)
รอบที่ล้ม รันซ้ำแล้วไม่โหลดเสียงใหม่yt-dlp ทำต่อเฉพาะขั้นที่ยังไม่เสร็จ + archive ไม่บันทึกรอบที่ล้ม
Downloading subtitles: en (ไม่ใช่ automatic)มีซับคนพิมพ์ → --write-subs ได้ผล แต่ก็ยังทับเวลาเหมือนกัน
ค้นหา “Benny River” ไม่เจอmetadata ในไฟล์บอกว่าเป็น Vintage Sound Room → หลักฐานจากไฟล์ชนะชื่อที่จำมา
ทาย mpv.conf link ทั้งโฟลเดอร์~/.config/mpv มีอยู่แล้ว (mpv สร้างเอง) → link เฉพาะไฟล์ ดีกว่าที่ทาย
ประโยคถูกตัดกลาง (“touch the” / “floor.”)ยังไม่รวม (เสี่ยงผิดจังหวะ) → รุ่น 2

คำถามชวนคิด

  1. ทำไมการขอ “ไฟล์จริง 30 บรรทัด” ก่อนเขียนสคริปต์ จึงประหยัดเวลากว่าการเขียนจากความรู้ทั่วไป ใช้หลักเดียวกันกับการวิเคราะห์ CDR อย่างไร
  2. ถ้าจะเพิ่มการรวมประโยคที่ถูกตัด คุณจะใช้สัญญาณอะไรตัดสินว่าบรรทัดไหนควรรวม (เบาะแส: เครื่องหมายวรรคตอน, ช่วงห่างของเวลา)
  3. --exec ทำงานต่อเนื่องจาก yt-dlp ถ้า srt-clean มีบั๊กแล้ว exit ด้วยค่าที่ไม่ใช่ 0 จะเกิดอะไรกับ archive และการโหลดเพลงถัดไปในเพลย์ลิสต์