একটি এমপি 3 ফাইলে বিটগুলি সন্ধান করুন


27

এই চ্যালেঞ্জের মধ্যে, আপনার কাজটি এমপি 3 ফর্ম্যাটে একটি সাধারণ রেকর্ডিং নেওয়া এবং ফাইলটিতে বীটের সময়সীমার সন্ধান করা। দুটি উদাহরণ রেকর্ডিং এখানে:

https://dl.rodboxusercontent.com/u/24197429/beats.mp3 https://dl.rodboxusercontent.com/u/24197429/beats2.mp3

এখানে আগের দুটি তুলনায় অনেক বেশি শব্দ সহ তৃতীয় রেকর্ডিং রয়েছে:

https://dl.dropboxusercontent.com/u/24197429/noisy-beats.mp3

উদাহরণস্বরূপ, প্রথম রেকর্ডিংটি 65 সেকেন্ড লম্বা এবং হুবহু (যদি আমি ভুল সংকেত না দিয়ে থাকে) ats 76 টি বিট ধারণ করে। আপনার কাজ হ'ল এমন একটি প্রোগ্রাম তৈরি করা যা এমপি 3 ফাইলটি ইনপুট হিসাবে গ্রহণ করে এবং সেই ফাইলের বিটগুলির মিলি সেকেন্ডে টাইম অফসেটের ক্রম বহন করে। একটি বিট অবশ্যই সংজ্ঞায়িত করা হয়, যখন গিটারিস্ট বাজায় তখন এক বা একাধিক স্ট্রিং থাকে।

আপনার সমাধান অবশ্যই:

  • অনুরূপ "জটিলতা" এর যে কোনও এমপি 3 ফাইলে কাজ করুন। এটি শোরগোলের রেকর্ডিংয়ে বা দ্রুত বাজানো সুরগুলিতে ব্যর্থ হতে পারে - আমি যত্ন করি না।
  • মোটামুটি নির্ভুল হতে হবে। সহনশীলতা হ'ল +/- 50 এমএস। সুতরাং যদি বেটটি 1500 এমএসে ঘটে এবং আপনার সমাধান 1400 প্রতিবেদন করে তবে তা অগ্রহণযোগ্য।
  • শুধুমাত্র বিনামূল্যে সফ্টওয়্যার ব্যবহার করুন। আপনার পছন্দের ভাষার জন্য যে কোনও অবাধে উপলভ্য তৃতীয় পক্ষের সফ্টওয়্যার ব্যবহার করার সাথে সাথে ffmpeg কল করার অনুমতি রয়েছে।

বিজয়ী মানদণ্ড সরবরাহ করা ফাইলগুলিতে শব্দ থাকা সত্ত্বেও সাফল্যের সাথে বিটগুলি সনাক্ত করার ক্ষমতা। টাই করার ক্ষেত্রে, সংক্ষিপ্ততম সমাধানটি জয়ী হয় (তৃতীয় পক্ষের কোডের দৈর্ঘ্য গণনাতে যোগ করা হয় না)।


1
যদিও এটি আকর্ষণীয় দেখায়, এটি একটি প্রতিযোগিতা, আপনার "সঠিকতা" এর চেয়ে জিতের মানদণ্ডকে আরও সুনির্দিষ্টভাবে সংজ্ঞায়িত করা উচিত।
ফেবিনআউট

ঠিক আছে এখন ভাল ??
বিজন লিন্ডকভিস্ট

18
একটি ভাল প্রতিযোগিতা আগ্রহের অংশ বিচ্ছিন্ন করে। এখানে আপনি বীট সনাক্তকরণে আগ্রহী বলে মনে হচ্ছে এটি অবশ্যই একটি আকর্ষণীয় ডিএসপি সমস্যা। তাহলে এমপি 3 ফাইল ফর্ম্যাটের জটিলতাগুলি প্রোগ্রামগুলি হ্যান্ডেল (বা আউটসোর্স) করবেন কেন? প্রশ্নটি আরএডাব্লু (নমুনা হার, বিস্তৃত গভীরতা, এবং আধ্যাত্মিকতা সম্পর্কে অনুমোদিত অনুমান সহ) বা ডাব্লিউএভি (একইভাবে) গ্রহণ করে উন্নত হবে।
পিটার টেলর

3
প্রতিযোগিতার পয়েন্টটি হ'ল এই সমস্ত টুকরোগুলি। সম্ভবত এটি এমপি 3 এর সাথে ইন্টারফেস করাতে যদি কঠিন সময় ব্যয় করে তবে এটি গল্ফস্ক্রিপ্টে সমাধান করা শক্ত করে তোলে। কখনও কম নয়, চ্যালেঞ্জটি সুনির্দিষ্টভাবে নির্দিষ্ট করা হয়েছে এবং (আফিকা) পুরোপুরি অন-টপিক তাই নেতিবাচকতা খুব হতাশাব্যঞ্জক।
বিজন লিন্ডকভিস্ট

8
@ BjörnLindqvist- কে আপনার হৃদয় উন্নতির পরামর্শ নেওয়া উচিত নয়। পূর্ববর্তী কিছু মন্তব্য মুছে ফেলা না হলে আমি এখানে কোনও নেতিবাচক মন্তব্য দেখতে পাচ্ছি না, কেবল উন্নতির জন্য পরামর্শ।
গ্যারেথ

উত্তর:


6

পাইথন 2.7 492 বাইট (কেবল বিটস.এমপি 3)

এই উত্তরটি মধ্যে বিটের চিহ্নিত করতে পারেন beats.mp3, কিন্তু সব নোট চিহ্নিত করা হবে না beats2.mp3বা noisy-beats.mp3। আমার কোড বর্ণনার পরে, আমি কেন তা বিশদে যাব।

এটি পিপিডাব ( https://github.com/jiaaro/pydub ) এমপি 3 তে পড়তে ব্যবহার করে। অন্যান্য সমস্ত প্রক্রিয়াজাতকরণ হ'ল নুমপি।

গল্ফ কোড

ফাইলের নামের সাথে একটি একক কমান্ড লাইন যুক্তি দেয়। এটি এমএসে প্রতিটি বিটকে আলাদা লাইনে আউটপুট দেয়।

import sys
from math import *
from numpy import *
from pydub import AudioSegment
p=square(AudioSegment.from_mp3(sys.argv[1]).set_channels(1).get_array_of_samples())
n=len(p)
t=arange(n)/44.1
h=array([.54-.46*cos(i/477) for i in range(3001)])
p=convolve(p,h, 'same')
d=[p[i]-p[max(0,i-500)] for i in xrange(n)]
e=sort(d)
e=d>e[int(.94*n)]
i=0
while i<n:
 if e[i]:
  u=o=0
  j=i
  while u<2e3:
   u=0 if e[j] else u+1
   #u=(0,u+1)[e[j]]
   o+=e[j]
   j+=1
  if o>500:
   print "%g"%t[argmax(d[i:j])+i]
  i=j
 i+=1

অবহেলিত কোড

# Import stuff
import sys
from math import *
from numpy import *
from pydub import AudioSegment

# Read in the audio file, convert from stereo to mono
song = AudioSegment.from_mp3(sys.argv[1]).set_channels(1).get_array_of_samples()

# Convert to power by squaring it
signal = square(song)
numSamples = len(signal)

# Create an array with the times stored in ms, instead of samples
times = arange(numSamples)/44.1

# Create a Hamming Window and filter the data with it. This gets rid of a lot of
# high frequency stuff.
h = array([.54-.46*cos(i/477) for i in range(3001)])
signal = convolve(signal,h, 'same') #The same flag gets rid of the time shift from this

# Differentiate the filtered signal to find where the power jumps up.
# To reduce noise from the operation, instead of using the previous sample,
# use the sample 500 samples ago.
diff = [signal[i] - signal[max(0,i-500)] for i in xrange(numSamples)]

# Identify the top 6% of the derivative values as possible beats
ecdf = sort(diff)
exceedsThresh = diff > ecdf[int(.94*numSamples)]

# Actually identify possible peaks
i = 0
while i < numSamples:
 if exceedsThresh[i]:
  underThresh = overThresh = 0
  j=i
  # Keep saving values until 2000 consecutive ones are under the threshold (~50ms)
  while underThresh < 2000:
   underThresh =0 if exceedsThresh[j] else underThresh+1
   overThresh += exceedsThresh[j]
   j += 1
  # If at least 500 of those samples were over the threshold, take the maximum one
  # to be the beat definition
  if overThresh > 500:
   print "%g"%times[argmax(diff[i:j])+i]
  i=j
 i+=1

আমি কেন অন্য ফাইলগুলিতে নোটগুলি মিস করি (এবং কেন তারা অবিশ্বাস্যভাবে চ্যালেঞ্জিং)

আমার কোডটি নোটগুলি সন্ধান করার জন্য সিগন্যাল শক্তিতে পরিবর্তনগুলি দেখায়। কারণ beats.mp3, এটি সত্যই ভাল কাজ করে। এই বর্ণালীটি দেখায় যে কীভাবে শক্তি সময় (x অক্ষ) এবং ফ্রিকোয়েন্সি (y অক্ষ) বন্টিত হয়। আমার কোডটি মূলত y অক্ষকে একটি এক লাইনে পতিত করে। beats.jpeg দৃশ্যত, এটি মারার জায়গাটি দেখতে খুব সহজ। একটি হলুদ রেখা রয়েছে যা বার বার ছাপিয়ে যায়। beats.mp3আপনি বর্ণালীটি অনুসরণ করার সময় এটি কীভাবে কাজ করে তা দেখতে আমি আপনাকে শুনতে উত্সাহিত করি ।

এরপরে আমি যাব noisy-beats.mp3(কারণ এটি তুলনায় আসলেই সহজ beats2.mp3সশব্দ-beats.pngআবার see নিখুঁত নোটগুলি শুরু হয় That এটি তাদের বিশেষ করে খুঁজে পাওয়া শক্ত করে তোলে কারণ এখন, আপনাকে কেবলমাত্র প্রশস্ততার পরিবর্তে ফ্রিকোয়েন্সি (y অক্ষ) পরিবর্তনের মাধ্যমে এটি সন্ধান করতে হবে।

beats2.mp3অবিশ্বাস্যভাবে চ্যালেঞ্জিং। এখানে বর্ণালীটি এখানে beats2.jpeg প্রথম বিটটিতে কিছু লাইন রয়েছে তবে কিছু নোট সত্যিই রেখার উপর দিয়ে রক্তপাত করেছে। বিশ্বস্ততার সাথে নোটগুলি সনাক্ত করতে, আপনাকে নোটগুলির পিচ (মৌলিক এবং সুরেলা) এবং এটি কোথায় পরিবর্তন হয়েছে তা দেখতে শুরু করতে হবে। প্রথম বিটটি একবার কাজ করার পরে, দ্বিতীয় বিটটি টেম্পোর দ্বিগুণ হয়ে দ্বিগুণ শক্ত হয়!

মূলত, এই সমস্তগুলি বিশ্বস্তভাবে সনাক্ত করতে, আমি মনে করি এটি কিছু অভিনব নোট সনাক্তকরণ কোড নেয়। দেখে মনে হচ্ছে এটি কোনও ডিএসপি ক্লাসের কারও জন্য ভাল ফাইনাল প্রকল্প হবে project


আমি মনে করি এটি অনুমোদিত নয়, কারণ এটি সমস্ত প্রয়োজনীয়তা পূরণ করে না। ভাল উত্তর, কিন্তু এটি কিছু কাজ প্রয়োজন।
Rɪᴋᴇʀ

হ্যাঁ, আমি কিছুটা হতাশ হলাম এই পদ্ধতিটি আমি যেমন আশা করেছিলাম তেমন কার্যকর হয়নি। আমি অনুভব করি এটি সম্ভবত অন্য কাউকে সাহায্য করতে পারে যারা এটির জন্য ছুরিকাঘাত করতে চায়। যদি আমি এই সপ্তাহে কিছুটা অতিরিক্ত সময় পাই, তবে আমি নতুন এফএফটি ভিত্তিক একটি পদ্ধতির চেষ্টা করব বলে আশা করি যাতে ভাল ফলাফল দেওয়া উচিত।
ডমিনিক এ।

ঠিক আছে ভদ্র. ভাল কাজ যদিও।
Rɪᴋᴇʀ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.