ฉันยินดีที่จะรับข้อเสนอแนะทั้งใน R หรือ Matlab แต่รหัสที่ฉันแสดงด้านล่างคือ R-only
ไฟล์เสียงที่แนบมาด้านล่างเป็นการสนทนาสั้น ๆ ระหว่างคนสองคน เป้าหมายของฉันคือการบิดเบือนคำพูดของพวกเขาเพื่อให้เนื้อหาทางอารมณ์จะกลายเป็นไม่รู้จัก ความยากลำบากคือฉันต้องการพื้นที่ว่างสำหรับการบิดเบือนนี้พูดได้ตั้งแต่ 1 ถึง 5 โดยที่ 1 คือ 'อารมณ์ที่จดจำได้สูง' และ 5 คือ 'อารมณ์ที่ไม่รู้จัก' มีสามวิธีที่ฉันคิดว่าฉันสามารถใช้เพื่อให้บรรลุด้วยอาร์
วิธีแรกคือการลดความเข้าใจโดยรวมโดยการลดเสียงรบกวน โซลูชันนี้มีการนำเสนอด้านล่าง (ขอบคุณ @ carl-witthoft สำหรับคำแนะนำของเขา) สิ่งนี้จะลดทั้งความเข้าใจและเนื้อหาทางอารมณ์ของคำพูด แต่มันเป็นวิธีที่ 'สกปรก' - ยากที่จะทำให้ถูกต้องเพื่อให้ได้พื้นที่พาราเมทริกเพราะสิ่งเดียวที่คุณสามารถควบคุมได้คือความกว้างของเสียง
require(seewave)
require(tuneR)
require(signal)
h <- readWave("happy.wav")
h <- cutw(h.norm,f=44100,from=0,to=2)#cut down to 2 sec
n <- noisew(d=2,f=44100)#create 2-second white noise
h.n <- h + n #combine audio wave with noise
oscillo(h.n,f=44100)#visualize wave with noise(black)
par(new=T)
oscillo(h,f=44100,colwave=2)#visualize original wave(red)
วิธีที่สองคือปรับระดับเสียงเพื่อบิดเบือนคำพูดเฉพาะในช่วงความถี่เฉพาะ ฉันคิดว่าฉันสามารถทำได้โดยการแยกซองขนาดแอมพลิจูดจากคลื่นเสียงต้นฉบับสร้างเสียงรบกวนจากซองจดหมายนี้จากนั้นนำสัญญาณเสียงไปใช้กับคลื่นเสียงอีกครั้ง รหัสด้านล่างแสดงวิธีการทำ มันทำอะไรที่แตกต่างจากเสียงตัวเองทำให้เสียงแตก แต่กลับไปที่จุดเดิม - ฉันสามารถเปลี่ยนความกว้างของเสียงที่นี่เท่านั้น
n.env <- setenv(n, h,f=44100)#set envelope of noise 'n'
h.n.env <- h + n.env #combine audio wave with 'envelope noise'
par(mfrow=c(1,2))
spectro(h,f=44100,flim=c(0,10),scale=F)#spectrogram of normal wave (left)
spectro(h.n.env,f=44100,flim=c(0,10),scale=F,flab="")#spectrogram of wave with 'envelope noise' (right)
วิธีสุดท้ายอาจเป็นกุญแจไขปัญหานี้ แต่มันค่อนข้างยุ่งยาก ฉันพบวิธีการนี้ในรายงานรายงานที่ตีพิมพ์ในScienceโดย Shannon และคณะ (1996) พวกเขาใช้รูปแบบการลดสเปกตรัมค่อนข้างยุ่งยากเพื่อให้ได้สิ่งที่อาจฟังดูเป็นเรื่องหุ่นยนต์ แต่ในเวลาเดียวกันจากคำอธิบายฉันคิดว่าพวกเขาอาจพบวิธีแก้ปัญหาที่สามารถตอบปัญหาของฉันได้ ข้อมูลที่สำคัญอยู่ในวรรคที่สองในข้อความและหมายเหตุหมายเลข 7 ในการอ้างอิงและหมายเหตุ- มีการอธิบายวิธีการทั้งหมดไว้ที่นั่น ความพยายามของฉันในการทำซ้ำจนถึงตอนนี้ไม่ประสบความสำเร็จ แต่ด้านล่างเป็นรหัสที่ฉันจัดการเพื่อค้นหาพร้อมกับการตีความของฉันเกี่ยวกับวิธีการที่ควรทำ ฉันคิดว่ามีปริศนาเกือบทั้งหมดอยู่ที่นั่น แต่ฉันยังไม่สามารถรับภาพรวมทั้งหมดได้
###signal was passed through preemphasis filter to whiten the spectrum
#low-pass below 1200Hz, -6 dB per octave
h.f <- ffilter(h,to=1200)#low-pass filter up to 1200 Hz (but -6dB?)
###then signal was split into frequency bands (third-order elliptical IIR filters)
#adjacent filters overlapped at the point at which the output from each filter
#was 15dB down from the level in the pass-band
#I have just a bunch of options I've found in 'signal'
ellip()#generate an Elliptic or Cauer filter
decimate()#downsample a signal by a factor, using an FIR or IIR filter
FilterOfOrder()#IIR filter specifications, including order, frequency cutoff, type...
cutspec()#This function can be used to cut a specific part of a frequency spectrum
###amplitude envelope was extracted from each band by half-wave rectification
#and low-pass filtering
###low-pass filters (elliptical IIR filters) with cut-off frequencies of:
#16, 50, 160 and 500 Hz (-6 dB per octave) were used to extract the envelope
###envelope signal was then used to modulate white noise, which was then
#spectrally limited by the same bandpass filter used for the original signal
แล้วผลลัพธ์ที่ได้ควรเป็นอย่างไร มันควรจะเป็นอะไรบางอย่างระหว่างเสียงแหบเสียงดังแตก แต่หุ่นยนต์ไม่มาก มันจะดีถ้าบทสนทนาจะยังคงมีอยู่บ้าง ฉันรู้ว่า - มันเป็นเรื่องส่วนตัว แต่ไม่ต้องกังวลเกี่ยวกับเรื่องนั้น - คำแนะนำที่ดุร้ายและการตีความหลวม ๆ ยินดีต้อนรับอย่างมาก
อ้างอิง:
- Shannon, RV, Zeng, FG, Kamath, V. , Wygonski, J. , & Ekelid, M. (1995) การรู้จำเสียงด้วยตัวชี้นำชั่วคราว วิทยาศาสตร์ , 270 (5234), 303. ดาวน์โหลดจากhttp://www.cogsci.msu.edu/DSS/2007-2008/Shannon/temporal_cues.pdf
noisy <- audio + k*white_noise
เพื่อความหลากหลายของค่า k ทำในสิ่งที่คุณต้องการ? แน่นอนว่า "ผู้ที่เข้าใจได้" นั้นมีความคิดเห็นสูง โอ้และคุณอาจต้องการwhite_noise
ตัวอย่างที่แตกต่างกันสองสามโหลเพื่อหลีกเลี่ยงผลกระทบโดยบังเอิญอันเนื่องมาจากความสัมพันธ์เท็จระหว่างไฟล์audio
สุ่มค่าnoise
เดียว