Classical Music Generator

Manissara Saejun
3 min readJun 21, 2022

ทำไมถึงเลือกทำ Classical Music Generator 🎼

ในตอนแรกของการทำโครงงานหัวข้อที่เลือกไว้ตอนเริ่มต้นจะเป็นหัวข้อ "Lo-fi Music Generator" แต่เนื่องจากมีปัญหาในการเก็บข้อมูลที่มีจำนวนน้อย จึงได้เปลี่ยนแนวทางเพลงเป็นเพลงคลาสสิกที่มีข้อมูลที่ต้องการมากกว่า ถามว่าแล้วทำไมถึงต้องเป็นหัวข้อ Music Generator ล่ะ เหตุผลแรกที่แน่ชัดมาตั้งแต่หัวข้อก่อนคืออยากมีเพลงที่ทำขึ้นมาไม่ซ้ำใครและเป็นของเราเอง แต่เราไม่จำเป็นต้องเล่นดนตรีด้วยตัวเองค่ะ

ขั้นตอนการทำของ Classical Music Generator

  1. ค้นคว้าและศึกษางานวิจัยที่เกี่ยวข้อง
  2. ขั้นตอนการเก็บข้อมูล
  3. ขั้นตอนการทำความสะอาดข้อมูล
  4. ขั้นตอนจัดเตรียมข้อมูลให้พร้อมสำหรับการใช้งาน
  5. ขั้นตอนการทำงานของโมเดล
  6. ขั้นตอนการ Deployment

ค้นคว้าและศึกษางานวิจัยที่เกี่ยวข้อง 🔍

ศึกษาก่อนว่างานที่เราจะทำใช้ข้อมูลประเภทไหน ทำอย่างไร ให้เป็นแนวทางให้กับตัวของโครงงานของเราก่อนที่จะเริ่มขั้นตอนต่อไป

ขั้นตอนการเก็บข้อมูล 📁

โดยเราจะเก็บข้อมูลแนวเพลงที่ต้องการ ซึ่งไฟล์ข้อมูลที่เราจะใช้กันก็คือ ไฟล์ประเภท MIDI แหล่งที่มาของข้อมูลในโครงงานในครั้งนี้ส่วนใหญ่มาจากการค้นหาทางเว็บไซต์ Google ทั่วไปและได้จาก Kaggle เล็กน้อย หากต้องการทำเพลงแนวอื่นๆสามารถหาข้อมูลแนวเพลงอื่นมาใส่ได้เช่นกัน

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

ขั้นตอนการทำความสะอาดข้อมูล 🧽

  1. เราจะนำข้อมูลที่เก็บมาตรวจสอบดูว่าข้อมูลที่ได้มาเป็นข้อมูลที่ถูกต้องจริงหรือไม่ ข้อมูลเป็นไฟล์ประเภทที่ต้องการหรือไม่ นอกจากการเปิดฟังดูก็ยังไม่มีวิธีอะไรแนะนำค่ะแต่ว่าส่วนใหญ่ข้อมูลประเภท MIDI ก็จะไม่ค่อยมีปัญหาอะไร
  2. ทำการแยกประเภทข้อมูล เราก็ได้แบ่งเพลงคลาสสิกออกมาย่อยๆตามศิลปินแต่ละคนที่เราเก็บข้อมูลมา

ขั้นตอนการสำรวจข้อมูล 🎹

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

https://books.google.co.th/books?id=Lel1DwAAQBAJ&pg=PA135&lpg=PA135&dq=instrument.partitionByInstrument+%E0%B8%84%E0%B8%B7%E0%B8%AD&source=bl&ots=nkw1my-nC1&sig=ACfU3U1dA4ZqkkQRpWV6WU4QqG9MP3uMKA&hl=th&sa=X&ved=2ahUKEwitnaG324n4AhVg9zgGHS8pDYEQ6AF6BAgCEAM#v=onepage&q&f=false

--

--

Manissara Saejun

สมาชิกโครงการ AI Builders รุ่นที่ 2 กลุ่ม Lucky Doves