Audio Decomposition - โอเพนซอร์สสำหรับแยกเพลงออกเป็นโน้ตและเครื่องดนตรี
(matthew-bird.com)- Audio Decomposition เป็นโปรแกรมโอเพนซอร์สที่พยายามแยกเสียงออกเป็นโน้ตและเครื่องดนตรีที่ประกอบกันขึ้นมา เพื่อแปลงเพลงให้อยู่ในรูปโน้ตดนตรี
- ตัวอย่างเสียงเครื่องดนตรีนำมาจาก University of Iowa Electronic Music Studios instrument database และบันทึกทั้งฟูเรียร์ทรานส์ฟอร์มกับเอนเวโลปของแต่ละคลื่นไว้เพื่อใช้เป็นเกณฑ์เปรียบเทียบ
- โปรแกรมวิเคราะห์ไฟล์เพลงเป็นช่วงละ 0.1 วินาทีเพื่อสร้าง spectrogram แล้วผสมฟูเรียร์ทรานส์ฟอร์มของเครื่องดนตรีที่บันทึกไว้เพื่อประมาณขนาดของแต่ละเครื่องดนตรีในช่วงนั้น
- การวิเคราะห์เอนเวโลปแบ่งช่วง attack·sustain·release และการลดทอนแบบคงที่/แบบพลวัต จากนั้นคำนวณต้นทุนของแต่ละเครื่องดนตรีในย่านโน้ตที่ผ่านการกรอง
- ผลลัพธ์เลือกแสดงเป็น matplotlib scatter plot คล้ายโน้ตดนตรี แทนการสร้างเสียงกลับขึ้นมาใหม่ เพื่อให้แก้ปัญหาและแสดงข้อมูลแบบเบาบางได้ง่ายขึ้น
การแยกเสียงเพื่อแปลงเป็นโน้ตดนตรี
- Audio Decomposition เริ่มต้นจากเป้าหมายในการสร้างโปรแกรมที่เปลี่ยนเพลงให้เป็นโน้ตดนตรี
- ผู้พัฒนาต้องการแปลงเพลงเป็นโน้ตด้วยตัวเอง และรู้สึกว่ายังมีอัลกอริทึมแยกแหล่งกำเนิดเสียงแบบโอเพนซอร์สที่เรียบง่ายอยู่ไม่มาก จึงเป็นแรงจูงใจให้ทำโครงการนี้
- มีวิดีโอเดโมเผยแพร่บน YouTube
- ที่เก็บ GitHub คือ mbird1258/Audio-Decomposition
- ตัวอย่างเสียงเครื่องดนตรีนำมาจาก University of Iowa Electronic Music Studios instrument database
- สำหรับแต่ละไฟล์ จะคำนวณและบันทึกทั้ง ฟูเรียร์ทรานส์ฟอร์ม และ เอนเวโลป ของคลื่นทั้งชุด
ฟูเรียร์ทรานส์ฟอร์มทุก 0.1 วินาที
- แนวคิดคือเสียงของเครื่องดนตรีสามารถอธิบายลักษณะได้หลัก ๆ ด้วย ฟูเรียร์ทรานส์ฟอร์ม และเอนเวโลป จึงใช้ข้อมูลทั้งสองอย่างเพื่อประมาณว่าเครื่องดนตรีใดกำลังเล่นโน้ตใดอยู่
- ไฟล์เพลงจะถูกนำไปทำฟูเรียร์ทรานส์ฟอร์มทุก 0.1 วินาที และประมวลผลในรูป spectrogram
- เพื่อสร้างฟูเรียร์ทรานส์ฟอร์มของแต่ละช่วง 0.1 วินาทีขึ้นมาใหม่ จะนำฟูเรียร์ทรานส์ฟอร์มของเครื่องดนตรีที่บันทึกไว้มาเรียงบวกกัน
- ขนาดของแต่ละเครื่องดนตรีคำนวณโดยแก้เมทริกซ์ที่ได้จากอนุพันธ์ย่อยตามความถี่ของ ฟังก์ชันต้นทุน MSE
- แต่ละแถวของเมทริกซ์สอดคล้องกับอนุพันธ์ย่อยของเครื่องดนตรีแต่ละชนิด เช่น cello, piano
- ตัวอย่างคือการคำนวณต้นทุนสำหรับค่าตามความถี่ เช่น ค่าฟูเรียร์ทรานส์ฟอร์มที่ 5Hz
เอนเวโลปและการแยกช่วงของเสียง
- เอนเวโลปคือ เส้นขอบบน ของรูปคลื่น และเนื่องจากฟังก์ชันที่มีอยู่เดิมอาจทำงานได้ไม่ดีเมื่อเจอ noise หรือรูปคลื่นบางแบบ จึงใช้วิธีแยกต่างหาก
- ขั้นตอนการคำนวณคือแบ่งรูปคลื่นออกเป็นชิ้นย่อย แล้วนำค่าสูงสุดของแต่ละชิ้นมาใช้
- หลังจากนั้นจะหาจุดที่เอนเวโลปต่ำกว่ารูปคลื่นต้นฉบับ แล้วเพิ่มจุดใหม่เพื่อปรับผลลัพธ์ให้ละเอียดขึ้น
- เอนเวโลปแบ่งเป็น attack, sustain, release
- attack: เสียงเริ่มต้นของโน้ต
- sustain: ช่วงที่เสียงคงอยู่
- release: ช่วงที่เสียงหยุดลง
- สำหรับตัวอย่างเสียงเครื่องดนตรี จะใช้ค่าตัวแรกที่ไม่เป็น 0 เป็นจุดเริ่มต้นของ attack
- ขอบเขตระหว่าง attack กับ sustain กำหนดจากจุดแรกที่ฟังก์ชันเว้าลงหรือเริ่มลดลง
- ขอบเขตระหว่าง sustain กับ release กำหนดโดยไล่ดูจากท้ายกลับมา แล้วหาจุดแรกที่ฟังก์ชันเพิ่มขึ้นหรือเว้าลง
- จุดสิ้นสุดของ release หาโดยไล่จากท้ายกลับมาแล้วหาจุดแรกที่ไม่เป็น 0
ประเภทการลดทอนและการจับคู่เครื่องดนตรี
- เพื่อแยกรูปแบบหลักของรูปคลื่น จึงพิจารณาทั้ง การลดทอนแบบคงที่ และ การลดทอนแบบพลวัต
- เครื่องดนตรีบางชนิดอย่าง piano มักมีการลดทอนแบบคงที่ที่เป็นลักษณะการลดแบบเอ็กซ์โพเนนเชียล
- เครื่องดนตรีบางชนิดอย่าง violin อาจมีความดังเพิ่มขึ้นหรือลดลงได้แม้อยู่ในช่วง sustain
- ในตัวอย่างเสียงเครื่องดนตรี บางไฟล์ปล่อยให้เสียงค่อย ๆ หายไปเองตามธรรมชาติ ขณะที่บางไฟล์ปล่อย release เร็วกว่านั้น
- การตัดสินว่าการลดทอนเป็นแบบคงที่หรือแบบพลวัต ใช้เกณฑ์ว่าค่าสัมประสิทธิ์การลดทอนมากกว่า 1 หรือเบี่ยงเบนจากเส้นโค้งการลดทอนมากเกินไปหรือไม่
- การพิจารณาว่าเอนเวโลปมี release หรือไม่ หรือเป็น AS หรือ ASR ใช้การเปรียบเทียบอัตราการเปลี่ยนแปลงเฉลี่ยของ sustain กับ release
- หากอัตราการเปลี่ยนแปลงของ release ต่ำกว่า จะถือว่าไม่มี release
- ในการประมวลผลไฟล์เพลง จะใช้ band-pass filter กับความถี่ของแต่ละโน้ต
- สำหรับรูปคลื่นที่ผ่านการกรองแล้ว จะวนดูเครื่องดนตรีแต่ละชนิดและคำนวณ cross-correlation ของ attack และ release ที่ถูกทำ normalization เพื่อหาจุดเริ่มต้นและจุดสิ้นสุดของเสียง
- จากนั้นคำนวณ MSE ระหว่างรูปคลื่นของเครื่องดนตรีกับเสียงที่ผ่านการกรอง เพื่อใช้เป็นต้นทุนของเครื่องดนตรีในเวลานั้น
- ขนาดสุดท้ายคำนวณโดยนำขนาดจากขั้นฟูเรียร์ทรานส์ฟอร์มมาคูณกับ
1 / ต้นทุนของขั้นเอนเวโลป
การแสดงผลด้วย scatter plot
- ผลลัพธ์ใช้ scatter plot ของ matplotlib โดยแสดงจุดเป็นรูป
-ให้ดูคล้ายโน้ตดนตรี - เดิมทีตั้งใจจะสร้างเสียงกลับขึ้นมาจากขนาดที่คำนวณได้ แต่พบว่ามีปัญหามาก ใช้เวลานาน และดีบักได้ยาก
- มีการลองใช้ imshow ของ matplotlib ด้วย แต่ในกรณีที่ค่าส่วนใหญ่เป็น 0 นั้นไม่มีประสิทธิภาพอย่างมาก
- เพราะทุกครั้งที่เลื่อนหน้าจอหรือซูมเข้าออก ต้องวาดทุกจุดใหม่ทั้งหมดโดยไม่สนว่าจุดนั้นมองเห็นบนหน้าจอหรือไม่
- สุดท้ายจึงสามารถนำผลลัพธ์ไปใช้เพื่อช่วยสร้างโน้ตดนตรีได้ดีขึ้น โดยเฉพาะในกรณีที่หาพิทช์หรือคอร์ดที่ถูกต้องได้ยาก
- ตัวอย่างหนึ่งคือใช้ วิดีโอ YouTube เป็นฐานในการสร้าง โน้ตบน Noteflight ขึ้นมาใหม่
- เวลาในการรันก็ไม่ได้ยาวนานจนเกินไป
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
ชื่อเรื่องชวนสับสนนิดหน่อย ถ้าเขียนว่า open-source separation จะอ่านเหมือนการแยกแหล่งเสียง (source separation) แต่จริง ๆ แล้วไม่ใช่แบบนั้น เป็น อัลกอริทึมตรวจจับพิตช์ และเป็นวิธีจัดประเภทว่าพิตช์ที่ตรวจพบมาจากเครื่องดนตรีใด
ค่อนข้างเจ๋งทีเดียว แต่ถ้าต้องการผลลัพธ์ที่แม่นยำจริง ๆ ดูเหมือนว่าเวลาแก้เอาต์พุตอาจนานกว่าทำด้วยมือเองด้วยซ้ำ
สำหรับผลงานที่ทำได้ในวัยนั้นถือว่าน่าทึ่ง
เวลานักดนตรีพยายามกู้สิ่งที่ใกล้เคียงกับแทร็กต้นฉบับก่อนมิกซ์ หรือก็คือ stem จากไฟล์เสียงเดี่ยว ดูเหมือนจะได้ยินคำหลังบ่อยกว่า
ในบทความไม่ได้เห็นว่ากล่าวถึงโดยตรง แต่สำหรับคนที่สนใจ automatic music transcription หรือการแปลงเสียงเป็น MIDI เป็นสาขาย่อยที่ค่อนข้างใหญ่ใน deep learning และ music information retrieval
ในการถอดเสียงดนตรีแบบหลายแทร็กก็มีโมเดลที่ประสบความสำเร็จอยู่หลายตัว และมีโปรเจกต์ MT3 ของ Google: https://research.google/pubs/mt3-multi-task-multitrack-music...
สำหรับการถอดเสียงเปียโน ตอนนี้แม้กับเสียงคุณภาพต่ำมากก็เกือบถึงระดับแม่นยำเกือบสมบูรณ์แล้ว: https://github.com/EleutherAI/aria-amt
อนึ่ง ผมเป็นผู้เขียน repo ข้างต้น
ตัวถอดเสียงจากเสียงเป็น MIDI ทายพิตช์และเวลาเริ่มได้ดี แต่ความยาวและไดนามิกยังเสถียรน้อยกว่ามาก
ผมพอร์ต Colab ของพวกเขาให้เป็น runtime เพื่อให้ใช้ง่ายขึ้น แต่เอาต์พุต MIDI ค่อนข้างแปลก
แม้ใส่ stem ง่าย ๆ บางแทร็กก็ไม่ตรงกับเอาต์พุต MIDI และเสียง มีปัญหาเรื่อง timing จนใช้ไม่ได้ แต่กับเสียงอื่น ๆ ก็ทำงานได้โอเค
ถ้าสนใจการแยกเสียงหรือ stem separation ก็น่าลองดู RipX: https://hitnmix.com/ripx-daw-pro/
สามารถ export แทร็กที่แยกแล้วเป็นไฟล์ MIDI ได้ด้วย ยังมีปัญหาอยู่บ้าง แต่ทำงานได้ค่อนข้างดี
stem separation กำลังกลายเป็นฟีเจอร์มาตรฐานในซอฟต์แวร์ดนตรี และ DAW แทบทุกตัวก็มีให้
สำหรับงานที่ผมทำ moises ใช้ง่ายกว่า: https://moises.ai/
รองรับการ transpose หรือยืดเวลาของทั้งเพลง และมีอินเทอร์เฟซเรียบง่ายสำหรับ stem separation รวมถึง mute และปรับ volume แยกตามแทร็ก ตรวจจับจังหวะและคอร์ดให้อัตโนมัติ
ไม่ได้มีส่วนเกี่ยวข้อง เป็นแค่ผู้ใช้ที่พอใจและใช้เกือบทุกวันเพื่อเรียนและฝึกเพลง ปกติผมจะเร่งพาร์ตเบสต้นฉบับขึ้น แล้วลดส่วนอื่น ๆ ให้ต่ำกว่า 10% เพื่อให้ได้ยินเบสชัด ๆ ซึ่งเผยให้เห็นดีมากว่าโน้ตเพลงออนไลน์ผิดบ่อยแค่ไหน แม้แต่แบบเสียเงินด้วยซ้ำ หลังจากจำพาร์ตได้แล้วก็ mute เบส แล้วเล่นตามเพลงต้นฉบับเหมือนเป็นมือเบส
0: https://www.stemroller.com/
Ableton Live - ไม่มี
Bitwig - ไม่มี
Cubase - ไม่มี
FL - มี
Logic - มี
Pro Tools - ไม่มี
Reason - ไม่มี
Reaper - ไม่มี
Studio One - มี
Polymath มีประสิทธิภาพในการแยกและดึงแทร็กเครื่องดนตรีแต่ละชิ้นจาก MP3 และทำงานได้ดีมาก
เจ๋งมากจริง ๆ แต่มีฟิสิกส์ของเครื่องดนตรีจริงที่ เทมเพลต Fourier transform แบบง่าย ๆ จับไม่ได้ ตัวอย่างเช่น ทรัมเป็ตอาจมีสเปกตรัมฮาร์มอนิกต่างกันมากเมื่อเป่าเบากับเป่าแรง แม้เป็นพิตช์เดียวกัน
ทรัมเป็ตสร้างลำดับฮาร์มอนิกที่มีฮาร์มอนิกเด่นและอุดมสมบูรณ์ จึงมี peak ชัดเจนที่ความถี่เป็นจำนวนเต็มเท่าของความถี่พื้นฐานใน Fourier transform เครื่องดนตรีอย่างฟลุตให้โทนที่บริสุทธิ์กว่า แต่เครื่องทองเหลืองมักมีฮาร์มอนิกสูงที่แรงกว่า ทำให้ partial derivative ของสมการเมทริกซ์ในบทความซับซ้อนขึ้นด้วย
สคริปต์นี้ระบุ timing ของโน้ตด้วยการกรองแบบ band-pass และ cross-correlation ของ envelope ช่วง attack และ release เครื่องทองเหลืองอาจมีพฤติกรรมไม่เชิงเส้นที่องค์ประกอบฮาร์มอนิกเปลี่ยนไปมากตามความแรงในการเล่น ดังนั้นไม่แน่ใจว่าอัลกอริทึมนี้จะรับมือกับกรณีที่ความสว่างของเสียงต่างกันระหว่าง pp กับ ff อย่างไร ถ้าจะเพิ่มความแม่นยำ ผมจะพิจารณาเพิ่ม เทมเพลต Fourier ที่ขึ้นกับไดนามิก แยกตามเครื่องดนตรี
หากเครื่องดนตรีไม่ได้ให้เสียงตามแบบฉบับ หรือในวงที่ไม่ได้เล่นและมิกซ์เพื่อให้การแยกระหว่างเครื่องดนตรีสูงสุด โมเดลเหล่านี้ทั้งหมดจะทำงานได้ไม่ดี ตัวอย่างเช่น กีตาร์ไฟฟ้าที่มีฮาร์มอนิกบิดเบือนเล่นโน้ตเดียวกับ vocal, มือกลองสร้างแต่เสียงแหลมคมจากฉาบ และมือเบสเลียนเสียงกระแทกแบบ kick drum ด้วยเครื่องดนตรี
ใน ดนตรีทดลอง แบบนี้ ผลลัพธ์ source separation จะคาดเดาไม่ได้เลย และอาจใช้กับการ rebalance ทางดนตรีได้หรือไม่ได้ก็ได้
ดูเหมือนเป็นผลงานที่น้องชายของ Joshua Bird ทำขึ้น Joshua Bird เองก็เคยทำโปรเจกต์น่าประทับใจที่เคยขึ้น HN มาก่อน: https://www.youtube.com/@joshuabird333
ทำให้นึกถึงตอนเล่น Audiosurf เมื่อราว 15 ปีก่อน เวลาเดินเร็วจริง ๆ
https://en.wikipedia.org/wiki/Audiosurf
ไม่รู้ว่าผมดูผิดหรือเปล่า แต่ดูเหมือนว่าในเดโม YouTube ไม่มีอันไหนที่แสดง source separation เลย
ขอเสริมว่า ในงานวิจัยด้านเสียง source separation หมายถึงการแยกเสียงออกเป็นคลิปต่าง ๆ
เป็นแฟนเก่าของ Ultrastar Deluxe มานาน มันเป็น โคลนโอเพนซอร์ส ของ Singstar และเป็นเกมคาราโอเกะที่ให้คนร้องเพลงตามและแข่งกัน
เกมจะตรวจจับโน้ตที่ร้อง แล้วนำไปเทียบกับไฟล์แมปเวลาร้องของเพลงนั้น ยิ่งร้องเข้ากับทำนองได้ดี คะแนนก็ยิ่งสูง ไม่ได้สำคัญว่าจะร้องเนื้อเพลงถูกต้องหรือไม่
แม้จะมีไลบรารีแมปเพลงที่แฟน ๆ ทำไว้มากมาย แต่ก็ยังไม่พอเสมอ และเพลงที่มีแมปในภาษาอื่นนอกจากอังกฤษกับสเปนมีน้อยมาก การแมปทั้งหมดด้วยมือใช้เวลามาก และยิ่งยากขึ้นเพราะตัวผมเองก็แทบจะร้องไม่ตรงคีย์เลย
ผมสงสัยมานานแล้วว่าซอฟต์แวร์แบบไหนจะช่วยทำให้กระบวนการนี้เป็นอัตโนมัติได้ง่ายขึ้น เครื่องมือนี้ดูเหมาะมากสำหรับการจับเวลาเสียงร้องและโน้ตจากเพลงต้นฉบับ
หนึ่งในสิ่งที่อยากทำสักวันคือสร้างเพลย์ลิสต์ Singstar เป็นภาษาแม่ของผม แล้วจัดปาร์ตี้ร้องเพลงกับเพื่อน ๆ ถ้ามีคำแนะนำเครื่องมือที่คล้ายกันก็อยากรู้
ดูเหมือนว่าไฟล์ข้อความต้องมีเสียงร้องและ pitch พร้อม timestamp และ AI ก็ใกล้ถึงระดับที่ทำให้การสร้างสิ่งนี้เป็นอัตโนมัติได้แล้ว
ฝากลิงก์ที่เพิ่งหาเจอไว้เผื่ออ่านต่อ: https://www.reddit.com/r/karaoke/comments/x61kzy/modern_equi...
สำหรับผม วิดีโอบางอันดูเหมือนจะ ไม่มีเสียง