Tôi rất vui khi chấp nhận các đề xuất trong R hoặc Matlab, nhưng mã tôi trình bày dưới đây chỉ là R.
Tệp âm thanh được đính kèm bên dưới là một đoạn hội thoại ngắn giữa hai người. Mục tiêu của tôi là bóp méo lời nói của họ để nội dung cảm xúc sẽ trở nên không thể nhận ra. Khó khăn là tôi cần một số không gian tham số cho sự biến dạng này, giả sử từ 1 đến 5, trong đó 1 là 'cảm xúc rất dễ nhận biết' và 5 là 'cảm xúc không thể nhận ra'. Có ba cách tôi nghĩ tôi có thể sử dụng để đạt được điều đó với R.
Tải xuống sóng âm thanh 'hạnh phúc' từ đây .
Tải xuống sóng âm thanh 'tức giận' từ đây .
Cách tiếp cận đầu tiên là giảm độ thông minh tổng thể bằng cách đưa ra tiếng ồn. Giải pháp này được trình bày dưới đây (cảm ơn @ carl-witthoft vì những gợi ý của anh ấy). Điều này sẽ làm giảm cả mức độ dễ hiểu và nội dung cảm xúc của bài phát biểu, nhưng cách tiếp cận rất 'bẩn' - thật khó để có được không gian tham số, bởi vì khía cạnh duy nhất bạn có thể kiểm soát là có biên độ (âm lượng) tiếng ồn.
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)
Cách tiếp cận thứ hai sẽ là bằng cách nào đó điều chỉnh tiếng ồn, để làm biến dạng giọng nói chỉ trong các dải tần số cụ thể. Tôi nghĩ rằng tôi có thể làm điều đó bằng cách trích xuất đường bao biên độ từ sóng âm thanh gốc, tạo ra tiếng ồn từ đường bao này và sau đó áp dụng lại tiếng ồn cho sóng âm thanh. Mã dưới đây cho thấy làm thế nào để làm điều đó. Nó làm một cái gì đó khác với tiếng ồn, làm cho âm thanh bị rạn nứt, nhưng nó quay trở lại cùng một điểm - rằng tôi chỉ có thể thay đổi biên độ của tiếng ồn ở đây.
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)
Cách tiếp cận cuối cùng có thể là chìa khóa để giải quyết vấn đề này, nhưng nó khá khó. Tôi tìm thấy phương pháp này trong báo cáo được xuất bản trong Science của Shannon et al. (1996) . Họ đã sử dụng mô hình giảm quang phổ khá khó khăn, để đạt được thứ gì đó nghe có vẻ khá robot. Nhưng đồng thời, từ mô tả, tôi cho rằng họ có thể đã tìm ra giải pháp có thể trả lời vấn đề của tôi. Thông tin quan trọng nằm ở đoạn thứ hai trong văn bản và ghi chú số 7 trong Tài liệu tham khảo và ghi chú - toàn bộ phương pháp được mô tả ở đó. Những nỗ lực của tôi để sao chép nó cho đến nay đã không thành công nhưng dưới đây là mã tôi quản lý để tìm, cùng với sự giải thích của tôi về cách thủ tục nên được thực hiện. Tôi nghĩ rằng hầu hết tất cả các câu đố đều ở đó, nhưng bằng cách nào đó tôi không thể có được toàn bộ bức tranh.
###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
Vậy kết quả âm thanh như thế nào? Nó nên là một cái gì đó giữa khàn giọng, một vết nứt ồn ào, nhưng không quá nhiều robot. Sẽ là tốt nếu cuộc đối thoại sẽ vẫn còn một số mở rộng dễ hiểu. Tôi biết - tất cả đều hơi chủ quan, nhưng đừng lo lắng về điều đó - những đề xuất hoang dã và những diễn giải lỏng lẻo rất đáng hoan nghênh.
Người giới thiệu:
- Shannon, RV, Zeng, FG, Kamath, V., Wygonski, J., & Ekelid, M. (1995). Nhận dạng giọng nói với tín hiệu chủ yếu là thời gian. Khoa học , 270 (5234), 303. Tải xuống từ http://www.cogsci.msu.edu/DSS/2007-2008/Shannon/temporal_cues.pdf
noisy <- audio + k*white_noise
cho nhiều giá trị của k làm những gì bạn muốn? Tất nhiên, hãy nhớ rằng "dễ hiểu" là rất chủ quan. Ồ, và bạn có thể muốn một vài chục white_noise
mẫu khác nhau để tránh mọi hiệu ứng ngẫu nhiên do tương quan sai giữa audio
và một noise
tệp giá trị ngẫu nhiên duy nhất .