Classical Music Generator
ทำไมถึงเลือกทำ Classical Music Generator 🎼
ในตอนแรกของการทำโครงงานหัวข้อที่เลือกไว้ตอนเริ่มต้นจะเป็นหัวข้อ "Lo-fi Music Generator" แต่เนื่องจากมีปัญหาในการเก็บข้อมูลที่มีจำนวนน้อย จึงได้เปลี่ยนแนวทางเพลงเป็นเพลงคลาสสิกที่มีข้อมูลที่ต้องการมากกว่า ถามว่าแล้วทำไมถึงต้องเป็นหัวข้อ Music Generator ล่ะ เหตุผลแรกที่แน่ชัดมาตั้งแต่หัวข้อก่อนคืออยากมีเพลงที่ทำขึ้นมาไม่ซ้ำใครและเป็นของเราเอง แต่เราไม่จำเป็นต้องเล่นดนตรีด้วยตัวเองค่ะ
ขั้นตอนการทำของ Classical Music Generator
- ค้นคว้าและศึกษางานวิจัยที่เกี่ยวข้อง
- ขั้นตอนการเก็บข้อมูล
- ขั้นตอนการทำความสะอาดข้อมูล
- ขั้นตอนจัดเตรียมข้อมูลให้พร้อมสำหรับการใช้งาน
- ขั้นตอนการทำงานของโมเดล
- ขั้นตอนการ Deployment
ค้นคว้าและศึกษางานวิจัยที่เกี่ยวข้อง 🔍
ศึกษาก่อนว่างานที่เราจะทำใช้ข้อมูลประเภทไหน ทำอย่างไร ให้เป็นแนวทางให้กับตัวของโครงงานของเราก่อนที่จะเริ่มขั้นตอนต่อไป
ขั้นตอนการเก็บข้อมูล 📁
โดยเราจะเก็บข้อมูลแนวเพลงที่ต้องการ ซึ่งไฟล์ข้อมูลที่เราจะใช้กันก็คือ ไฟล์ประเภท MIDI แหล่งที่มาของข้อมูลในโครงงานในครั้งนี้ส่วนใหญ่มาจากการค้นหาทางเว็บไซต์ Google ทั่วไปและได้จาก Kaggle เล็กน้อย หากต้องการทำเพลงแนวอื่นๆสามารถหาข้อมูลแนวเพลงอื่นมาใส่ได้เช่นกัน
อธิบายเพิ่มเติมว่าทำไมถึงต้องใช้ไฟล์ประเภท MIDI เนื่องจาก MIDI คือเสียงแบบดิจิตอลที่คอมพิวเตอร์สามารถฟังมันได้และไฟล์ข้อมูลทางดนตรีพวกนี้ก็ถูกบันทึกไว้ด้วยข้อมูลหลายอย่าง ยกตัวอย่างเช่น เสียงเครื่องดนตรี ตัวโน๊ต ความเร็วจังหวะ ระยะเวลาที่บรรเลงตัวโน๊ต เป็นต้น และอีกสาเหตุหนึ่งก็คือด้วยความที่ไฟล์ MIDI เป็นไฟล์ที่มีเสียงของโน๊ตและช่วงเวลาที่บรรเลงมีความชัดเจนและแม่นยำมากกว่าการใช้ไฟล์ประเภทอื่น
ขั้นตอนการทำความสะอาดข้อมูล 🧽
- เราจะนำข้อมูลที่เก็บมาตรวจสอบดูว่าข้อมูลที่ได้มาเป็นข้อมูลที่ถูกต้องจริงหรือไม่ ข้อมูลเป็นไฟล์ประเภทที่ต้องการหรือไม่ นอกจากการเปิดฟังดูก็ยังไม่มีวิธีอะไรแนะนำค่ะแต่ว่าส่วนใหญ่ข้อมูลประเภท MIDI ก็จะไม่ค่อยมีปัญหาอะไร
- ทำการแยกประเภทข้อมูล เราก็ได้แบ่งเพลงคลาสสิกออกมาย่อยๆตามศิลปินแต่ละคนที่เราเก็บข้อมูลมา
ขั้นตอนการสำรวจข้อมูล 🎹
1. เลือกไฟล์ MIDI สักเพลงออกมาเปิดฟังนะคะ
2. สำรวจจำนวนเครื่องดนตรีและชื่อของเครื่องดนตรีในเพลงนั้น
3. หลังจากที่เรารู้แล้วว่างานมีจำนวนเครื่องดนตรีเท่าไหร่และมีอะไรบ้างเราก็จะมาเริ่มเปลี่ยน MIDI ให้กลายเป็นโน๊ตกัน
ผลลัพธ์ที่สำคัญจะออกมาทั้งหมด 3 ค่าได้แก่ Pitch , Step , Duration
“อธิบายค่า Pitch , Step และ Duration แบบง่ายๆที่เข้าใจ”
• Pitch คือ ตัวโน๊ต แต่จะออกมาในรูปแบบของตัวเลข
• Step คือ ช่วงเวลาที่เราไม่ได้กดโน๊ต ระยะห่างจากโน๊ตตัวก่อนหน้า
• Duration คือ ระยะเวลาตอนที่เรากำลังกดโน๊ต ได้มาจากเวลาสิ้นสุดโน๊ต — เวลาเริ่มต้นโน๊ต
จากขั้นตอนที่แล้วจะเห็นได้ว่าโน๊ต หรือ Pitch ของเราออกมาในรูปแบบของตัวเลขเราจะมาเปลี่ยนตัวเลขตรงนี้ให้กลายเป็นโน๊ตสากล
เท่านี้เราก็จะได้ตัวโน๊ตออกมาในรูปแบบของโน๊ตสากลแล้วค่ะ ต่อไปเราจะทำการนำโน๊ตของเรามาพล็อตเป็นกราฟเพื่อให้เราเห็นภาพได้ง่ายมากขึ้น ด้วยการเขียนฟังก์ชันต่อไปนี้ค่ะ
เราลองนำฟังก์ชันที่เขียนมาพล็อตกราฟขึ้นมาดูได้ตามคำสั่งต่อไปนี้
แบบที่ 1 จะเป็นกราฟแบบที่พล็อตจากจำนวนโน๊ตที่กำหนด
ค่า count คือค่าที่สามารถกำหนดได้ว่าจะดูกี่ตัวแรก
แบบที่ 2 จะเป็นกราฟแบบที่พล็อตจากจำนวนโน๊ตทั้งหมดในไฟล์
นอกจากพล็อตกราฟออกมาแล้วจะบอกจำนวนโน๊ตทั้งหมดที่ไฟล์มีอีกด้วย
หลังจากที่เราพล็อตกราฟโน๊ตไป ต่อมาเราจะมาพล็อตกราฟสำหรับค่าของ Pitch , Step , Duration เพื่อดูให้เห็นภาพมากขึ้นกันต่อ โดยจะเขียนฟังก์ชันขึ้นมาดังต่อไปนี้
ต่อมาเราจะเขียนฟังก์ชันที่ทำให้โน๊ตกลับไปเป็น MIDI ได้กันค่ะ
แล้วใช้คำสั่งต่อไปนี้ในการแสดงผล
หลังจากนั้นเราก็จะได้ example_pm ออกมาฟังกันต่อด้วยขั้นตอนต่อไปนี้
แค่นี้ก็จบการสำรวจข้อมูลแล้ว 💡
ขั้นตอนจัดเตรียมข้อมูลให้พร้อม ⚒
ในที่นี้เราได้มีการสร้างชุดข้อมูลการฝึก สำหรับโครงงานในครั้งนี้ไม่ได้มีการแบ่ง train , validation และ test เพราะว่าในความคิดเห็นส่วนตัวคิดไว้ว่าการทำนายโน๊ตออกมา จริงๆแล้วไม่ว่าโน๊ตจะออกมาเป็นโน๊ตอะไร แต่เมื่อมีโน๊ตหลายๆตัวมาต่อกันก็จะเกิดเป็นเพลงขึ้น สำหรับขั้นตอนนี้จึงทำไว้แค่เพียง Train
นอกจากสร้างชุดข้อมูลแล้ว ในขั้นตอนนี้ก็ได้มีการเขียนฟังก์ชันสำหรับสร้างลำดับขึ้นเพราะเพลงของเราเป็นข้อมูลที่จำเป็นต้องเป็นลำดับต่อๆกันไป
ขั้นตอนการทำงานของโมเดล 🧠
โมเดลที่เราจะใช้ในครั้งนี้คือโมเดล LSTM (โมเดล LSTM คืออะไร มันคือโมเดลโครงข่ายประสาทอย่างหนึ่งของ RNN ทำงานเก็บข้อมูล ก ไว้และเมื่อได้รับข้อมูล ข ก็นำ ก กับ ข มารวมกันก่อนที่จะส่งต่อไปเรื่อยๆ) และ library ที่เราจะใช้ในการทำโมเดลในครั้งนี้คือ Keras เนื่องจากก่อนหน้านี้ได้มีการทดลองทำโมเดลด้วย library Torch แล้วหลังจากนั้นนำผลลัพธ์ที่ได้มาเปรียบเทียบกัน พบว่าผลลัพธ์ที่ได้จากโมเดล Keras มีประสิทธิภาพมากกว่าจึงเลือกใช้โมเดล Keras ในการทำโมเดลครั้งนี้ค่ะ และนี่คือรูปร่างหน้าตาของตัวโมเดลค่ะ
Metrics ที่ใช้ในโมเดลมีทั้งหมด 2 ตัวเนื่องจากเรามี Pitch , Step , Duration โดยจะใช้ดังต่อไปนี้
• Pitch ใช้ Cross Entropy Loss (Classification)
• Step & Duration ใช้ Mean Square Error (Regression)
ขั้นตอนการสร้างเพลง 🎧
หลักการทำงานของมันก็คือจะให้มันรับ input เข้าไป 50 โน๊ตหลังจากนั้นจะให้มันทำนายโน๊ตตัวที่ 51 และต่อมาให้รับ input ที่ 1–51 แล้ว ทำนายออกมาเป็นตัวที่ 52 ดังนั้นเราก็จะเขียนฟังก์ชันให้มันทำนายโน๊ตตัวถัดไปด้วยหลักการนี้ค่ะ
พอโน๊ตมาอยู่รวมกันหลายๆตัวมันก็จะกลายเป็นเพลงได้ แค่นี้เราก็จะได้เพลงคลาสสิคแบบที่เราต้องการออกมาแล้วค่ะ 🎉
ขั้นตอนการ Deployment 📝
โครงงานนี้ได้ใช้ library Streamlit ที่มีฟังก์ชันมากมายและก็สะดวกต่อการใช้งาน ใครที่อยากลอง generate เพลงคลาสสิกออกมาฟังเล่นสามารถกดลิงก์ที่ตรงนี้ได้เลย
https://share.streamlit.io/manissaraz0/ai-builders-deploy/main/app.py
หรือสแกนคิวอาร์โค้ดได้ตรงนี้เลยค่ะ
การนำโครงงานไปใช้ต่อในอนาคต 💖
โครงงานที่ทำอยู่ในตอนนี้มีการใช้ Keras เป็นพื้นฐานเนื่องจากเวลาเหลือน้อยมากแล้วจึงไม่พอที่จะไปแก้ไขโมเดลของ Torch ให้ดีขึ้นหากมีเวลาเยอะมากขึ้นแล้วก็อยากจะลองทำโมเดลจาก Torch ให้ดียิ่งขึ้นค่ะเพราะยังไม่ค่อยเจองานประเภทนี้ที่ใช้ Torch และตอนนี้โมเดลของหนูยังไม่สามารถเรียนคอร์ดได้ด้วย ก็อยากจะพัฒนาในจุดต่างๆที่บกพร่องไปค่ะ
เพิ่มเติม หากข้อมูลและคำอธิบายต่างๆผิดพลาดประการใดต้องขออภัยมา ณ ที่นี้ด้วยและขอขอบคุณโครงการ AI Builders ที่ได้ให้ความรู้และคำปรึกษามากมายเกี่ยวกับ Machine Learning การทำโครงงานครั้งนี้เป็นการทำ Machine Learning ครั้งแรกในชีวิตของหนู และหนูรู้สึกภูมิใจมากที่ได้มาอยู่ถึงจุดนี้ได้ถึงแม้ว่ามันอาจจะไม่ได้ว้าวสำหรับใคร และโครงงานของหนูก็อาจจะยังออกมาไม่ได้เป็นอย่างที่หวังไว้ในตอนแรก แต่ก็ถือว่าเป็นความภูมิใจที่เกิดขึ้นครั้งแรกกับสิ่งที่เรียกว่า Machine Learning ค่ะ สุดท้ายนี้ก็อยากขอขอบคุณพี่ๆทุกๆคนอีกครั้งที่คอยให้กำลังใจ ช่วยเหลือและให้คำปรึกษาหนูมาตลอด รู้สึกขอบคุณมากอย่างใจจริงค่ะ 💖🙇♀️
กิตติกรรมประกาศอย่างเป็นทางการ
ขอขอบคุณโครงการ AI Builders พี่ๆทุกคนที่ช่วยให้โครงงานของหนูในครั้งนี้สำเร็จลุล่วงไปได้ด้วยดี ขอบคุณที่มอบความรู้และก็ทักษะการจัดการเวลาในการทำงานข้อคิดในการทำงานให้แก่ผู้เข้าร่วมโครงการทุกคน และขอขอบคุณผู้สนับสนุนหลักอีกมากมายที่ได้แบ่งปันและให้โอกาสเยาวชนในการเรียนรู้และได้ทำโครงงานต่างๆอย่างเต็มที่ ขอขอบคุณเป็นอย่างสูงค่ะ
💚 อ้างอิง 💚
โครงงานในครั้งนี้มีต้นแบบมาจากการสร้างเพลงด้วย rnn ของ Tensorflow ค่ะ
https://www.tensorflow.org/tutorials/audio/music_generation
แหล่งเก็บข้อมูล MIDI จาก http://www.piano-midi.de/
โครงงานที่เข้าไปศึกษาตอนทำโมเดล Torch https://www.kaggle.com/code/karnikakapoor/music-generation-lstm/notebook