2010-07-03 57 views
7

Về cơ bản, tôi có rất nhiều tệp âm thanh đại diện cho cùng một bài hát. Tuy nhiên, một số trong số đó có chất lượng kém hơn bản gốc và một số được chỉnh sửa ở nơi chúng không khớp với bài hát gốc nữa. Những gì tôi muốn làm là lập trình so sánh các tập tin âm thanh với bản gốc và xem những cái nào phù hợp với bài hát đó, bất kể chất lượng. Một so sánh trực tiếp rõ ràng sẽ không hoạt động vì chất lượng của các tập tin khác nhau.So sánh hai tệp âm thanh

Tôi tin rằng điều này có thể được thực hiện bằng cách phân tích cấu trúc của bài hát và so sánh với bản gốc, nhưng tôi không biết gì về kỹ thuật âm thanh để không giúp tôi nhiều. Tất cả các bài hát có cùng định dạng (MP3). Ngoài ra, tôi đang sử dụng Python, vì vậy nếu có những ràng buộc cho nó, điều đó sẽ thật tuyệt vời; nếu không, một cái gì đó cho JVM hoặc thậm chí một thư viện bản địa sẽ được tốt là tốt, miễn là nó chạy trên Linux và tôi có thể tìm ra cách sử dụng nó.

+1

Xem cách Shazam hoạt động: http://laplacian.wordpress.com/2009/01/10/how-shazam-works/ –

+0

+1, bài đăng blog thú vị – BenG

+0

Hmm, âm thanh như thế này không đơn giản như Tôi nghĩ nó sẽ như thế. –

Trả lời

4

sao chép từ that câu trả lời:

Cùng câu hỏi chính xác mà người ở AudioScrobbler cũ và hiện tại MusicBrainz đã làm việc trên từ lâu rồi. Trong thời gian này, dự án Python có thể hỗ trợ cho nhiệm vụ của bạn, là Picard, sẽ gắn thẻ các tệp âm thanh (không chỉ các tệp MPEG 1 Lớp 3) với GUID (thực ra, một vài trong số chúng), và từ đó trở đi, khớp với thẻ khá đơn giản.

Nếu bạn muốn làm điều đó như một dự án của riêng bạn, libofa có thể giúp đỡ. documentation for the Python wrapper có lẽ sẽ giúp bạn nhiều nhất.

+0

Tôi đã sử dụng Picard, ít nhất là bây giờ. Cảm ơn. :) –

6

Trước tiên, bạn sẽ phải thay đổi miền so sánh của mình. Phân tích các mẫu thô từ các tệp không nén sẽ giúp bạn không có nơi nào. Đo khoảng cách của bạn sẽ dựa trên một hoặc nhiều tính năng mà bạn trích xuất từ ​​các mẫu âm thanh. Wikipedia liệt kê các tính năng sau như thường được sử dụng cho Acoustic Fingerprinting:

đặc Perceptual thường khai thác bằng dấu vân tay âm thanh bao gồm trung bình tỷ lệ không qua, tiến độ dự kiến, phổ trung bình, độ phẳng quang phổ, tông màu nổi bật trên một tập hợp của ban nhạc, và băng thông.

Tôi không có giải pháp có lập trình cho bạn nhưng dưới đây là interesting attempt khi thiết kế ngược hệ thống ID âm thanh của YouTube. Nó được sử dụng để phát hiện vi phạm bản quyền, một vấn đề tương tự.

13

Đây thực sự không phải là một nhiệm vụ tầm thường. Tôi không nghĩ rằng bất kỳ thư viện nào có thể làm được. Đây là một cách tiếp cận có thể có:

  1. Giải mã mp3 sang PCM.
  2. Đảm bảo rằng dữ liệu PCM có tỷ lệ mẫu cụ thể mà bạn chọn trước (ví dụ: 16KHz). Bạn cần phải định lại các bài hát có tỷ lệ mẫu khác nhau. Tỷ lệ mẫu cao là không cần thiết vì bạn cần một so sánh mờ, nhưng tỷ lệ mẫu quá thấp sẽ mất quá nhiều chi tiết.
  3. Chuẩn hóa dữ liệu PCM (ví dụ: tìm giá trị mẫu tối đa và rescale tất cả các mẫu để mẫu có biên độ lớn nhất sử dụng toàn bộ dải định dạng dữ liệu động, ví dụ: nếu định dạng mẫu được ký 16 bit, thì sau khi chuẩn hóa tối đa mẫu biên độ phải có giá trị 32767 hoặc -32767).
  4. Chia dữ liệu âm thanh thành các khung số mẫu cố định (ví dụ: 1000 mẫu trên mỗi khung hình).
  5. Chuyển đổi từng khung thành miền phổ (FFT).
  6. Tính tương quan giữa chuỗi các khung đại diện cho hai bài hát. Nếu chỉnh sửa lớn hơn ngưỡng nhất định, giả sử các bài hát giống nhau.

Python thư viện:

  • PyMedia (cho bước 1)
  • NumPy (cho xử lý dữ liệu) - also see this article cho một số thông tin giới thiệu

Một đề phức tạp nữa. Các bài hát của bạn có thể có độ dài khác nhau của sự im lặng ngay từ đầu.Vì vậy, để tránh âm tính giả, bạn có thể cần thêm một bước:

3.1. Quét dữ liệu PCM ngay từ đầu cho đến khi năng lượng âm thanh vượt quá ngưỡng được xác định trước. (Ví dụ: tính RMS với cửa sổ trượt 10 mẫu và dừng khi vượt quá 1% phạm vi động). Sau đó, loại bỏ tất cả dữ liệu cho đến thời điểm này.

+0

Dữ liệu PCM là một mảng byte phải không? Trong bước 3, trong khi bình thường hóa vì chúng ta cần biên độ lên đến 32767, tôi tin rằng bạn sẽ chuyển đổi nó thành một mảng nguyên/đôi. Nêu tôi sai vui long chân chỉnh tôi. Ngoài ra, chúng ta có cần tính toán mối tương quan trong bước 6 không? Hoặc nếu chúng ta chỉ so sánh các giá trị FFT và xem liệu chúng có nằm trong ngưỡng không? – LINGS

+0

@ LINGS (3) giả định rằng dữ liệu PCM từ bước (1) là một mảng kiểu thích hợp (ví dụ: int16 hoặc float32). Nhưng nếu bộ giải mã lựa chọn trả về byte thô thì có, một bước chuyển đổi là cần thiết. – atzz

+0

@LINGS tái bước (6): sự khác biệt đơn giản sẽ không hoạt động nếu giải pháp của bạn phải chịu đựng tiếng ồn, bởi vì một số tiếng ồn như nhấp chuột hoặc vỗ tay gây ra sự khác biệt lớn trong FFT. Sự khác biệt tích hợp có thể hoạt động. Tôi không chắc tương quan là phương pháp so sánh tốt nhất ở đây, tôi đã không nghiên cứu nó như tôi có lẽ nên có, nhưng nó làm việc ok khi tôi thực hiện một cái gì đó tương tự. – atzz