Mr.Pakorn Music Studio
เทคนิคการใช้ ByteDance AI (High-Resolution Piano Transcription)
คู่มือนี้อธิบายการใช้งาน AI สายลึกที่ถูกเทรนมาเพื่อฟังเสียง "เปียโน" โดยเฉพาะ แตกต่างจากการแปลงเสียงแบบครอบจักรวาล เพราะ AI ตัวนี้สามารถแกะคอร์ด เมโลดี้ และแยกแยะ น้ำหนักการเหยียบ Sustain Pedal ได้อย่างแม่นยำ
ทำขั้นตอนนี้ แค่ครั้งแรกครั้งเดียว เพื่อสร้าง Virtual Environment ใน Miniconda ป้องกันระบบเวอร์ชันตีกันกับ Python หลักของเครื่อง
เปิดโปรแกรม Anaconda Prompt แล้วรันคำสั่ง:
conda create -n piano_ai_env python=3.11 -y
conda activate piano_ai_env
ไฟล์มีขนาดใหญ่ ให้ใช้คำสั่งบังคับโหลดสำหรับ CPU โดยเฉพาะ:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
⚠️ สำคัญ: ต้องเจาะจงเวอร์ชันให้ต่ำกว่า 0.10.0 เพื่อป้องกัน Error หาโมดูลไม่เจอ
pip install "librosa<0.10.0"
pip install piano_transcription_inference
ระบบ Windows ไม่มีคำสั่ง wget เราจึงต้องใช้ Python โหลดไฟล์น้ำหนักโมเดล (Model Weights ขนาด ~165MB) มาวางในเครื่อง ทำแค่ครั้งแรกเช่นกัน
สร้างไฟล์ชื่อ download_model.py (ที่ D:\pinno) แล้วใส่โค้ดนี้:
import os
import urllib.request
# 1. กำหนดโฟลเดอร์ปลายทางที่ AI จะมาค้นหาไฟล์
target_dir = os.path.join(os.path.expanduser('~'), 'piano_transcription_inference_data')
os.makedirs(target_dir, exist_ok=True)
# 2. ลิงก์ตรงสำหรับดาวน์โหลดและชื่อไฟล์ที่ระบบต้องการ
file_path = os.path.join(target_dir, 'note_F1=0.9677_pedal_F1=0.9186.pth')
url = "https://zenodo.org/record/4034264/files/CRNN_note_F1%3D0.9677_pedal_F1%3D0.9186.pth?download=1"
print(f"📁 กำลังตรวจสอบโฟลเดอร์: {target_dir}")
if not os.path.exists(file_path):
print("⏳ กำลังดาวน์โหลดสมองกล AI (165 MB)... กรุณารอสักครู่")
try:
urllib.request.urlretrieve(url, file_path)
print("✅ ดาวน์โหลดสำเร็จ! ระบบพร้อมใช้งานแล้ว")
except Exception as e:
print(f"❌ ดาวน์โหลดไม่สำเร็จ: {e}")
else:
print("✅ มีไฟล์สมองกลในเครื่องแล้ว ไม่ต้องดาวน์โหลดใหม่")
วิธีรัน: python D:\pinno\download_model.py
สร้างไฟล์ชื่อ mp3tomidi_pro.py (ที่ D:\pinno) แล้วใส่โค้ดนี้:
import os
import glob
from piano_transcription_inference import PianoTranscription, sample_rate, load_audio
def convert_folder_to_midi_pro(input_folder, output_folder):
os.makedirs(output_folder, exist_ok=True)
mp3_files = glob.glob(os.path.join(input_folder, "*.mp3"))
if not mp3_files:
print(f"❌ ไม่พบไฟล์เพลงใน: {input_folder}")
return
print(f"🔎 พบไฟล์ทั้งหมด {len(mp3_files)} ไฟล์")
print("🧠 กำลังอุ่นเครื่อง AI (ใช้ CPU)...")
transcriptor = PianoTranscription(device='cpu')
print("✅ AI พร้อมทำงานแล้ว!\n")
for mp3_file in mp3_files:
filename = os.path.basename(mp3_file)
midi_filename = filename.replace(".mp3", ".mid")
midi_path = os.path.join(output_folder, midi_filename)
print(f"⏳ กำลังแปลง: {filename}")
try:
audio, _ = load_audio(mp3_file, sr=sample_rate, mono=True)
transcriptor.transcribe(audio, midi_path)
print(f"🌟 สำเร็จ: ได้ไฟล์ {midi_filename} แล้ว\n")
except Exception as e:
print(f"❌ ข้ามไฟล์ {filename} เนื่องจาก Error: {e}\n")
print("🎉 กระบวนการเสร็จสิ้นทั้งหมด!")
if __name__ == "__main__":
# ⚠️ ตั้งค่าโฟลเดอร์ตรงนี้ก่อนรันทุกครั้ง
INPUT_DIR = r"D:\pinno\@20260405\test"
OUTPUT_DIR = r"D:\pinno\@20260405\pythonconvert_pro"
convert_folder_to_midi_pro(INPUT_DIR, OUTPUT_DIR)
เมื่อตั้งค่าทุกอย่างเสร็จแล้ว วันหลังถ้าต้องการแปลงเพลง ให้ทำตาม 3 ขั้นตอนนี้ง่ายๆ:
INPUT_DIR ในโค้ดconda activate piano_ai_envpython D:\pinno\mp3tomidi_pro.py*หมายเหตุ: คำเตือน FutureWarning หรือการนับตัวเลข Segment... ระหว่างรัน คือการทำงานปกติของระบบที่กำลังวิเคราะห์ทีละท่อน ไม่ต้องตกใจ ปล่อยให้ระบบรันจนจบได้เลย