অডিও রেকর্ডিংয়ে পিক সংখ্যা সনাক্ত করুন


12

আমি কীভাবে অডিও রেকর্ডিংয়ের একটি কর্পাসে সিলেবলের সংখ্যা সনাক্ত করতে পারি তা বোঝার চেষ্টা করছি। আমি মনে করি একটি ভাল প্রক্সি ওয়েভ ফাইলের শিখর হতে পারে।

ইংরেজিতে কথা বলার একটি ফাইল দিয়ে আমি যা চেষ্টা করেছি তা এখানে রয়েছে (আমার আসল ব্যবহারের ঘটনা কিসওয়াহিলিতে রয়েছে)। এই উদাহরণ রেকর্ডিংয়ের প্রতিলিপিটি হ'ল: "এটি আমি টাইমার ফাংশনটি ব্যবহার করার চেষ্টা করছেন I'm আমি বিরতি, ভোকালাইজেশন খুঁজছি" " এই উত্তরণে মোট 22 টি সিলেবল রয়েছে।

wav ফাইল: https ://www.roidboxboxss/koqyfeaqge8t9iw/test.wav?dl=0

আর এর seewaveপ্যাকেজটি দুর্দান্ত, এবং বেশ কয়েকটি সম্ভাব্য ফাংশন রয়েছে। প্রথম জিনিসগুলি, ওয়েভ ফাইলটি আমদানি করুন।

library(seewave)
library(tuneR)
w <- readWave("YOURPATHHERE/test.wav")  
w
# Wave Object
# Number of Samples:      278528
# Duration (seconds):     6.32
# Samplingrate (Hertz):   44100
# Channels (Mono/Stereo): Stereo
# PCM (integer format):   TRUE
# Bit (8/16/24/32/64):    16

প্রথম জিনিসটি আমি চেষ্টা করেছিলাম timer()ফাংশন। এটি প্রত্যাবর্তিত জিনিসগুলির মধ্যে একটি হ'ল প্রতিটি কণ্ঠস্বরের সময়কাল। এই ফাংশনটি 7 টি কণ্ঠশক্তি সনাক্ত করে যা 22 টি উচ্চারণের চেয়ে কম short প্লটটির তাত্ক্ষণিক পর্যালোচনা থেকে বোঝা যায় যে ভোকালাইজেশন সিলেবলের সমান নয়।

t <- timer(w, threshold=2, msmooth=c(400,90), dmin=0.1)
length(t$s)
# [1] 7

এখানে চিত্র বর্ণনা লিখুন

আমি থ্রোসোল্ড সেট না করেই ফাইপিক্স ফাংশনটি চেষ্টা করেছিলাম। এটি 54 শিখর ফিরে এসেছে।

ms <- meanspec(w)
peaks <- fpeaks(ms)

এখানে চিত্র বর্ণনা লিখুন

এই সময়ের পরিবর্তে ফ্রিকোয়েন্সি দ্বারা প্রশস্ততা দেয়। 0.005 এর সমান একটি থ্রোসোল্ড প্যারামিটার যুক্ত করা শব্দটি ফিল্টার করে এবং 23 টি পিকগুলিতে গণনা হ্রাস করে, যা সিলেবলের প্রকৃত সংখ্যার (22) খুব কাছাকাছি।

এখানে চিত্র বর্ণনা লিখুন

আমি নিশ্চিত নই যে এটি সর্বোত্তম পন্থা। ফলাফলটি থ্রোসোল্ড প্যারামিটারের মানের সাথে সংবেদনশীল হবে এবং আমাকে ফাইলগুলির একটি বড় ব্যাচ প্রক্রিয়া করতে হবে। সিলেবলের প্রতিনিধিত্বকারী শৃঙ্গগুলি সনাক্ত করতে এটি কীভাবে কোড করবেন সে সম্পর্কে আরও ভাল কোনও ধারণা?


2
এটি একটি খুব আকর্ষণীয় প্রশ্ন, তবে আপনি স্ট্যাক এক্সচেঞ্জ সিগন্যাল প্রসেসিং প্রশ্নোত্তর সাইট এ পদ্ধতিতে আরও ভাল সহায়তা পেতে পারেন ।
eipi10

ঠিক আছে ধন্যবাদ. কেউ সাড়া না দিলে এটি পরীক্ষা করে দেখবে। অনেক প্রশংসিত.
এরিক গ্রিন

কেবল একটি ধারণা, তবে পরিবর্তন পয়েন্ট বিশ্লেষণের বিষয়টি বিবেচনা করা কি উপযুক্ত হবে ? বিশ্লেষণে সহজে গ্রহণ করা যেতে পারে আর ব্যবহারের সঙ্গে changepointপ্যাকেজ। সোজা কথায়, পরিবর্তন বিন্দু বিশ্লেষণ পরিবর্তন সনাক্তকরণের উপর দৃষ্টি নিবদ্ধ করে, লিংকযুক্ত উদাহরণটি ট্রেড ডেটার সাথে সম্পর্কিত তবে শব্দটি ডেটাতে এই কৌশলটি প্রয়োগ করা আকর্ষণীয় হতে পারে।
Konrad

আমি উত্তরটি গ্রহণ করতে চলেছি যার সর্বাধিক ভোট রয়েছে, যা আমার অন্য সিভি ধারণাটি বাস্তবায়নের চেষ্টা হতে পারে। আমি মনে করি তবে মূল প্রশ্নটি রয়ে গেছে: রেকর্ডিংয়ের বৈশিষ্ট্যগুলি কীভাবে উচ্চারণযোগ্য সংখ্যার শিখর সংখ্যার সাথে মিলিত এমন কয়েকটি শৃঙ্গগুলি সঠিকভাবে সনাক্ত করতে যায় to সমস্ত ধারণার জন্য আপনাকে ধন্যবাদ। আমার সমাধান পেলে আমি এখানে আবার পোস্ট করব।
এরিক গ্রিন

উত্তর:


5

আমি মনে করি না কি অনুসরণ সবচেয়ে ভালো সমাধান হয় না, কিন্তু @ eipi10 খুঁজে বার করো করার জন্য একটি ভাল পরামর্শ ছিল CrossValidated উপর এই উত্তরটি । তাই আমি.

একটি সাধারণ পদ্ধতি হ'ল ডেটা মসৃণ করা এবং তারপরে মসৃণতার সাথে স্থানীয় সর্বাধিক ফিল্টারটির তুলনা করে শিখর সন্ধান করা।

প্রথম পদক্ষেপটি হ'ল argmaxফাংশনটি তৈরি করা :

argmax <- function(x, y, w=1, ...) {
  require(zoo)
  n <- length(y)
  y.smooth <- loess(y ~ x, ...)$fitted
  y.max <- rollapply(zoo(y.smooth), 2*w+1, max, align="center")
  delta <- y.max - y.smooth[-c(1:w, n+1-1:w)]
  i.max <- which(delta <= 0) + w
  list(x=x[i.max], i=i.max, y.hat=y.smooth)
}

এর রিটার্ন মানটিতে স্থানীয় ম্যাক্সিমার (এক্স) যুক্তি রয়েছে - যা প্রশ্নের উত্তর দেয় - এবং x- এবং y-অ্যারেতে সূচকগুলি যেখানে এই স্থানীয় ম্যাক্সিমা ঘটে (i)।

আমি testপ্লটিং ফাংশনে সামান্য পরিবর্তন করেছি : (ক) স্পষ্টভাবে x এবং y সংজ্ঞায়িত করতে এবং (খ) শিখর সংখ্যা প্রদর্শন করতে:

test <- function(x, y, w, span) {
  peaks <- argmax(x, y, w=w, span=span)

  plot(x, y, cex=0.75, col="Gray", main=paste("w = ", w, ", span = ", 
                                              span, ", peaks = ", 
                                              length(peaks$x), sep=""))
  lines(x, peaks$y.hat,  lwd=2) #$
  y.min <- min(y)
  sapply(peaks$i, function(i) lines(c(x[i],x[i]), c(y.min, peaks$y.hat[i]),
                                    col="Red", lty=2))
  points(x[peaks$i], peaks$y.hat[peaks$i], col="Red", pch=19, cex=1.25)
}

fpeaksআমি আমার আসল প্রশ্নে যে পদ্ধতির কথা বলেছি তার মতো , এই পদ্ধতির জন্যও ভাল সুরের দরকার হয়। আমি এই "ডান" উত্তরটি (যেমন, সিলেবল / পিক্সের সংখ্যা) যাচ্ছি তা জানব না, সুতরাং আমি সিদ্ধান্তের নিয়ম কীভাবে সংজ্ঞায়িত করব তা নিশ্চিত নই।

par(mfrow=c(3,1))
test(ms[,1], ms[,2], 2, 0.01)
test(ms[,1], ms[,2], 2, 0.045)
test(ms[,1], ms[,2], 2, 0.05)

এখানে চিত্র বর্ণনা লিখুন

এই মুহুর্তে fpeaksআমার কাছে কিছুটা কম জটিল বলে মনে হচ্ছে, তবে এখনও সন্তুষ্ট নয়।


এটি অসন্তুষ্ট হতে পারে কারণ আপনার লোস প্যারামিটারগুলি যথেষ্ট মসৃণতা করে না। মসৃণ পছন্দটি ডেটার প্রকৃতি এবং উদ্দেশ্যগুলির দ্বারা পরিচালিত হওয়া প্রয়োজন; এটি কম্পিউটিং প্ল্যাটফর্ম এবং এটি যে ডিফল্ট মানগুলি সরবরাহ করে তা যা কিছু দেয় তার কাছে রেখে দেওয়া কিছু নয়।
হোবার

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

আপনার আদেশে loess, আমি স্মুথিংয়ের ডিগ্রির জন্য স্পষ্টভাবে কোনও যুক্তি দেখতে পাচ্ছি না। প্রকৃতপক্ষে, চলন্ত উইন্ডোর উপর দিয়ে দৌড়ানোর সামান্য বিন্দু নেই: এটি ইতিমধ্যে এটি অভ্যন্তরীণভাবে করে।
whuber

আমি আপনার পয়েন্ট দেখছি. আমি ধরেছিলাম যে wএটি স্মুথিংয়ের মধ্যে একটি যুক্তি ছিল। এই কিভাবে মূল সমাধান লেখক ফাংশন বর্ণনা: "দুটি প্যারামিটার পরিস্থিতিতে টিউন করা আছে: হয় W উইন্ডোর অর্ধ-প্রস্থ স্থানীয় সর্বাধিক ... অন্য জন্য ব্যবহার করা - এই স্পষ্ট না কোড - হ'ল কম স্মুথের স্প্যান আর্গুমেন্ট।
এরিক গ্রিন

সেই লেখক wপ্যারামিটারগুলির মধ্যে একটি হিসাবে অন্তর্ভুক্ত ছিলেন কারণ তার মনে একটি খুব সাধারণ পদ্ধতির মনে ছিল যাতে স্মুথ লম্বা হতে পারে না তবে সম্ভবত এটি উইন্ডোড মিডিয়ান, বা হ্যানিং বা ডেটা এবং পরিসংখ্যানগত আচরণের জন্য উপযুক্ত বলে মনে করা অন্য কিছু হতে পারে বিশ্লেষকের উদ্দেশ্য। এই স্মুথারের অনেকের বৈশিষ্ট্য উইন্ডোটির প্রস্থের উপর নির্ভর করবে depend
whuber

1

প্রোটিন ইলেক্ট্রোফোরসিস প্রোফাইল বিশ্লেষণ করতে আমার একই রকম সমস্যা ছিল। আমি প্রোফাইলগুলির দ্বিতীয় উত্সের উপর এমএসপ্রসেস আর প্যাকেজের কয়েকটি ফাংশন প্রয়োগ করে তাদের সমাধান করেছি ( https://fr.wikedia.org/wiki/D%C3%A9pouillement_d 'une_courbe # অবস্থান_সেট_হোটুর_ডু_পিক দেখুন )। এটি এখানে প্রকাশিত হয়েছে: http://onlinelibrary.wiley.com/doi/10.1111/1755-0998.12389/abstract ; jsessionid=8EE0B64238728C0979FF71C576884771.f02t03

অনুরূপ সমাধান আপনার জন্য কাজ করতে পারে কিনা আমার কোনও ধারণা নেই। শুভকামনা


ধন্যবাদ, @ user17493.bis। পরিপূরক উপাদানের সাথে প্রকাশের জন্য আপনাকে কুদোস। এই ধারণাটি চেষ্টা করে দেখার পক্ষে আমার পক্ষে এত সহজ হয়ে যাবে!
এরিক গ্রিন

0

পাইথনের একটি লাইব্রেরি এখানে অটোোক্রেলেশন ফাংশনে শৃঙ্গগুলি খুঁজে পেয়ে পর্যায়ক্রমিকতা অনুমান করার চেষ্টা করার আগে আমি ব্যবহার করেছি।

এটি শিখর সনাক্তকরণের জন্য প্রথম-ক্রমের পার্থক্য / পৃথক ডেরাইভেটিভস ব্যবহার করে এবং প্রান্তিক এবং নূন্যতম দূরত্ব (একটানা শীর্ষগুলির মধ্যে) পরামিতিগুলির দ্বারা সুরকরণকে সমর্থন করে। গাউসীয় ঘনত্বের অনুমান এবং ইন্টারপোলেশন (লিঙ্কটি দেখুন) ব্যবহার করে কেউ পিক রেজোলিউশনকে বাড়িয়ে তুলতে পারে।

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


ধন্যবাদ, @ টুল.আইশ। এটি উদ্ধৃত আর পদ্ধতির একটি ভাল বিকল্প বলে মনে হচ্ছে। আমি মনে করি তবে এখনও আমার সুর করার চ্যালেঞ্জটি ছিল।
এরিক গ্রিন

0

আমি changepointপ্যাকেজটি ব্যবহার করে একটি সমাধান প্রস্তাব করতে চাই । নীচের সরল উদাহরণ উদাহরণগুলি উপলব্ধ ডেটা থেকে একটি চ্যানেল দেখে এখানে পরিবর্তন পয়েন্ট হিসাবে সংজ্ঞায়িত শিখর সনাক্ত করার চেষ্টা করে।

উদাহরণ

ডেটা সোর্সিং

# Libs
library(seewave)
library(tuneR)

# Download
tmpWav <- tempfile(fileext = ".wav")
download.file(url = "https://www.dropbox.com/s/koqyfeaqge8t9iw/test.wav?dl=0",
              destfile = tmpWav)

# Read
w <- readWave(filename = tmpWav)

তথ্য প্রস্তুতি

# Libs
require(changepoint)

# Create time series data for one channel as an example
leftTS <- ts(data = w@left)

## Preview
plot.ts(leftTS)

plot.tsকলটির মাধ্যমে উত্পন্ন চার্ট : সময় সিরিজ হিসাবে চ্যানেল

পরিবর্তন পয়েন্ট বিশ্লেষণ

changepointপ্যাকেজ সনাক্তকরণের জন্য বিকল্প একটি নম্বর প্রদান করে পরিবর্তন / পীক তথ্য। নীচের কোডটি বিনসেগ পদ্ধতিটি ব্যবহার করে 3 টি শৃঙ্গ সন্ধানের জন্য কেবল একটি সাধারণ উদাহরণ সরবরাহ করে :

# BinSeg method (example)
leftTSpelt <- cpt.var(data = leftTS, method = "BinSeg", penalty = "BIC", Q = 3)
## Preview
plot(leftTSpelt, cpt.width = 3)

প্রাপ্ত চার্ট: কিছু পরিবর্তন পয়েন্ট মানগুলি পাওয়াও সম্ভব:

cpts(leftTSpelt)
[1]  89582 165572 181053

পার্শ্ব নোট

প্রদত্ত উদাহরণটি বেশিরভাগ ক্ষেত্রে কীভাবে পরিবর্তন বিন্দু বিশ্লেষণ সরবরাহিত ডেটাতে প্রয়োগ করা যেতে পারে তা বোঝানোর সাথে সম্পর্কিত; ফাংশনটিতে পরামিতিগুলির ক্ষেত্রে সাবধানতা অবলম্বন করা উচিত cp.var। প্যাকেজ এবং উপলভ্য কার্যকারিতা সম্পর্কে বিশদ বিবরণ নিম্নলিখিত কাগজে দেওয়া হয়েছে:

কিলিক, রেবেকা এবং একলি , ইদ্রিস (২০১৪) চেঞ্জপয়েন্ট: চেঞ্জপয়েন্ট বিশ্লেষণের জন্য একটি আর প্যাকেজ। পরিসংখ্যান সফটওয়্যার জার্নাল, 58 (3)। পৃষ্ঠা 1-19।

ecp

ecp, আর প্যাকেজ উল্লেখ করার মতো আরেকটি বিষয় । ecpসমাধা উদ্যোগটা অ স্থিতিমাপ বহুচলকীয় পরিবর্তন বিন্দু বিশ্লেষণ, যা দরকারী হতে পারে যদি কেউ একাধিক চ্যানেল জুড়ে ঘটছে পরিবর্তন পয়েন্ট চিহ্নিত করতে চাই।


ধন্যবাদ, @ কনরাড। আমি উভয়ই প্যাকেজ সম্পর্কে জানতাম না, তাই ডেমোতে সময় দেওয়ার জন্য ধন্যবাদ। আমি মনে করি এই সমস্ত প্যাকেজগুলির সাথে আমার যে মৌলিক চ্যালেঞ্জ রয়েছে তা হ'ল আমি জানি না যে কতগুলি শৃঙ্গ সন্ধান করা উচিত, তাই আমি পরামিতিগুলি টিউন করব কিনা তা নিশ্চিত নই। এটি এখনও এমন পরিস্থিতির মতো মনে হচ্ছে যেখানে পিকগুলির সঠিক সংখ্যা সনাক্তকরণের জন্য প্যারামিটারগুলি কীভাবে নির্ধারণ করতে হবে তা নির্ধারণ করতে আমাকে কিছু অ্যালগরিদম ব্যবহার করতে হবে (অর্থাত্ সিলেবলস)।
এরিক গ্রিন

@ এরিকগ্রিন অনুলিপি পরিবর্তন বিন্দু বিশ্লেষণ আপনাকে কেবল বিতরণ দেখে আপনার শিখর সনাক্ত করতে সক্ষম করবে। এটি কোনও উপযুক্ত পদ্ধতি, জরিমানা ইত্যাদির প্রয়োগের বিষয় হবে। আমি আপনাকে পরামর্শ দিচ্ছি যে আমার আগের মন্তব্যে লিঙ্ক করা ওয়েবসাইটটি একবার দেখুন কারণ এটি প্রক্রিয়াটির বিস্তারিত বর্ণনা দেয়।
Konrad

আপনি যদি আক্ষরিক অর্থে ডিস্ট্রিবিউশনটি বোঝাতে চান তবে আমি নিশ্চিত নই। আমার কাছে 2000 টি ফাইল রয়েছে এবং এটি স্বয়ংক্রিয় করার জন্য একটি উপায় প্রয়োজন। এমনকি যদি আমি প্রতিটি ফাইল পরীক্ষা করতে পারি, তবে শিখার সংখ্যাটি শিখর হিসাবে দেখতে আমার পক্ষে কঠিন। সম্ভবত আমি ঘন হয়ে যাচ্ছি এবং আমি এই পদ্ধতির গুণাবলী দেখতে আসব। আমি এখনও প্রতিটি ফাইলের প্যারামিটারগুলিকে স্বয়ংক্রিয়ভাবে সুর করার একটি উপায়ের প্রয়োজনে আটকে আছি যাতে শৃঙ্খলার সংখ্যার জন্য প্রাপ্ত শিখর ফলাফলের সংখ্যাটি সঠিক প্রক্সি হয়।
এরিক গ্রিন

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

gotcha হয়। আমি মনে করি আমি এই নির্দিষ্ট ব্যবহারের ক্ষেত্রে "উপযুক্ত পরামিতিগুলি খুঁজে বের করুন" পদক্ষেপে হোঁচট খাচ্ছি। তবে আমি সমস্ত ধারণাগুলির প্রশংসা করেছি এবং কয়েকটি নতুন প্যাকেজ সম্পর্কে শিখেছি যা আমি চেষ্টা করেছি এর ভাল বিকল্প হতে পারে।
এরিক গ্রিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.