ลดระดับเสียงพูดเพื่อลบเนื้อหาทางอารมณ์


12

ฉันยินดีที่จะรับข้อเสนอแนะทั้งใน 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

วิธีการง่าย ๆ อย่างหนึ่งคือการปรับดังนั้นคูณด้วยเสียง (เสียง + 1.0) แต่คำถามอื่น: คุณพยายามทำอะไร เป้าหมายที่วางอยู่ของคุณคืออะไรเมื่อทำให้เสียงไม่สามารถเข้าใจได้?

1
ทำไมไม่เพียงแค่ทำnoisy <- audio + k*white_noiseเพื่อความหลากหลายของค่า k ทำในสิ่งที่คุณต้องการ? แน่นอนว่า "ผู้ที่เข้าใจได้" นั้นมีความคิดเห็นสูง โอ้และคุณอาจต้องการwhite_noiseตัวอย่างที่แตกต่างกันสองสามโหลเพื่อหลีกเลี่ยงผลกระทบโดยบังเอิญอันเนื่องมาจากความสัมพันธ์เท็จระหว่างไฟล์audioสุ่มค่าnoiseเดียว

ในที่สุดฉันต้องการลดความน่าเชื่อถือของข้อมูลการได้ยินเพื่อให้การตัดสินความถูกต้องแม่นยำจะแตกต่างกันสำหรับคลิปเสียงที่มีการจัดการในระดับต่างๆ การตัดสินความถูกต้องจะเป็นไปตามอารมณ์ความรู้สึก ปัญหาคือว่ามันยากมากที่จะจัดการกับเนื้อหาทางอารมณ์ของคำพูดยาว (เช่นคลิปของฉันที่แนบมาด้านบน) ผู้คนทำมันด้วยสระเดียว แต่ไม่ใช่ทั้งประโยค ดังนั้นฉันจึงตัดสินใจที่จะสรุปคำถามและหาวิธีลดความแปรปรวนของข้อมูลเสียงทั้งหมด

@CarlWitthoft วิธีการแก้ปัญหาของคุณเพียงปรับความกว้างของเสียงและฉันพูดว่า - ฉันต้องการสิ่งที่ผสมเสียงกับสัญญาณ +1 คุณคำแนะนำที่ฉันต้องการตัวอย่างของเสียงสีขาวที่แตกต่างกัน - ที่อาจสร้างความแตกต่างตามที่คุณชี้ให้เห็น

อืม ... ฉันขอร้องอวิชชาที่นี่: อะไรคือคำจำกัดความทางคณิตศาสตร์ของ "การผสม" สองกระแสข้อมูลเสียง ฉันสันนิษฐานอย่างไร้เดียงสาว่าการปล่อยให้มีตัวกรองที่สามารถตั้งโปรแกรมได้สิ่งที่คุณทำได้กับเวกเตอร์สองช่วงของแอมพลิจูดแบบสุ่มเวลาคือการเพิ่มลงไป

คำตอบ:


11

ฉันอ่านคำถามเดิมของคุณและไม่แน่ใจว่าสิ่งที่คุณได้รับ แต่ตอนนี้ค่อนข้างชัดเจนมากขึ้น ปัญหาที่คุณมีคือสมองมีความสามารถในการพูดและอารมณ์ได้เป็นอย่างดีแม้ว่าเสียงพื้นหลังจะสูงมากซึ่งเป็นความพยายามที่มีอยู่ของคุณเท่านั้นที่ประสบความสำเร็จอย่าง จำกัด

ฉันคิดว่ากุญแจสำคัญในการได้รับสิ่งที่คุณต้องการคือการเข้าใจกลไกที่ถ่ายทอดเนื้อหาทางอารมณ์เนื่องจากส่วนใหญ่แยกจากสิ่งที่สื่อความเข้าใจ ฉันได้รับประสบการณ์บางอย่างเกี่ยวกับเรื่องนี้ (อันที่จริงวิทยานิพนธ์ปริญญาของฉันอยู่ในหัวข้อที่คล้ายกัน) ดังนั้นฉันจะลองและเสนอแนวคิดบางอย่าง

พิจารณาตัวอย่างสองตัวอย่างของคุณเป็นตัวอย่างของการพูดทางอารมณ์อย่างมากจากนั้นให้พิจารณาตัวอย่างที่ "ไร้อารมณ์" สิ่งที่ดีที่สุดที่ฉันคิดได้ในตอนนี้คือคอมพิวเตอร์ที่สร้างเสียงพิมพ์ "Stephen Hawking" ดังนั้นหากฉันเข้าใจถูกต้องว่าคุณต้องการทำอะไรคือเข้าใจความแตกต่างระหว่างพวกเขาและหาวิธีบิดเบือนตัวอย่างของคุณให้ค่อยๆกลายเป็นเหมือนคอมพิวเตอร์ที่สร้างเสียงไร้อารมณ์

ฉันจะบอกว่าทั้งสองกลไกหลักเพื่อให้ได้สิ่งที่คุณต้องการคือการบิดเบือนระดับเสียงและเวลาเนื่องจากเนื้อหาทางอารมณ์จำนวนมากมีอยู่ในน้ำเสียงและจังหวะของการพูด ดังนั้นข้อเสนอแนะของสองสิ่งที่น่าลอง:

  1. เอฟเฟกต์การบิดเบี้ยวระดับพิทช์ซึ่งลดระดับเสียงพิทช์และลดเสียงสูงต่ำ วิธีนี้สามารถทำได้เช่นเดียวกับที่ Antares Autotune ทำงานซึ่งคุณค่อยๆโค้งงอไปทางค่าคงที่มากขึ้นเรื่อย ๆ จนกว่าจะเป็นเสียงโมโนสมบูรณ์

  2. เอฟเฟ็กต์ยืดเวลาซึ่งเปลี่ยนความยาวของบางส่วนของคำพูด - บางทีอาจจะเป็นหน่วยเสียงที่เปล่งเสียงคงที่ซึ่งจะสลายจังหวะการพูด

ทีนี้ถ้าคุณตัดสินใจที่จะใช้วิธีใดวิธีหนึ่งต่อไปนี้ฉันจะบอกตรงๆว่ามันไม่ได้ตรงไปตรงมาที่จะนำไปใช้ใน DSP และมันจะไม่เป็นเพียงโค้ดสองสามบรรทัด คุณจะต้องทำงานเพื่อทำความเข้าใจกับการประมวลผลสัญญาณ ถ้าคุณรู้จักใครสักคนที่มี Pro-Tools / Logic / Cubase และสำเนาของ Antares Autotune มันคงคุ้มค่าที่จะลองดูว่ามันจะมีเอฟเฟกต์ที่คุณต้องการหรือไม่

ฉันหวังว่าจะให้ความคิดและช่วยเหลือคุณเล็กน้อย หากคุณต้องการให้ฉันอธิบายสิ่งที่ฉันได้พูดไปแล้วโปรดแจ้งให้เราทราบ


ขอบคุณสำหรับคำแนะนำของคุณ @ Redeye การยืดเวลาไม่ใช่ทางเลือกที่น่าเสียดายเพราะจะมีเงื่อนไขที่ฉันแสดงข้อมูลวิดีโอให้พวกเขาดังนั้นฉันต้องรักษาคำพูดที่ปรับเปลี่ยนให้มีความยาวเท่ากับต้นฉบับ การบิดเบือนทางเสียงเป็นวิธีที่น่าสนใจคุณรู้จักการอ้างอิงใด ๆ ที่เผยแพร่แล้วเพื่ออธิบายวิธีนี้ให้ดีขึ้นหรือไม่?
Geek On Acid

1
Pitch เปลี่ยนคำพูดเพื่อทำสิ่งที่คุณต้องการจะเกี่ยวข้องกับสองขั้นตอน - การวิเคราะห์เสียงพูดก่อนเพื่อสร้างโปรไฟล์ความถี่พื้นฐานปัจจุบันจากนั้นเปลี่ยนเสียงพิทช์เป็นครั้งที่สอง การวิเคราะห์ค่อนข้างตรงไปตรงมาและมีหลายวิธีที่มีประสิทธิภาพ การเปลี่ยนระดับเสียงมีความซับซ้อนมากขึ้น - ฉันลองค้นหาวารสาร AES เพื่อหาข้อมูลอ้างอิงที่ตีพิมพ์ (JAES เล่ม 47 ปัญหา 11 หน้า 928-936; พฤศจิกายน 2542 ดูเหมือนว่ามันจะมีประโยชน์) อย่างที่ฉันพูดไว้ก่อนหน้านี้คุณกำลังเข้าสู่การประมวลผลที่ซับซ้อนสวย ๆ ที่นี่และมันก็คุ้มค่าที่จะลองใช้กับ Autotune ก่อน
Redeye

2
Redeye มีคำแนะนำที่ดี แต่ฉันเพิ่งจะทราบว่าสำหรับการเปลี่ยนระดับเสียงพูดฉันจะไม่แนะนำเฟส vocoder หรือวิธีการโดเมนความถี่ - PSOLA (การซิงโครนัสแบบซิงโครนัสซ้อนทับกัน) เป็นวิธีที่ดี เครื่องมือล็อคเฟสโมโนโฟนิกเหมือนเสียง
schnarf

4

ฉันขอแนะนำให้คุณใช้ซอฟต์แวร์ผลิตเพลงและเล่นกับสิ่งนั้นเพื่อให้ได้ผลตามที่คุณต้องการ เท่านั้นคุณควรกังวลเกี่ยวกับการแก้ปัญหานี้โดยทางโปรแกรม (หากซอฟต์แวร์เพลงของคุณสามารถเรียกได้จากบรรทัดคำสั่งคุณสามารถโทรจาก R หรือ MATLAB)


ความเป็นไปได้อีกอย่างหนึ่งที่ยังไม่ได้กล่าวถึงคือการแยกอารมณ์ออกโดยใช้ซอฟต์แวร์การพูดกับข้อความเพื่อสร้างสตริงจากนั้นซอฟต์แวร์ข้อความเป็นคำพูดเพื่อเปลี่ยนสตริงให้เป็นเสียงหุ่นยนต์ ดู /programming/491578/how-do-i-convert-speech-to-text และ /programming/637616/open-source-text-to-speech-library .

เพื่อให้ทำงานได้อย่างน่าเชื่อถือคุณอาจต้องฝึกอบรมซอฟต์แวร์ชิ้นแรกเพื่อจดจำลำโพง


ฉันต้องการกรองไฟล์ต้นฉบับดังนั้นการอ่านออกเสียงข้อความไม่ใช่ตัวเลือกที่น่าเสียดายจริงๆถึงแม้ว่าฉันอาจคิดถึงกระบวนทัศน์ที่แปรเปลี่ยนระหว่างการพูดปกติและการสังเคราะห์เสียง
Geek On Acid
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.