คุณได้ยินเพลงที่คุ้นเคยในคลับหรือร้านอาหาร คุณฟังเพลงนี้เมื่อนานมาแล้วเป็นพันครั้งและความรู้สึกของเพลงนี้จับใจคุณจริงๆ พรุ่งนี้คุณอยากจะให้ใจมันมาก แต่จำชื่อมันไม่ได้! โชคดีที่ในโลกอนาคตอันน่าทึ่งของเราคุณมีโทรศัพท์ที่ติดตั้งซอฟต์แวร์จดจำเพลงไว้แล้วคุณก็จะรอด คุณสามารถผ่อนคลายได้เพราะซอฟต์แวร์บอกชื่อเพลงกับคุณและคุณรู้ว่าคุณสามารถได้ยินมันซ้ำแล้วซ้ำเล่าจนกว่ามันจะกลายเป็นส่วนหนึ่งของคุณ ... หรือคุณเบื่อหน่าย
เทคโนโลยีมือถือ พร้อมกับความก้าวหน้าอย่างมากในการประมวลผลสัญญาณเสียงทำให้เรา นักพัฒนาอัลกอริทึม ความสามารถในการสร้างตัวจดจำเพลง หนึ่งในแอพจดจำเพลงที่ได้รับความนิยมมากที่สุดคือ Shazam . หากคุณจับเพลงได้ 20 วินาทีไม่ว่าจะเป็นช่วงอินโทรกลอนหรือคอรัสก็จะสร้างลายนิ้วมือสำหรับตัวอย่างที่บันทึกไว้ดูฐานข้อมูลและใช้อัลกอริธึมการจดจำเพลงเพื่อบอกคุณว่าคุณกำลังฟังเพลงใด .
แต่ Shazam ทำงานอย่างไร? อัลกอริทึมของ Shazam ได้รับการเปิดเผยไปทั่วโลกโดยนักประดิษฐ์ Avery Li-Chung Wang ในปี 2003 ในบทความนี้เราจะพูดถึงพื้นฐานของอัลกอริธึมการจดจำเพลงของ Shazam
จริงๆแล้วเสียงคืออะไร? เป็นวัสดุลึกลับบางอย่างที่เราไม่สามารถสัมผัสได้ แต่สิ่งใดที่บินเข้าหูของเราและทำให้เราได้ยินสิ่งต่างๆ?
แน่นอนว่านี่ไม่ใช่อย่างนั้น เรารู้ว่าในความเป็นจริงเสียงคือการสั่นสะเทือนที่แพร่กระจายเป็น คลื่นกล ของความดันและการเคลื่อนที่ผ่านตัวกลางเช่นอากาศหรือน้ำ เมื่อการสั่นสะเทือนมาถึงหูของเราโดยเฉพาะแก้วหูมันจะเคลื่อนกระดูกเล็ก ๆ ซึ่งส่งการสั่นสะเทือนไปยังเซลล์ขนเล็ก ๆ ที่อยู่ลึกเข้าไปในหูชั้นในของเรา ในที่สุดเซลล์ขนเล็ก ๆ จะผลิตกระแสไฟฟ้าซึ่งส่งไปยังสมองของเราผ่านประสาทหู
อุปกรณ์บันทึกจะเลียนแบบกระบวนการนี้ค่อนข้างใกล้เคียงโดยใช้แรงดันของคลื่นเสียงเพื่อแปลงเป็นสัญญาณไฟฟ้า คลื่นเสียงที่แท้จริงในอากาศคือ ต่อเนื่อง สัญญาณแรงดัน ในไมโครโฟนอุปกรณ์ไฟฟ้าชิ้นแรกที่พบสัญญาณนี้จะแปลเป็นสัญญาณแรงดันไฟฟ้าแอนะล็อก - อีกครั้งต่อเนื่อง สัญญาณต่อเนื่องนี้ไม่มีประโยชน์ในโลกดิจิทัลดังนั้นก่อนจะประมวลผลได้ต้องแปลเป็นไฟล์ สัญญาณไม่ต่อเนื่อง ที่สามารถจัดเก็บแบบดิจิทัล ทำได้โดยการจับค่าดิจิทัลที่แสดงถึงแอมพลิจูดของสัญญาณ
การแปลงเกี่ยวข้องกับ การหาปริมาณ ของอินพุตและจำเป็นต้องมีข้อผิดพลาดเล็กน้อย ดังนั้นแทนที่จะแปลงไฟล์ ตัวแปลงอนาล็อกเป็นดิจิตอล ทำการแปลงจำนวนมากกับสัญญาณชิ้นเล็ก ๆ ซึ่งเป็นกระบวนการที่เรียกว่า การสุ่มตัวอย่าง
ทฤษฎีบท Nyquist-Shannon บอกให้เราทราบว่าอัตราการสุ่มตัวอย่างใดที่จำเป็นในการจับความถี่ที่แน่นอนในสัญญาณต่อเนื่อง โดยเฉพาะอย่างยิ่งในการจับความถี่ทั้งหมดที่มนุษย์สามารถได้ยินในสัญญาณเสียงเราต้องสุ่มตัวอย่างสัญญาณที่ความถี่สองเท่าของช่วงการได้ยินของมนุษย์ หูของมนุษย์สามารถตรวจจับความถี่ได้ประมาณ 20 Hz ถึง 20,000 Hz ด้วยเหตุนี้เสียงมักจะถูกบันทึกด้วยอัตราการสุ่มตัวอย่าง 44,100 Hz นี่คืออัตราการสุ่มตัวอย่างของ คอมแพคดิสก์ และยังเป็นอัตราที่ใช้บ่อยที่สุดด้วย MPEG-1 เสียง ( วีซีดี , SVCD , MP3 ). (อัตราเฉพาะนี้ถูกเลือกโดย Sony เนื่องจากสามารถบันทึกลงในอุปกรณ์วิดีโอที่ดัดแปลงซึ่งทำงานด้วยความเร็ว 25 เฟรมต่อวินาที ( เพื่อน ) หรือ 30 เฟรมต่อวินาที (โดยใช้ไฟล์ NTSC เครื่องบันทึกวิดีโอขาวดำ) และครอบคลุมแบนด์วิดท์ 20,000 Hz ที่คิดว่าจำเป็นเพื่อให้เข้ากับอุปกรณ์บันทึกอนาล็อกระดับมืออาชีพในเวลานั้น) ดังนั้นเมื่อเลือกความถี่ของตัวอย่างที่ต้องการบันทึกคุณอาจต้องการใช้ 44,100 Hz
การบันทึกสัญญาณเสียงตัวอย่างเป็นเรื่องง่าย เนื่องจากการ์ดเสียงสมัยใหม่มาพร้อมกับตัวแปลงอนาล็อกเป็นดิจิตอลอยู่แล้วเพียงแค่เลือกภาษาการเขียนโปรแกรมค้นหาไลบรารีที่เหมาะสมตั้งค่าความถี่ของตัวอย่างจำนวนช่องสัญญาณ (โดยทั่วไปคือโมโนหรือสเตอริโอ) ขนาดตัวอย่าง (เช่นตัวอย่าง 16 บิต ). จากนั้นเปิดบรรทัดจากการ์ดเสียงของคุณเช่นเดียวกับสตรีมอินพุตใด ๆ และเขียนลงในอาร์เรย์ไบต์ นี่คือวิธีที่สามารถทำได้ใน Java:
private AudioFormat getFormat() { float sampleRate = 44100; int sampleSizeInBits = 16; int channels = 1; //mono boolean signed = true; //Indicates whether the data is signed or unsigned boolean bigEndian = true; //Indicates whether the audio data is stored in big-endian or little-endian order return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed, bigEndian); } final AudioFormat format = getFormat(); //Fill AudioFormat with the settings DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); final TargetDataLine line = (TargetDataLine) AudioSystem.getLine(info); line.open(format); line.start();
เพียงอ่านข้อมูลจาก TargetDataLine
(ในตัวอย่างนี้แฟล็ก running
คือตัวแปรโกลบอลที่ถูกหยุดโดยเธรดอื่น - ตัวอย่างเช่นหากเรามี GUI พร้อมปุ่ม STOP)
OutputStream out = new ByteArrayOutputStream(); running = true; try { while (running) { int count = line.read(buffer, 0, buffer.length); if (count > 0) { out.write(buffer, 0, count); } } out.close(); } catch (IOException e) { System.err.println('I/O problems: ' + e); System.exit(-1); }
สิ่งที่เรามีในอาร์เรย์ไบต์นี้คือสัญญาณที่บันทึกในไฟล์ โดเมนเวลา . สัญญาณโดเมนเวลาแสดงถึงการเปลี่ยนแปลงแอมพลิจูดของสัญญาณเมื่อเวลาผ่านไป
ในช่วงต้นทศวรรษที่ 1800 Jean-Baptiste Joseph Fourier ได้ค้นพบที่น่าทึ่งว่าสัญญาณใด ๆ ในโดเมนเวลานั้นเทียบเท่ากับผลรวมของสัญญาณไซน์ไซน์ธรรมดาจำนวนหนึ่ง (อาจไม่มีที่สิ้นสุด) เนื่องจากส่วนประกอบแต่ละไซน์มีความถี่แอมพลิจูดที่แน่นอน และเฟส อนุกรมของไซนัสที่รวมกันเป็นสัญญาณโดเมนเวลาดั้งเดิมเรียกว่ามัน อนุกรมฟูริเยร์ .
กล่าวอีกนัยหนึ่งก็คือเป็นไปได้ที่จะแสดงสัญญาณโดเมนเวลาใด ๆ โดยเพียงแค่ให้ชุดความถี่แอมพลิจูดและเฟสที่สอดคล้องกับไซนัสแต่ละตัวที่ประกอบเป็นสัญญาณ การแสดงสัญญาณนี้เรียกว่า โดเมนความถี่ . ในบางวิธีโดเมนความถี่จะทำหน้าที่เป็นประเภทของลายนิ้วมือหรือลายเซ็นสำหรับสัญญาณโดเมนเวลาซึ่งให้การแสดงสัญญาณไดนามิกแบบคงที่
หน่วยความจำรั่วมีลักษณะอย่างไร
ภาพเคลื่อนไหวต่อไปนี้แสดงให้เห็นถึงอนุกรมฟูริเยร์ของ 1 เฮิรตซ์ คลื่นสี่เหลี่ยม และวิธีสร้างคลื่นสี่เหลี่ยม (โดยประมาณ) จากส่วนประกอบไซน์ สัญญาณจะแสดงในโดเมนเวลาด้านบนและโดเมนความถี่ด้านล่าง
ที่มา: René Schwarz
การวิเคราะห์สัญญาณในโดเมนความถี่ช่วยลดความยุ่งยากหลายอย่างได้อย่างมาก มันสะดวกกว่าในโลกของการประมวลผลสัญญาณดิจิทัลเนื่องจากวิศวกรสามารถศึกษาสเปกตรัม (การแสดงสัญญาณในโดเมนความถี่) และกำหนดความถี่ที่มีอยู่และความถี่ใดที่ขาดหายไป หลังจากนั้นเราสามารถกรองเพิ่มหรือลดความถี่บางส่วนหรือเพียงแค่จดจำโทนเสียงที่แน่นอนจากความถี่ที่กำหนด
ดังนั้นเราต้องหาวิธีแปลงสัญญาณจากโดเมนเวลาเป็นโดเมนความถี่ ที่นี่เราเรียกร้องให้ การแปลงฟูเรียร์แบบไม่ต่อเนื่อง (DFT) เพื่อขอความช่วยเหลือ DFT เป็นวิธีการทางคณิตศาสตร์สำหรับการดำเนินการ การวิเคราะห์ฟูริเยร์ บนสัญญาณที่ไม่ต่อเนื่อง (ตัวอย่าง) มันแปลงรายการ จำกัด ของตัวอย่างฟังก์ชันที่มีระยะห่างเท่า ๆ กันให้เป็นรายการค่าสัมประสิทธิ์ของการรวมกันของไซนัสที่ซับซ้อนจำนวน จำกัด ซึ่งเรียงลำดับตามความถี่ของพวกมันโดยพิจารณาว่าไซนัสเหล่านั้นถูกสุ่มตัวอย่างในอัตราเดียวกัน
หนึ่งในอัลกอริทึมเชิงตัวเลขที่ได้รับความนิยมมากที่สุดสำหรับการคำนวณ DFT คือ การแปลงฟูเรียร์อย่างรวดเร็ว (FFT) โดยรูปแบบที่ใช้บ่อยที่สุดของ FFT คือไฟล์ อัลกอริทึม Cooley - Tukey . นี่คืออัลกอริทึมการแบ่งและพิชิตที่แบ่ง DFT แบบวนซ้ำออกเป็น DFT ขนาดเล็กจำนวนมาก ในขณะที่การประเมิน DFT ต้องใช้โดยตรง หรือ( n 2) การดำเนินการกับ Cooley-Tukey FFT ผลลัพธ์เดียวกันจะถูกคำนวณในรูปแบบ หรือ( n บันทึก n ) การดำเนินงาน
การหาไลบรารีที่เหมาะสมสำหรับ FFT ไม่ใช่เรื่องยาก นี่คือบางส่วนของพวกเขา:
ด้านล่างนี้เป็นตัวอย่างของฟังก์ชัน FFT ที่เขียนด้วย Java (FFT ใช้จำนวนเชิงซ้อนเป็นอินพุตหากต้องการเข้าใจความสัมพันธ์ระหว่างจำนวนเชิงซ้อนกับฟังก์ชันตรีโกณมิติโปรดอ่าน สูตรของออยเลอร์ .)
public static Complex[] fft(Complex[] x) { int N = x.length; // fft of even terms Complex[] even = new Complex[N / 2]; for (int k = 0; k และนี่คือตัวอย่างของสัญญาณก่อนและหลังการวิเคราะห์ FFT:

การจดจำเพลง: การพิมพ์ลายนิ้วมือเพลง
ผลข้างเคียงที่น่าเสียดายอย่างหนึ่งของ FFT คือเราสูญเสียข้อมูลจำนวนมากเกี่ยวกับเวลา (แม้ว่าในทางทฤษฎีจะสามารถหลีกเลี่ยงสิ่งนี้ได้ แต่ค่าใช้จ่ายในการแสดงก็มหาศาลมาก) สำหรับเพลงความยาว 3 นาทีเราจะเห็นความถี่และขนาดทั้งหมดของพวกเขา แต่เราไม่มีเงื่อนงำเมื่ออยู่ในเพลงที่พวกเขาปรากฏ แต่นี่คือคีย์ข้อมูลที่ทำให้เพลงมันคืออะไร! เราต้องรู้ว่าเวลาใดที่แต่ละความถี่ปรากฏขึ้น
นั่นคือเหตุผลที่เรานำเสนอหน้าต่างบานเลื่อนหรือส่วนข้อมูลและแปลงข้อมูลเพียงส่วนนี้ ขนาดของแต่ละชิ้นสามารถกำหนดได้หลายวิธี ตัวอย่างเช่นหากเราบันทึกเสียงในรูปแบบสเตอริโอด้วยตัวอย่าง 16 บิตที่ 44,100 Hz หนึ่งวินาทีของเสียงดังกล่าวจะเท่ากับ 44,100 ตัวอย่าง * 2 ไบต์ * 2 แชนเนล≈ 176 kB ถ้าเราเลือกขนาดของท่อน 4 kB เราจะมีข้อมูล 44 ชิ้นเพื่อวิเคราะห์ในทุก ๆ วินาทีของเพลง มีความหนาแน่นเพียงพอสำหรับการวิเคราะห์โดยละเอียดที่จำเป็นสำหรับการระบุเสียง
ตอนนี้กลับไปที่การเขียนโปรแกรม:
byte audio [] = out.toByteArray() int totalSize = audio.length int sampledChunkSize = totalSize/chunkSize; Complex[][] result = ComplexMatrix[sampledChunkSize][]; for(int j = 0;i ในวงในเรากำลังใส่ข้อมูลโดเมนเวลา (ตัวอย่าง) ลงในจำนวนเชิงซ้อนโดยมีส่วนจินตภาพเป็น 0 ในวงนอกเราวนซ้ำผ่านชิ้นส่วนทั้งหมดและทำการวิเคราะห์ FFT ในแต่ละส่วน
เมื่อเรามีข้อมูลเกี่ยวกับการกำหนดความถี่ของสัญญาณแล้วเราสามารถเริ่มสร้างลายนิ้วมือดิจิทัลของเพลงได้ นี่เป็นส่วนที่สำคัญที่สุดของกระบวนการจดจำเสียงของ Shazam ทั้งหมด ความท้าทายหลักคือวิธีแยกแยะในมหาสมุทรแห่งความถี่ที่จับได้ว่าความถี่ใดสำคัญที่สุด โดยสัญชาตญาณเราค้นหาความถี่ที่มีขนาดสูงสุด (โดยทั่วไปเรียกว่ายอด)
อย่างไรก็ตามในเพลงหนึ่งช่วงของความถี่ที่หนักแน่นอาจแตกต่างกันไประหว่าง C - C1 ต่ำ (32.70 Hz) และ C - C8 สูง (4,186.01 Hz) นี่เป็นช่วงเวลาสำคัญที่จะครอบคลุม ดังนั้นแทนที่จะวิเคราะห์ช่วงความถี่ทั้งหมดในครั้งเดียวเราสามารถเลือกช่วงเวลาที่เล็กลงได้หลายช่วงโดยเลือกตามความถี่ทั่วไปของส่วนประกอบดนตรีที่สำคัญและวิเคราะห์แต่ละช่วงแยกกัน ตัวอย่างเช่นเราอาจใช้ช่วงเวลา ผู้ชายคนนี้ เลือกใช้อัลกอริทึม Shazam เหล่านี้คือ 30 Hz - 40 Hz, 40 Hz - 80 Hz และ 80 Hz - 120 Hz สำหรับเสียงต่ำ (เช่นครอบคลุมกีตาร์เบส) และ 120 Hz - 180 Hz และ 180 Hz - 300 Hz สำหรับเสียงกลางและสูงกว่า (ครอบคลุมเสียงร้องและเครื่องดนตรีอื่น ๆ ส่วนใหญ่)
ในแต่ละช่วงเวลาเราสามารถระบุความถี่ที่มีขนาดสูงสุดได้ ข้อมูลนี้เป็นลายเซ็นสำหรับท่อนนี้ของเพลงและลายเซ็นนี้จะกลายเป็นส่วนหนึ่งของลายนิ้วมือของเพลงโดยรวม
public final int[] RANGE = new int[] { 40, 80, 120, 180, 300 }; // find out in which range is frequency public int getIndex(int freq) { int i = 0; while (RANGE[i] โปรดทราบว่าเราต้องถือว่าการบันทึกไม่ได้ทำในสภาพสมบูรณ์ (เช่น 'ห้องคนหูหนวก') และด้วยเหตุนี้เราจึงต้องรวมปัจจัยที่เป็นฝอย การวิเคราะห์ปัจจัย Fuzz ควรได้รับการพิจารณาอย่างจริงจังและในระบบจริงโปรแกรมควรมีตัวเลือกในการตั้งค่าพารามิเตอร์นี้ตามเงื่อนไขของการบันทึก
เพื่อให้ค้นหาเสียงได้ง่ายลายเซ็นนี้จะกลายเป็นกุญแจสำคัญในตารางแฮช ค่าที่สอดคล้องกันคือเวลาที่ชุดความถี่นี้ปรากฏในเพลงพร้อมกับ ID เพลง (ชื่อเพลงและศิลปิน) นี่คือตัวอย่างว่าระเบียนเหล่านี้อาจปรากฏในฐานข้อมูลได้อย่างไร
แฮชแท็ก เวลาเป็นวินาที เพลง 30 51 99 121 195
53.52 เพลง A โดยศิลปิน A. 33 56 92 151 185
12.32 เพลง B โดยศิลปิน B 39 26 89 141 251
15.34 เพลง C โดยศิลปิน C 32 67 100 128 270
78.43 เพลง D โดยศิลปิน D 30 51 99 121 195
10.89 เพลง E โดยศิลปิน E 34 57 95 111 200
54.52 เพลง A โดยศิลปิน A. 34 41 93 161 202
11.89 เพลง E โดยศิลปิน E
หากเราเรียกใช้ไลบรารีเพลงทั้งหมดผ่านขั้นตอนการระบุเพลงนี้เราสามารถสร้างฐานข้อมูลด้วยลายนิ้วมือที่สมบูรณ์ของทุกเพลงในไลบรารี
ที่เกี่ยวข้อง: บทช่วยสอนการเรียนรู้เชิงลึก: จาก Perceptrons ไปจนถึง Deep Networks อัลกอริทึมเพลง: การระบุเพลง
ในการระบุเพลงที่กำลังเล่นอยู่ในคลับเราบันทึกเพลงด้วยโทรศัพท์ของเราและเรียกใช้การบันทึกผ่านกระบวนการพิมพ์ลายนิ้วมือเสียงเดียวกันกับด้านบน จากนั้นเราสามารถเริ่มค้นหาฐานข้อมูลเพื่อหาแท็กแฮชที่ตรงกัน
ในขณะที่เกิดขึ้นแท็กแฮชจำนวนมากจะตรงกับตัวระบุเพลงของหลายเพลง ตัวอย่างเช่นอาจเป็นไปได้ว่าบางท่อนของเพลง A ฟังดูเหมือนเพลง E บางท่อนแน่นอนว่าไม่น่าแปลกใจนักดนตรีมักจะ 'ยืม' เลียและริฟฟ์จากกันและกันและทุกวันนี้โปรดิวเซอร์ก็ลองฟังเพลงอื่น ๆ ทั้งหมด เวลา. ทุกครั้งที่เราจับคู่แฮชแท็กจำนวนการจับคู่ที่เป็นไปได้จะน้อยลง แต่มีแนวโน้มว่าข้อมูลนี้เพียงอย่างเดียวจะไม่ จำกัด การจับคู่ให้แคบลงเหลือเพียงเพลงเดียว ดังนั้นมีอีกสิ่งหนึ่งที่เราต้องตรวจสอบด้วยอัลกอริธึมการจดจำเพลงของเราและนั่นก็คือเวลา
ตัวอย่างที่เราบันทึกในคลับอาจมาจากจุดใดจุดหนึ่งในเพลงดังนั้นเราจึงไม่สามารถจับคู่การประทับเวลาของแฮชที่ตรงกันกับการประทับเวลาของตัวอย่างของเราได้ อย่างไรก็ตามด้วยแฮชที่ตรงกันหลายรายการเราสามารถวิเคราะห์ไฟล์ ญาติ เวลาของการแข่งขันจึงเพิ่มความแน่นอนของเรา
ตัวอย่างเช่นหากคุณดูในตารางด้านบนคุณจะเห็นแฮชแท็กนั้น 30 51 99 121 195
สอดคล้องกับทั้งเพลง A และเพลง E หากหนึ่งวินาทีต่อมาเราจับคู่แฮช 34 57 95 111 200
นั่นคืออีกหนึ่งคู่ของเพลง A แต่ในกรณีนี้เรารู้ว่าทั้งแฮชและความแตกต่างของเวลาตรงกัน
// Class that represents specific moment in a song private class DataPoint { private int time; private int songId; public DataPoint(int songId, int time) { this.songId = songId; this.time = time; } public int getTime() { return time; } public int getSongId() { return songId; } }
มาดูกัน ผมหนึ่ง และ ผม2 เป็นช่วงเวลาในเพลงที่บันทึกไว้และ ญหนึ่ง และ ญ2 เป็นช่วงเวลาในเพลงจากฐานข้อมูล เราสามารถพูดได้ว่าเรามีการแข่งขันสองรายการที่มีการแข่งขันต่างเวลาหาก:
RecordedHash (iหนึ่ง) = SongInDBHash (ญหนึ่ง) และ RecordedHash (i2) = SongInDBHash (ญ2)
โปรแกรมที่ใช้ c++
และ
เอบีเอส (iหนึ่ง- ผม2) = abs (ญหนึ่ง- ญ2)
ซึ่งทำให้เรามีความยืดหยุ่นในการบันทึกเพลงตั้งแต่ต้นกลางหรือตอนท้าย
สุดท้ายนี้ไม่น่าเป็นไปได้ที่ทุกช่วงเวลาของเพลงที่เราบันทึกในคลับจะตรงกับทุกช่วงเวลาของเพลงเดียวกันในห้องสมุดของเราซึ่งบันทึกไว้ในสตูดิโอ การบันทึกจะมีสัญญาณรบกวนจำนวนมากซึ่งจะทำให้เกิดข้อผิดพลาดบางอย่างในการแข่งขัน ดังนั้นแทนที่จะพยายามกำจัดเพลงที่ถูกต้องทั้งหมดออกจากรายการการแข่งขันของเราในตอนท้ายเราจัดเรียงเพลงที่ตรงกันทั้งหมดตามลำดับความเป็นไปได้จากมากไปหาน้อยและเพลงโปรดของเราคือเพลงแรกในรายการจัดอันดับ
จากบนลงล่าง
เพื่อตอบคำถาม“ Shazam ทำงานอย่างไร” นี่คือภาพรวมของกระบวนการจดจำและการจับคู่เพลงทั้งหมดจากบนลงล่าง:

สำหรับระบบประเภทนี้ฐานข้อมูลอาจมีขนาดใหญ่มากดังนั้นจึงเป็นเรื่องสำคัญที่จะต้องใช้ฐานข้อมูลที่ปรับขนาดได้ ไม่จำเป็นต้องมีความสัมพันธ์เป็นพิเศษและแบบจำลองข้อมูลนั้นค่อนข้างเรียบง่ายดังนั้นจึงเป็นกรณีที่ดีสำหรับการใช้ฐานข้อมูล NoSQL บางประเภท
Shazam ทำงานอย่างไร? คุณรู้แล้วตอนนี้
ซอฟต์แวร์จดจำเพลงประเภทนี้สามารถใช้เพื่อค้นหาความคล้ายคลึงกันระหว่างเพลง ตอนนี้คุณเข้าใจวิธีการทำงานของ Shazam แล้วคุณจะเห็นว่าแอปพลิเคชั่นนี้มีแอพพลิเคชั่นที่นอกเหนือไปจาก Shazaming ที่เล่นเพลงคิดถึงบนวิทยุแท็กซี่ได้อย่างไร ตัวอย่างเช่นสามารถช่วยระบุการลอกเลียนแบบในดนตรีหรือเพื่อค้นหาว่าใครเป็นแรงบันดาลใจเริ่มต้นของผู้บุกเบิกดนตรีบลูส์แจ๊สร็อคป๊อปหรือแนวเพลงอื่น ๆ บางทีการทดลองที่ดีอาจเป็นการเติมเต็มฐานข้อมูลตัวอย่างเพลงด้วยดนตรีคลาสสิกของ Bach, Beethoven, Vivaldi, Wagner, Chopin และ Mozart และลองค้นหาความคล้ายคลึงกันระหว่างเพลง คุณคงคิดว่าแม้แต่ Bob Dylan, Elvis Presley และ Robert Johnson ก็เป็นนักลอกเลียนแบบ!
แต่ถึงกระนั้นเราก็ไม่สามารถตัดสินพวกเขาได้เพราะดนตรีเป็นเพียงคลื่นที่เราได้ยินจดจำและทำซ้ำในหัวของเราซึ่งมันจะวิวัฒนาการและเปลี่ยนแปลงไปจนกว่าเราจะบันทึกมันในสตูดิโอและส่งต่อไปยังอัจฉริยะทางดนตรีที่ยิ่งใหญ่คนต่อไป
ที่เกี่ยวข้อง: บทนำเกี่ยวกับทฤษฎีแมชชีนเลิร์นนิงและการประยุกต์ใช้: บทช่วยสอนแบบภาพพร้อมตัวอย่าง ทำความเข้าใจพื้นฐาน
อัลกอริทึม Shazam ทำงานอย่างไร
อัลกอริทึม Shazam กลั่นตัวอย่างเพลงเป็นลายนิ้วมือและจับคู่ลายนิ้วมือเหล่านี้กับลายนิ้วมือจากเพลงที่รู้จักโดยคำนึงถึงเวลาที่สัมพันธ์กันภายในเพลง
ลายนิ้วมือเสียงคืออะไร?
ลายนิ้วมือเสียงคือชุดของแท็กแฮชหรือลายเซ็นของตัวอย่างเพลง พวกเขาวัดว่าความถี่ใดในแต่ละตัวอย่างแรงที่สุด
Shazam ค้นหาเพลงได้อย่างไร?
Shazam ค้นหาเพลงโดยเปรียบเทียบลายนิ้วมือเสียงของการบันทึกที่ผู้ใช้จัดหาให้กับลายนิ้วมือของเพลงที่รู้จักจากฐานข้อมูล