Generating EDM Song with VAE(Variational Autoencoder) Spectrogram (not totally finish)

Nayos Suwatano
3 min readJun 21, 2022

สวัสดีครับทุกท่านกระผม ณยศ สุวัฒโน หรือ ไมค์กี้นั่นเองนะฮะ วันนี้ก็อยากมาแชร์ประสบการณ์ต่างๆ ที่ได้รับมา ทั้งความรู้และความเข้าใจต่างๆในการทำ Model Deep Learning เป็นครั้งแรกของผมนั้นเอง ซึ่งตัวโปรเจคนี้ตอนแรกผมเนี่ยไม่เคยคิดเรื่องการที่จะให้ AI มาสร้างเพลงขึ้นมาเลยแต่แรกด้วยความเข้าใจที่เล็กน้อยของผมนั้นเอง แต่หลังจากที่ผมได้ศึกษาและดูงานของหลายคนแล้วพบว่าการนำ AI มาประพันเพลงขึ้นมาเองนั้นน่าสนมาก เช่นตัวของ Magenta Tensorflow เป็นต้น

แรกเริ่มเลย คือผมชอบเพลงประเภท EDM มากๆ โดยผมก็อยากจะลองแต่งเพลงจำพวกขึ้นดูขึ้นเอง แต่ก็ยังทำไม่สำเร็จสักทีเดียว แล้วในโอกาสนี้ผมอยากลองเห็นความเป็นไปได้ว่า Deep Learning นั้นจะมีความสามารถมากเพียงแค่ไหน โดยผมก็ได้เลือกที่จะเริ่มต้นการทำโปรเจคนี้ผ่านการเก็บไฟล์ MIDI ของเพลง EDM ซึ่งใช่ครับ ผมหาไม่ได้ TwT ผมเลยไปศึกษาว่ามันมีวิธีอื่นนอกจากการใช้ MIDI ไหมก็ได้ไปสดุดกับตัวของ VAE หรือ Variational Autoencoder ที่ใช้ตัวของ Spectrogram มาผ่าน architecture และเนื่องจากเพลงประเภท EDM นั้นมี noise ที่เป็นเอกลักษณ์ในแต่ละเพลงอยู่แล้ว ผมจึงอยากนำโมเดลนี้มาผ่านทดสอบความเป็นไปได้ในการเรียนรู้ของมัน

โดยโปรเจคนี้ได้รับแรงบันดาลใจมากๆ จาก Thai Music Generation (Ranat Ek) with Variational AutoEncoder และผมก็ได้รับคำแนะนำในการดำเนินงานมากเยอะมากๆจากผู้ที่เขียนบทความข้างต้นไว้อย่างมากรวมทั้งเป็นการปรับแก้ให้เข้ากับ Dataset ของผมด้วยเช่นกัน

ทั้งนี้การทำโปรเจคนี้ไม่ได้มีเป้าหมายที่จะทดแทนอาชีพผู้ประพันธ์เพลงแต่อย่างไร เป็นการศึกษาเพื่อให้เห็นถึงความสามารถและความเป็นไปได้ของ Deep Learning ที่มีการเรียนรู้ต่อกับเพลงประเภท EDM

ก่อนอื่นเรามาทำความเข้าใจ Autoencoder กันก่อนดีกว่า

ด้วยความที่ VAE เป็นสิ่งที่ต่อยอดขึ้นมากจาก AutoEncoder เราจึงจำเป็นที่จะต้องรู้จักมันให้ดีเป็นอย่างแรกเลย

AutoEncoder หรือ AE เป็นหนึ่งใน Neural Network ที่จะเรียนรู้แบบ Unsupervised หรือการเรียนรู้ผ่านข้อมูลที่เราไม่ได้กำหนดหรือแบ่งประเภทข้อมูล เพื่อให้ Model นั้นไปหาเรียนรู้รูปแบบของข้อมูลเองซึ่งเราเรียกการเรียนรู้แบบนี้ว่า Representation Learning

โดยโมเดลนั้นจะถูกสร้างให้มีส่วนของคอขวดหรือ Bottleneck ซึ่งจะเป็นส่วนของการเก็บ “ข้อมูลที่ถูกบีบอัด” ของข้อมูลต้นแบบ และประกอบด้วยอีกสองส่วนสำคัญนั้นคือตัวเข้ารหัสและตัวถอดรหัส (Encoder & Decoder)

ตัว Encoder นั้นจะเป็นส่วนของ Model ที่บีบอัดข้อมูลให้อยู่ในรูปแบบมิติที่น้อยลง และยังมีส่วนที่เป็นนัยยะสำคัญของข้อมูลเดิมอยู่ไว้ใน latent space และตัว Decoder จะนำข้อมูลที่ถูกลดมิติลงมานั้นมาแปลงกับให้อยู่ในรูปแบบตั้งต้นของขอข้อมูลที่ได้รับมา

ซึ่งสำหรับบางคนก็อาจจะงงว่าเราบีบและคลายข้อมูลทำไมทั้งๆที่มันก็ได้ผลลัพธ์แบบเดิม คำตอบก็คือใน latent space ที่มีส่วนที่เป็นนัยสำคัญของข้อมูลไว้ เราสามารถนำส่วนสำคัญนี้ไปในการ Denoising, Anomaly Detection และการทำสิ่งที่ผมต้องการในการทำโปรเจคนี้ได้นั้นคือการ Generation

แล้วทำไมถึงต้องเป็น Varitional Autoencoder ล่ะ

ถึง AutoEncoder(AE) จะมีความสามารถในการ generation ก็ตามแต่มันก็มีข้อจำกัดอยู่ โดยเมื่อ AE จะใช้ค่าที่ถูกป้อนเข้าไปใน latent space โดยตรงหลังจากการถอดรหัสมาใช้ในการ แต่การกระจายตัวของข้อมูลนั้นมีหลากหลายและอาจจะไม่มีความต่อเนื่อง ทำให้การเลือกสุ่มตัวอย่างจาก latent space นั้นเป็นไปได้ยาก เพราะเราก็ไม่รู้ถึงการกระจายตัว และบริเวณที่อยู่ของข้อมูลใน latent space เลย จึงทำให้ผลการ generate นั้นออกมาย่ำแย่ได้นั้นเอง

และคำอธิบาย VAE ก็อยู่ตรงนี้ผมพูดเองเพราะเขียนไม่ทัน

มารวบรวม Data กันดีกว่า

เนื่องจากผมต้องการให้โมเดลสามารถเรียนการสร้างเพลง EDM ขึ้นมาได้ผมจึงต้องโหลดเพลงจำพวกนี้ไว้เป็นจำนวนมาก ซึ่งผมยังต้องเลือก genre ของเพลงก่อนอีกด้วยเนื่องจาก EDM ถูกแบ่งออกไว้เป็นหลายๆ แขนงมากเลยทีเดียว ถ้าอยากรู้เพิ่มเติมสามารถดูลิงค์นี้ได้เลย → https://music.ishkur.com/

ทั้งนี้ผมได้เลือก Genre อย่าง Hardcore มาซึ่งเป็น genre ใหญ่อันนึงที่ได้รับความนิยมเป็นจำนวนนึงและมีเพลงอยู่มาก ผมเลยได้เลือกโหลดเพลงจำพวกนี้มาจาก YouTube ผ่านโค้ด library อย่าง pytube

หลังจากได้เพลงมากจากหลายๆที่แล้ว สิ่งที่เราต้องกรอกข้อมูลอีกนั้นคือเพลงนั้นมีเสียงคนร้องเพลงมากน้อยแค่ไหน เผื่อให้โมเดลเรานั้นไม่ไปจับความสำคัญเสียงร้องแทนที่จะเป็นเพลงดนตรีแทน ซึ่งวิธีที่ผมทำนั้นก็คือใช้มือและหูของผมไล่ไป 1000 กว่าเพลงซึ่งเป็นขั้นตอนที่กินเวลา แต่ผมเชื่อว่าผมก็ได้ทำให้โมเดลได้เรียนรู้ข้อมูลที่ง่ายขึ้นแล้ว

เกณฑ์ในการคัดกรองเพลงของผมก็มีดังนี้ฮะ

  1. มีเสียงคนร้องเพลงไม่เกินร้อยละ 60 ของความยาวเพลง
  2. หากมี voice sample แต่ยังมีช่วงที่มี beat หรือ melody เล่นอยู่ด้วยก็พอปล่อยผ่านได้
  3. ทั้งเพลงควรมีความคงที่ของ BPM(Beat per minute) และ Time Signature หรือไม่ได้มีการเปลี่ยนแปลงที่ไม่บ่อยจนเกินไป

และก็จะเห็นได้จากข้างล่างเลยว่าผมได้เพลงทั้งหมด 1090 เพลงที่ผ่านเกณฆ์และผ่านการตัดส่วนที่ไม่มีเสียงหรือเสียงเบาออกจะเหลือตั้ง 71.8 กว่าชั่วโมงเลย

จำนวนชั่วโมงและเพลงของ Dataset ที่รวบรวมมาได้ในชุดข้อมูลสุดท้าย

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

เข้าใจ Spectrogram สักนี้ดดดด

Spectrogram คือการแสดงผลของ Spectrum ของความถี่ของสัญญาณนั้นๆ ที่แตกต่างกันตามหนึ่งหน่วยเวลา ซึ่งเราก็นำมาใช้กับสัญญาณเสียงได้เช่นกัน โดยปกติ spectrogram นั้นจะถูกพลอตลงบนกราฟที่มีสองมิติเรขาคณิต มีแกนหนึ่งบอกเวลาและอีกแกนบอกความถี่ ส่วนในมิติที่สามที่ระบุความกว้างของความ ถี่เฉพาะในช่วงเวลานั้นๆ

ตัวอย่าง Data ที่ถูกแปลงเป็น spectrogram

Training VAE model กันดีกว่านะฮะ

หลังจากที่เราได้ Data ที่จัดการเรียบร้อยแล้วเราก็เหลือแค่ไปใส่ใน Model เท่านั้นเอง ซึ่งอย่างที่ผมได้บอกไปนั้น VAE จะถูกประกอบขึ้นด้วยสองส่วนหลักๆ นั้นคือ Encoder และ Decoder โดยอาศัย CNN หรือ Convolutional Neural Network

แล้วพอเราเริ่ม Train ก็จะได้อะไรประมาณนี้ฮะ

เทรนนานๆ ยาวไปๆ ฮะ

ผลการศึกษา

ไปดูที่ form กัน

ข้อผิดพลาดของโมเดล

ความผิดพลาดของโมเดลนั้นสามารถระบุได้ 3 แบบ

  1. not enough epochs
  2. data improvement : choose climax part(where melody and beat is clear)
  3. architecture improvement : explore more ways to build the model and train it

Credit

--

--