Thông số xuống cấp lời nói để loại bỏ nội dung cảm xúc


12

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)

nhập mô tả hình ảnh ở đây

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)

nhập mô tả hình ảnh ở đây

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:


Một cách tiếp cận đơn giản sẽ là điều chỉnh, do đó nhân lên, giọng nói với (noise + 1.0). Nhưng một câu hỏi khác: bạn đang cố gắng làm gì? Mục tiêu quá mức của bạn là gì, khi làm cho giọng nói không thể hiểu được?

1
Tại sao không chỉ đơn giản là làm noisy <- audio + k*white_noisecho 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_noisemẫu khác nhau để tránh mọi hiệu ứng ngẫu nhiên do tương quan sai giữa audiovà một noisetệp giá trị ngẫu nhiên duy nhất .

Cuối cùng, tôi muốn giảm đáng tin cậy thông tin thính giác, để các phán đoán chính xác sẽ khác nhau đối với các mức độ khác nhau của clip âm thanh bị thao túng. Phán quyết chính xác sẽ dành cho cảm xúc - cho dù cuộc trò chuyện là vui hay giận. Vấn đề là cực kỳ khó để điều khiển nội dung cảm xúc của một bài phát biểu dài (như clip của tôi đính kèm ở trên). Mọi người làm điều đó với một nguyên âm duy nhất, nhưng không phải là toàn bộ câu. Vì vậy, tôi quyết định khái quát hóa câu hỏi và tìm ra cách làm suy giảm tham số toàn bộ phổ thông tin âm thanh.

@CarlWitthoft Giải pháp của bạn chỉ điều chỉnh biên độ nhiễu và như tôi đã nói - Tôi cần một cái gì đó trộn lẫn nhiễu với tín hiệu. +1 cho bạn gợi ý rằng tôi cần các mẫu nhiễu trắng khác nhau - điều đó thực sự có thể tạo ra sự khác biệt như bạn đã chỉ ra.

Chà ... tôi biện hộ cho sự thiếu hiểu biết ở đây: định nghĩa toán học của "trộn" hai luồng âm thanh là gì? Tôi đã ngây thơ giả định rằng, loại bỏ sự tồn tại của bộ lọc lập trình, tất cả những gì bạn có thể làm với hai vectơ biên độ lấy mẫu theo thời gian là thêm chúng.

Câu trả lời:


11

Tôi đã đọc câu hỏi ban đầu của bạn và không chắc chắn những gì bạn đang nhận được nhưng bây giờ nó khá rõ ràng hơn. Vấn đề bạn gặp phải là bộ não cực kỳ giỏi trong việc chọn ra lời nói và cảm xúc ngay cả khi tiếng ồn nền rất cao, đó là những nỗ lực hiện tại của bạn chỉ bị hạn chế thành công.

Tôi nghĩ rằng chìa khóa để có được những gì bạn muốn là hiểu các cơ chế truyền tải nội dung cảm xúc vì chúng hầu như tách biệt với các cơ chế truyền đạt sự thông minh. Tôi đã có một số kinh nghiệm xung quanh vấn đề này (thực tế luận văn bằng cấp của tôi thuộc một chủ đề tương tự) vì vậy tôi sẽ thử và đưa ra một số ý tưởng.

Hãy xem xét hai mẫu của bạn như những ví dụ về lời nói rất xúc động, sau đó xem xét đâu sẽ là một ví dụ "vô cảm". Điều tốt nhất tôi có thể nghĩ ra ngay bây giờ là máy tính tạo ra giọng nói kiểu "Stephen Hawking". Vì vậy, nếu tôi hiểu đúng những gì bạn muốn làm là hiểu sự khác biệt giữa chúng và tìm ra cách làm biến dạng các mẫu của bạn để dần trở nên giống như một máy tính tạo ra giọng nói vô cảm.

Tôi muốn nói rằng hai cơ chế chính để có được những gì bạn muốn là thông qua biến dạng cao độ và thời gian vì rất nhiều nội dung cảm xúc được chứa trong ngữ điệu và nhịp điệu của bài phát biểu. Vì vậy, một gợi ý về một vài điều có thể đáng để thử:

  1. Một hiệu ứng loại méo âm thanh làm cong cao độ và giảm ngữ điệu. Điều này có thể được thực hiện giống như cách Antares Autotune hoạt động khi bạn dần dần uốn cong hướng tới một giá trị không đổi ngày càng nhiều cho đến khi nó hoàn toàn đơn điệu.

  2. Hiệu ứng kéo dài thời gian làm thay đổi độ dài của một số phần của bài phát biểu - có lẽ các âm vị được phát ra liên tục sẽ phá vỡ nhịp điệu của bài phát biểu.

Bây giờ, nếu bạn quyết định tiếp cận một trong hai phương pháp này thì tôi sẽ thành thật - chúng không đơn giản để thực hiện trong DSP và nó sẽ không chỉ là một vài dòng mã. Bạn sẽ cần phải làm một số công việc để hiểu việc xử lý tín hiệu. Nếu bạn biết ai đó có Pro-Tools / Logic / Cubase và một bản sao của Antares Autotune thì có lẽ bạn nên thử xem liệu nó có mang lại hiệu quả như bạn muốn hay không trước khi thử tự mình viết mã.

Tôi hy vọng rằng cung cấp cho bạn một số ý tưởng và giúp một chút. Nếu bạn cần tôi giải thích bất kỳ điều gì tôi đã nói nữa thì hãy cho tôi biết.


Cảm ơn bạn đã góp ý @Redeye. Thật không may, kéo dài thời gian không phải là một lựa chọn, bởi vì sẽ có một điều kiện trong đó tôi trình bày chúng với thông tin video, vì vậy tôi cần giữ cho bài phát biểu được sửa đổi có cùng độ dài như bản gốc. Biến dạng cao độ là một cách tiếp cận thú vị - bạn có biết bất kỳ tài liệu tham khảo được công bố nào để giải thích phương pháp này tốt hơn không?
Geek On Acid

1
Cao độ thay đổi lời nói để làm những gì bạn muốn sẽ bao gồm hai giai đoạn - đầu tiên là phân tích bài phát biểu để thiết lập cấu hình tần số cơ bản hiện tại, sau đó là thay đổi cường độ. Việc phân tích khá đơn giản và có một số phương pháp hiệu quả. Sự thay đổi cao độ phức tạp hơn - Tôi sẽ thử tìm kiếm tạp chí AES để tìm các tài liệu tham khảo được xuất bản (JAES Tập 47 Số 11 trang 928-936; tháng 11 năm 1999 có vẻ như nó có thể hữu ích). Như tôi đã nói trước đây, bạn đang tham gia vào một số xử lý khá phức tạp ở đây và chắc chắn sẽ đáng để thử với Autotune trước.
Redeye

2
Redeye có những gợi ý hay, nhưng tôi chỉ lưu ý rằng đối với lời nói thay đổi cường độ, tôi sẽ không đề xuất cách phát âm pha hoặc bất kỳ cách tiếp cận miền tần số nào - PSola (thêm chồng chéo đồng bộ) là một cách hay vì nó sẽ tốt hơn cho âm thanh nhạc cụ khóa pha đơn âm như giọng nói.
schnarf

4

Tôi đề nghị bạn nên lấy một số phần mềm sản xuất âm nhạc và chơi với nó để có được hiệu quả mà bạn muốn. Chỉ sau đó bạn nên lo lắng về việc lập trình giải quyết điều này. (Nếu phần mềm âm nhạc của bạn có thể được gọi từ một dòng lệnh, thì bạn có thể gọi nó từ R hoặc MATLAB).


Một khả năng khác chưa được thảo luận là loại bỏ hoàn toàn cảm xúc bằng cách sử dụng lời nói thành phần mềm văn bản để tạo chuỗi, sau đó chuyển văn bản sang phần mềm lời nói để biến chuỗi đó thành giọng nói của robot. Xem /programming/491578/how-do-i-convert-speech-to-text/programming/637616/open-source-text-to-speech-l Library .

Để làm việc này một cách đáng tin cậy, có lẽ bạn sẽ phải đào tạo phần mềm đầu tiên để nhận biết loa.


Tôi cần lọc các tập tin gốc để chuyển văn bản thành giọng nói không thực sự là một lựa chọn đáng tiếc, mặc dù tôi có thể nghĩ về một số mô hình biến đổi giữa lời nói bình thường và lời nói tổng hợp.
Geek On Acid
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.