ऑडियो रिकॉर्डिंग में चोटियों की संख्या का पता लगाएं


12

मैं यह पता लगाने की कोशिश कर रहा हूं कि ऑडियो रिकॉर्डिंग के एक कोष में सिलेबल्स की संख्या का पता कैसे लगाया जाए। मुझे लगता है कि लहर फ़ाइल में एक अच्छा प्रॉक्सी चोटियों हो सकता है।

यहाँ मैंने अंग्रेजी में बोलने की एक फाइल के साथ कोशिश की है (मेरा वास्तविक उपयोग केसविले में है)। इस उदाहरण की रिकॉर्डिंग की प्रतिलिपि इस प्रकार है: "यह मुझे टाइमर फ़ंक्शन का उपयोग करने की कोशिश कर रहा है। मैं ठहराव, गायन देख रहा हूं।" इस मार्ग में कुल 22 शब्दांश हैं।

wav फ़ाइल: https://www.dropbox.com/s/koqyfeaqge8t9iw/test.wav?l=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 सिलेबल्स से बहुत कम है। कथानक पर एक त्वरित नज़र रखने से पता चलता है कि स्वरों के सिलेबल्स समान नहीं होते हैं।

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

यहाँ छवि विवरण दर्ज करें

मैंने भी एक सीमा निर्धारित किए बिना fpeaks फ़ंक्शन की कोशिश की। इसमें 54 चोटियां लौट आईं।

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

यहाँ छवि विवरण दर्ज करें

यह समय के बजाय आवृत्ति द्वारा आयाम देता है। 0.005 के बराबर थ्रेशोल्ड पैरामीटर जोड़ना शोर को कम करता है और गिनती को 23 चोटियों तक कम कर देता है, जो वास्तविक संख्या के सिलेबल्स (22) के काफी करीब है।

यहाँ छवि विवरण दर्ज करें

मुझे यकीन नहीं है कि यह सबसे अच्छा तरीका है। परिणाम थ्रेशोल्ड पैरामीटर के मान के प्रति संवेदनशील होगा, और मुझे फ़ाइलों के एक बड़े बैच को संसाधित करना होगा। सिलेबल्स का प्रतिनिधित्व करने वाली चोटियों का पता लगाने के लिए इसे कोड करने के बारे में कोई बेहतर विचार?


2
यह एक बहुत ही दिलचस्प सवाल है, लेकिन आपको स्टैक एक्सचेंज सिग्नल प्रोसेसिंग क्यू एंड ए साइट पर तरीकों पर बेहतर मदद मिल सकती है ।
eipi10

ठीक है धन्यवाद। अगर कोई जवाब नहीं देता है तो इसकी जांच करेंगे। बहुत सराहना की।
एरिक ग्रीन

बस एक विचार है, लेकिन क्या यह परिवर्तन बिंदु विश्लेषण पर विचार करने के लिए सार्थक होगा ? पैकेज के उपयोग के साथ आर में विश्लेषण आसानी से किया जा सकता है changepoint। सीधे शब्दों में कहें, परिवर्तन बिंदु विश्लेषण परिवर्तन का पता लगाने पर केंद्रित है , जुड़ा हुआ उदाहरण व्यापार डेटा से संबंधित है, लेकिन इस तकनीक को ध्वनि डेटा पर लागू करना दिलचस्प हो सकता है।
कोनराड

मैं उस उत्तर को स्वीकार करने जा रहा हूं जिसमें सबसे अधिक वोट हैं, जो कि एक और सीवी विचार को लागू करने के मेरे प्रयास के रूप में होता है। मुझे लगता है कि मुख्य प्रश्न हालांकि बना हुआ है: रिकॉर्डिंग की सुविधाओं का उपयोग कैसे किया जाए, कितनी संख्या में चोटियों का पता लगाने के लिए जो बोलचाल की संख्या से मेल खाती है। सभी विचारों के लिए धन्यवाद। समाधान होने पर मैं यहाँ वापस पोस्ट करूँगा।
एरिक ग्रीन

जवाबों:


5

मुझे नहीं लगता कि इस प्रकार का सबसे अच्छा समाधान क्या है, लेकिन @ eipi10 के पास क्रॉसवैलिड पर इस जवाब की जांच करने का एक अच्छा सुझाव था । तो मैंने किया।

एक सामान्य दृष्टिकोण डेटा को सुचारू करना है और फिर एक स्थानीय अधिकतम फिल्टर की तुलना चिकनी से करना है।

पहला कदम 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) के तर्क शामिल हैं - जो प्रश्न का उत्तर देता है - और x- और y- सरणियों में अनुक्रमणिकाएं जहां उन स्थानीय मैक्सिमा होती हैं (i)।

मैंने testप्लॉटिंग फ़ंक्शन में मामूली संशोधन किए : (ए) स्पष्ट रूप से एक्स और वाई को परिभाषित करने के लिए और (बी) चोटियों की संख्या दिखाने के लिए:

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पर मेरे लिए थोड़ा कम जटिल लगता है, लेकिन अभी भी संतोषजनक नहीं है।


यह असंतोषजनक हो सकता है क्योंकि आपके लूप पैरामीटर पर्याप्त चौरसाई नहीं करते हैं। चिकनी की पसंद को डेटा की प्रकृति और उद्देश्यों से निर्देशित होने की आवश्यकता है; यह कुछ भी नहीं है जो कंप्यूटिंग प्लेटफ़ॉर्म द्वारा की पेशकश की जाती है और जो डिफ़ॉल्ट मान आपूर्ति करता है उसे छोड़ दिया जाना चाहिए।
whuber

ये चूक नहीं हैं। बस उदाहरण हैं। मैं इस मामले में अप्रशिक्षित सीखने की बड़ी चुनौती से हैरान हूँ। मुझे रिकॉर्डिंग में सिलेबल्स की संख्या नहीं पता है, इसलिए मुझे यकीन नहीं है कि फ़ाइलों का एक बैच कैसे ट्यून किया जाए। लगातार मापदंडों का शायद मतलब नहीं है, लेकिन मुझे यकीन नहीं है कि कुछ अन्य निर्णय नियम (उदाहरण के लिए, इन मापदंडों के लिए इष्टतम मान निर्धारित करने के लिए इस्तेमाल किया जा सकता है कि लहर के अन्य मैट्रिक्स) कैसे सेट करें। मैं सोच रहा हूं कि मुझे एक प्रशिक्षण सेट बनाने की आवश्यकता है जो कुछ एल्गोरिदम को इन मापदंडों को सेट करने में मदद करता है। हालांकि यकीन नहीं होता।
एरिक ग्रीन

आपके आदेश में loess, मुझे स्पष्ट रूप से चौरसाई की डिग्री के लिए कोई तर्क नहीं दिया गया है। वास्तव में, चलती खिड़की के ऊपर चल रहे शतरंज के लिए बहुत कम बिंदु है: यह पहले से ही आंतरिक रूप से करता है।
whuber

में तुम्हारी बात समझ रहा हूँ। मैंने मान लिया कि wस्मूथिंग में एक तर्क था। यह इस प्रकार है कि मूल समाधान के लेखक ने फ़ंक्शन का वर्णन किया: "परिस्थितियों को देखते हुए दो पैरामीटर हैं: w स्थानीय अधिकतम गणना करने के लिए उपयोग की जाने वाली खिड़की की आधी चौड़ाई है ... एक और - इसमें स्पष्ट नहीं है कोड - लस चिकनी का स्पैन तर्क है। "
एरिक ग्रीन

उस लेखक wको एक पैरामीटर के रूप में शामिल किया गया था क्योंकि उसके पास एक बहुत ही सामान्य दृष्टिकोण था, जिसमें सहजता कम नहीं हो सकती थी, लेकिन शायद एक खिड़की के मंझले, या हैनिंग, या कुछ और डेटा के सांख्यिकीय व्यवहार के लिए उपयुक्त समझा जाएगा। विश्लेषक के उद्देश्य। उन स्मूदों में से कई के गुण खिड़की की चौड़ाई पर निर्भर करते हैं।
whuber

1

मुझे प्रोटीन वैद्युतकणसंचलन प्रोफाइल का विश्लेषण करने के लिए समान समस्याएं थीं। मैंने प्रोफाइल के दूसरे व्युत्पन्न पर msprocess R पैकेज के कुछ कार्यों को लागू करके उन्हें हल किया (देखें https://fr.wikipedia.org/wiki/D%C3%A9pouillement_d 'une_ourbe # position_et_hauteur_du_pic)। यह यहाँ प्रकाशित किया गया है: http://onlinelibrary.wiley.com/doi/10.1111/1755-0998.12389/abstract/jsessionid=8EE0B64238728C0979FF71C57684771.f02t03

मुझे नहीं पता कि क्या समान समाधान आपके लिए काम कर सकता है। सौभाग्य


धन्यवाद, @ user17493.bis पूरक सामग्री के साथ प्रकाशन के लिए आप के लिए यश। मेरे लिए इस विचार को आजमाना इतना आसान हो जाएगा!
एरिक ग्रीन

0

यहाँ पायथन में एक पुस्तकालय है जिसका मैंने पहले इस्तेमाल किया था, जो आटोक्लेररेशन फ़ंक्शन में चोटियों का पता लगाकर समय-समय पर अनुमान लगाने की कोशिश कर रहा था।

यह चोटी का पता लगाने के लिए पहले-क्रम के अंतर / असतत डेरिवेटिव का उपयोग करता है और थ्रेशोल्ड और न्यूनतम दूरी (लगातार चोटियों के बीच) द्वारा ट्यूनिंग का समर्थन करता है। एक भी गाऊसी घनत्व अनुमान और प्रक्षेप (लिंक देखें) का उपयोग करके चोटी के संकल्प को बढ़ा सकता है।

इसने बहुत ज्यादा ट्विकिंग के बिना मेरे लिए बॉक्स के बाहर अच्छी तरह से काम किया, यहां तक ​​कि शोर के डेटा के लिए भी। कोशिश तो करो।


धन्यवाद, @ tool.ish यह मेरे द्वारा उद्धृत आर विधियों के लिए एक अच्छा विकल्प जैसा दिखता है। मुझे लगता है कि मैं अभी भी ट्यूनिंग चुनौती होगी।
एरिक ग्रीन

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पैकेज की पहचान करने के लिए विकल्प के एक नंबर प्रदान करता है परिवर्तन / चोटियों डेटा में। नीचे दिया गया कोड BinSeg पद्धति का उपयोग करके 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समारोह में पारित मापदंडों के संबंध में सावधानी बरती जानी चाहिए । पैकेज और उपलब्ध कार्यप्रणालियों का विस्तृत विवरण निम्नलिखित पेपर में दिया गया है:

किलिक, रेबेका और एकली, इदरिस (2014) चेंजपॉइंट: चेंजप्वाइंट एनालिसिस के लिए एक आर पैकेज। जर्नल ऑफ़ स्टैटिस्टिकल सॉफ्टवेयर, 58 (3)। पीपी। 1-19।

ecp

ecp, आर पैकेज का उल्लेख करने लायक एक और है । ecpगैर-पैरामीट्रिक बहुभिन्नरूपी परिवर्तन बिंदु विश्लेषण करने की सुविधा प्रदान करता है, जो उपयोगी हो सकता है अगर कोई कई चैनलों में होने वाले परिवर्तन बिंदुओं की पहचान करना चाहे।


धन्यवाद, @konrad मुझे या तो पैकेज के बारे में पता नहीं था, इसलिए डेमो करने के लिए समय निकालने के लिए धन्यवाद। मुझे लगता है कि इन सभी पैकेजों के साथ मेरे पास जो मूलभूत चुनौती है, वह यह है कि मुझे नहीं पता कि देखने के लिए कितनी चोटियां हैं, इसलिए मुझे यकीन नहीं है कि मापदंडों को कैसे ट्यून किया जाए। यह अभी भी एक स्थिति की तरह लगता है जहां मुझे कुछ एल्गोरिदम का उपयोग करके यह निर्धारित करना है कि चोटियों की सही संख्या (यानी, शब्दांश) की सही पहचान करने के लिए पैरामीटर कैसे सेट करें।
एरिक ग्रीन

@ एरिकग्रीन मूल में परिवर्तन बिंदु विश्लेषण आपको वितरण को देखकर अपनी चोटियों की पहचान करने में सक्षम करेगा। यह एक उपयुक्त विधि, दंड और इतने पर लागू करने की बात होगी। मेरा सुझाव है कि आप मेरी पिछली टिप्पणी में लिंक की गई वेबसाइट पर एक नज़र डालें क्योंकि यह प्रक्रिया की विस्तार से रूपरेखा तैयार करती है।
कोनराड

मुझे यकीन नहीं है कि अगर आप शाब्दिक रूप से वितरण का नेत्रदान करते हैं। मेरे पास 2000 फाइलें हैं और इसे स्वचालित करने का एक तरीका है। यहां तक ​​कि अगर मैं प्रत्येक फ़ाइल की जांच कर सकता हूं, तो मुझे चोटियों के रूप में सिलेबल्स की संख्या को देखना मुश्किल है। शायद मैं सघन हो रहा हूं और मैं इस दृष्टिकोण की खूबियों को देखूंगा। मैं अभी भी प्रत्येक फ़ाइल के मापदंडों को ऑटो ट्यून करने के लिए एक तरह से आवश्यकता पर अटका हुआ हूं, इसलिए परिणामी संख्या में चोटियों का पता चला है जो सिलेबल्स की संख्या के लिए एक सटीक प्रॉक्सी है।
एरिक ग्रीन

@ एरिकग्रीन नहीं, साहित्यिक नहीं। यदि आप उचित मापदंडों पर यह पता लगाते हैं कि किसी एक cpt फ़ंक्शन को पास किया जाना चाहिए, तो आप इसे किसी भी संख्या में ऑब्जेक्ट्स पर चला पाएंगे। जैसा कि मैंने भाषा विज्ञान में कोई विशेषज्ञता नहीं है, मुझे नहीं पता कि सिलेबल्स समय श्रृंखला डेटा पर देखी गई सामान्य चोटियों के अनुरूप होंगे या नहीं।
कोनराड

पकड़ लिया। मुझे लगता है कि मैं इस विशेष उपयोग के मामले के लिए "उचित मापदंडों का पता लगाता हूं" कदम पर ठोकर खा रहा हूं। लेकिन मैंने सभी विचारों की सराहना की है और कुछ नए पैकेजों के बारे में सीखा है जो मेरे द्वारा किए गए प्रयासों के लिए अच्छे विकल्प हो सकते हैं।
एरिक ग्रीन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.