2 คะแนน โดย GN⁺ 2024-11-11 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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 ความคิดเห็น

 
GN⁺ 2024-11-11
ความคิดเห็นบน Hacker News
  • ชื่อเรื่องชวนสับสนนิดหน่อย ถ้าเขียนว่า open-source separation จะอ่านเหมือนการแยกแหล่งเสียง (source separation) แต่จริง ๆ แล้วไม่ใช่แบบนั้น เป็น อัลกอริทึมตรวจจับพิตช์ และเป็นวิธีจัดประเภทว่าพิตช์ที่ตรวจพบมาจากเครื่องดนตรีใด
    ค่อนข้างเจ๋งทีเดียว แต่ถ้าต้องการผลลัพธ์ที่แม่นยำจริง ๆ ดูเหมือนว่าเวลาแก้เอาต์พุตอาจนานกว่าทำด้วยมือเองด้วยซ้ำ

    • เพื่อความเป็นธรรมกับผู้เขียน เขายังเป็นนักเรียนมัธยมอยู่: https://matthew-bird.com/about.html
      สำหรับผลงานที่ทำได้ในวัยนั้นถือว่าน่าทึ่ง
    • สงสัยว่า source separation โดยปกติเรียกว่า stem 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 เป็นประเภทที่ “ดูเหมือนง่าย แต่จริง ๆ ไม่ใช่”
      ตัวถอดเสียงจากเสียงเป็น MIDI ทายพิตช์และเวลาเริ่มได้ดี แต่ความยาวและไดนามิกยังเสถียรน้อยกว่ามาก
    • ผมรู้ว่าคะแนนที่รายงานของ MT3 ดีมาก แต่อยากรู้ว่าเวลาได้ลองใช้เองแล้วสำเร็จดีไหม: https://replicate.com/turian/multi-task-music-transcription
      ผมพอร์ต Colab ของพวกเขาให้เป็น runtime เพื่อให้ใช้ง่ายขึ้น แต่เอาต์พุต MIDI ค่อนข้างแปลก
      แม้ใส่ stem ง่าย ๆ บางแทร็กก็ไม่ตรงกับเอาต์พุต MIDI และเสียง มีปัญหาเรื่อง timing จนใช้ไม่ได้ แต่กับเสียงอื่น ๆ ก็ทำงานได้โอเค
    • สงสัยว่าถ้าจำกัดเฉพาะเปียโน ปัญหานี้จะง่ายลงอย่างไร
  • ถ้าสนใจการแยกเสียงหรือ stem separation ก็น่าลองดู RipX: https://hitnmix.com/ripx-daw-pro/
    สามารถ export แทร็กที่แยกแล้วเป็นไฟล์ MIDI ได้ด้วย ยังมีปัญหาอยู่บ้าง แต่ทำงานได้ค่อนข้างดี
    stem separation กำลังกลายเป็นฟีเจอร์มาตรฐานในซอฟต์แวร์ดนตรี และ DAW แทบทุกตัวก็มีให้

    • RipX ทำ stem separation และปรับพิตช์ของโน้ตในมิกซ์ใหม่ได้ จึงยอดเยี่ยมถ้านั่นคือเป้าหมาย
      สำหรับงานที่ผมทำ moises ใช้ง่ายกว่า: https://moises.ai/
      รองรับการ transpose หรือยืดเวลาของทั้งเพลง และมีอินเทอร์เฟซเรียบง่ายสำหรับ stem separation รวมถึง mute และปรับ volume แยกตามแทร็ก ตรวจจับจังหวะและคอร์ดให้อัตโนมัติ
      ไม่ได้มีส่วนเกี่ยวข้อง เป็นแค่ผู้ใช้ที่พอใจและใช้เกือบทุกวันเพื่อเรียนและฝึกเพลง ปกติผมจะเร่งพาร์ตเบสต้นฉบับขึ้น แล้วลดส่วนอื่น ๆ ให้ต่ำกว่า 10% เพื่อให้ได้ยินเบสชัด ๆ ซึ่งเผยให้เห็นดีมากว่าโน้ตเพลงออนไลน์ผิดบ่อยแค่ไหน แม้แต่แบบเสียเงินด้วยซ้ำ หลังจากจำพาร์ตได้แล้วก็ mute เบส แล้วเล่นตามเพลงต้นฉบับเหมือนเป็นมือเบส
    • Stemroller[0] ก็มีมาพักหนึ่งแล้ว ฟรี และใช้โมเดลของ Meta
      0: https://www.stemroller.com/
    • มากกว่าจะบอกว่า “DAW แทบทุกตัวมีให้” ควรบอกว่าเป็น ฟีเจอร์เกิดใหม่ ที่ DAW แทบทุกตัวควรมี แต่ส่วนใหญ่ยังไม่มี
      Ableton Live - ไม่มี
      Bitwig - ไม่มี
      Cubase - ไม่มี
      FL - มี
      Logic - มี
      Pro Tools - ไม่มี
      Reason - ไม่มี
      Reaper - ไม่มี
      Studio One - มี
    • ดูเหมือนเกี่ยวข้องกับ Polymath: https://github.com/samim23/polymath
      Polymath มีประสิทธิภาพในการแยกและดึงแทร็กเครื่องดนตรีแต่ละชิ้นจาก MP3 และทำงานได้ดีมาก
  • เจ๋งมากจริง ๆ แต่มีฟิสิกส์ของเครื่องดนตรีจริงที่ เทมเพลต Fourier transform แบบง่าย ๆ จับไม่ได้ ตัวอย่างเช่น ทรัมเป็ตอาจมีสเปกตรัมฮาร์มอนิกต่างกันมากเมื่อเป่าเบากับเป่าแรง แม้เป็นพิตช์เดียวกัน
    ทรัมเป็ตสร้างลำดับฮาร์มอนิกที่มีฮาร์มอนิกเด่นและอุดมสมบูรณ์ จึงมี peak ชัดเจนที่ความถี่เป็นจำนวนเต็มเท่าของความถี่พื้นฐานใน Fourier transform เครื่องดนตรีอย่างฟลุตให้โทนที่บริสุทธิ์กว่า แต่เครื่องทองเหลืองมักมีฮาร์มอนิกสูงที่แรงกว่า ทำให้ partial derivative ของสมการเมทริกซ์ในบทความซับซ้อนขึ้นด้วย
    สคริปต์นี้ระบุ timing ของโน้ตด้วยการกรองแบบ band-pass และ cross-correlation ของ envelope ช่วง attack และ release เครื่องทองเหลืองอาจมีพฤติกรรมไม่เชิงเส้นที่องค์ประกอบฮาร์มอนิกเปลี่ยนไปมากตามความแรงในการเล่น ดังนั้นไม่แน่ใจว่าอัลกอริทึมนี้จะรับมือกับกรณีที่ความสว่างของเสียงต่างกันระหว่าง pp กับ ff อย่างไร ถ้าจะเพิ่มความแม่นยำ ผมจะพิจารณาเพิ่ม เทมเพลต Fourier ที่ขึ้นกับไดนามิก แยกตามเครื่องดนตรี

    • ในฐานะคนที่ใช้ source separation สัปดาห์ละสองครั้งเพื่อการมิกซ์ มีเครื่องดนตรีจำนวนมากที่สามารถให้โทนเสียงแบบ “vocal” ได้
      หากเครื่องดนตรีไม่ได้ให้เสียงตามแบบฉบับ หรือในวงที่ไม่ได้เล่นและมิกซ์เพื่อให้การแยกระหว่างเครื่องดนตรีสูงสุด โมเดลเหล่านี้ทั้งหมดจะทำงานได้ไม่ดี ตัวอย่างเช่น กีตาร์ไฟฟ้าที่มีฮาร์มอนิกบิดเบือนเล่นโน้ตเดียวกับ vocal, มือกลองสร้างแต่เสียงแหลมคมจากฉาบ และมือเบสเลียนเสียงกระแทกแบบ kick drum ด้วยเครื่องดนตรี
      ใน ดนตรีทดลอง แบบนี้ ผลลัพธ์ source separation จะคาดเดาไม่ได้เลย และอาจใช้กับการ rebalance ทางดนตรีได้หรือไม่ได้ก็ได้
  • ดูเหมือนเป็นผลงานที่น้องชายของ Joshua Bird ทำขึ้น Joshua Bird เองก็เคยทำโปรเจกต์น่าประทับใจที่เคยขึ้น HN มาก่อน: https://www.youtube.com/@joshuabird333

    • ใช่แล้ว Matt เป็นน้องชายของ Josh น่าทึ่งและดีใจมากที่คุณสังเกตเห็น
  • ทำให้นึกถึงตอนเล่น Audiosurf เมื่อราว 15 ปีก่อน เวลาเดินเร็วจริง ๆ
    https://en.wikipedia.org/wiki/Audiosurf

  • ไม่รู้ว่าผมดูผิดหรือเปล่า แต่ดูเหมือนว่าในเดโม YouTube ไม่มีอันไหนที่แสดง source separation เลย
    ขอเสริมว่า ในงานวิจัยด้านเสียง source separation หมายถึงการแยกเสียงออกเป็นคลิปต่าง ๆ

    • ในที่นี้คำว่า decomposition น่าจะตรงกว่า ดูเหมือนว่า source separation ในกรณีนี้ถูกใช้ในความหมายว่าสามารถแบ่งโน้ตที่แยกย่อยแล้วไปตามแหล่งกำเนิดต่าง ๆ ได้ แต่เป็นคำที่ชวนให้เข้าใจผิด
    • ตรงนี้ “source” ดูเหมือนจะหมายถึง source ในคำว่า “open source”
  • เป็นแฟนเก่าของ Ultrastar Deluxe มานาน มันเป็น โคลนโอเพนซอร์ส ของ Singstar และเป็นเกมคาราโอเกะที่ให้คนร้องเพลงตามและแข่งกัน
    เกมจะตรวจจับโน้ตที่ร้อง แล้วนำไปเทียบกับไฟล์แมปเวลาร้องของเพลงนั้น ยิ่งร้องเข้ากับทำนองได้ดี คะแนนก็ยิ่งสูง ไม่ได้สำคัญว่าจะร้องเนื้อเพลงถูกต้องหรือไม่
    แม้จะมีไลบรารีแมปเพลงที่แฟน ๆ ทำไว้มากมาย แต่ก็ยังไม่พอเสมอ และเพลงที่มีแมปในภาษาอื่นนอกจากอังกฤษกับสเปนมีน้อยมาก การแมปทั้งหมดด้วยมือใช้เวลามาก และยิ่งยากขึ้นเพราะตัวผมเองก็แทบจะร้องไม่ตรงคีย์เลย
    ผมสงสัยมานานแล้วว่าซอฟต์แวร์แบบไหนจะช่วยทำให้กระบวนการนี้เป็นอัตโนมัติได้ง่ายขึ้น เครื่องมือนี้ดูเหมาะมากสำหรับการจับเวลาเสียงร้องและโน้ตจากเพลงต้นฉบับ
    หนึ่งในสิ่งที่อยากทำสักวันคือสร้างเพลย์ลิสต์ Singstar เป็นภาษาแม่ของผม แล้วจัดปาร์ตี้ร้องเพลงกับเพื่อน ๆ ถ้ามีคำแนะนำเครื่องมือที่คล้ายกันก็อยากรู้

    • ดีเลย ไม่รู้มาก่อนว่ามีของแบบนี้อยู่
      ดูเหมือนว่าไฟล์ข้อความต้องมีเสียงร้องและ pitch พร้อม timestamp และ AI ก็ใกล้ถึงระดับที่ทำให้การสร้างสิ่งนี้เป็นอัตโนมัติได้แล้ว
      ฝากลิงก์ที่เพิ่งหาเจอไว้เผื่ออ่านต่อ: https://www.reddit.com/r/karaoke/comments/x61kzy/modern_equi...
  • สำหรับผม วิดีโอบางอันดูเหมือนจะ ไม่มีเสียง

    • ในลิงก์ YouTube มีเขียนเหตุผลไว้ว่า “ไม่มีเสียงเนื่องจากลิขสิทธิ์” และมีลิงก์เสียงที่สามารถเปิดเล่นคู่กันได้ด้วย