ระบบเพลง + เนื้อเพลงสำหรับฝึกภาษา
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 ─► GEMAUDIOFLAC 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 |
คำถามชวนคิด
- ทำไมการขอ “ไฟล์จริง 30 บรรทัด” ก่อนเขียนสคริปต์ จึงประหยัดเวลากว่าการเขียนจากความรู้ทั่วไป ใช้หลักเดียวกันกับการวิเคราะห์ CDR อย่างไร
- ถ้าจะเพิ่มการรวมประโยคที่ถูกตัด คุณจะใช้สัญญาณอะไรตัดสินว่าบรรทัดไหนควรรวม (เบาะแส: เครื่องหมายวรรคตอน, ช่วงห่างของเวลา)
--execทำงานต่อเนื่องจาก yt-dlp ถ้า srt-clean มีบั๊กแล้ว exit ด้วยค่าที่ไม่ใช่ 0 จะเกิดอะไรกับ archive และการโหลดเพลงถัดไปในเพลย์ลิสต์