Giảm tiếng ồn xung quanh và tối ưu hóa lời nói từ clip âm thanh bằng ffmpeg


30

Tôi trích xuất các đoạn âm thanh từ một tập tin video để nhận dạng giọng nói. Những video này đến từ thiết bị di động / thiết bị thủ công khác và do đó có rất nhiều tiếng ồn. Tôi muốn giảm tiếng ồn xung quanh của âm thanh để lời nói mà tôi chuyển tiếp đến công cụ nhận dạng giọng nói của mình rõ ràng. Tôi đang sử dụng ffmpeg để làm tất cả những thứ này, nhưng bị kẹt ở giai đoạn giảm tiếng ồn.

Cho đến bây giờ tôi đã thử các bộ lọc sau:

ffmpeg-20140324-git-63dbba6-win64-static\bin>ffmpeg -i i nput.wav -filter_complex "highpass=f=400,lowpass=f=1800" out2.wav

ffmpeg -i i nput.wav -af "equalizer=f=1000:width_type=h:width=900:g=-10" output.wav

ffmpeg -i i nput.wav -af "bandreject=f=1200:width_type=h:width=900:g=-10" output.wav

Nhưng kết quả rất đáng thất vọng. Lý do của tôi là vì lời nói đến dưới 300-3000 hz, tôi có thể lọc tất cả các tần số khác để triệt tiêu mọi tiếng ồn xung quanh. Tôi đang thiếu gì?

Ngoài ra, tôi đọc về các bộ lọc weiner có thể được sử dụng để cải tiến lời nói và tìm thấy điều này nhưng không chắc chắn cách sử dụng nó.

Câu trả lời:


35

Nếu bạn đang muốn cách ly lời nói có thể nghe được, hãy thử kết hợp bộ lọc thông thấp với bộ lọc thông cao. Đối với âm thanh có thể sử dụng, tôi nhận thấy rằng việc lọc ra 200hz trở xuống sau đó lọc ra 3000hz trở lên thực hiện công việc giữ âm thanh giọng nói có thể sử dụng khá tốt.

ffmpeg -i <input_file> -af "highpass=f=200, lowpass=f=3000" <output_file>

Trong ví dụ này, trước tiên hãy thêm bộ lọc thông cao để cắt tần số thấp hơn sau đó sử dụng bộ lọc thông thấp để cắt tần số cao hơn. Nếu cần, bạn có thể chạy tệp của mình qua việc này nhiều lần để dọn sạch các tần số db cao hơn trong phạm vi tần số cắt.


Xin lỗi, nhưng điều này dường như không làm giảm tiếng ồn đáng chú ý đối với tôi.
Angad

Điều này hoạt động rất tốt để giảm mức độ nhiễu nền thấp (quạt, ù, v.v.) nhưng có thể làm giảm chất lượng âm thanh một chút, mặc dù điều đó có thể được giảm bớt bằng cách áp dụng các bộ lọc khác sau đó.
Iain Collins

3
Đối với trường hợp của tôi, âm thanh gốc rất tệ đến mức gần như không thể nghe thấy giọng nói vì một số tiếng nước rơi trong nền. Tôi đã sử dụng như sau. Nó không phải là chất lượng tuyệt vời, nhưng tốt hơn 1000 lần so với bản gốc. -af "highpass=f=200, lowpass=f=1000"
Eric

Tôi nhận được một số lỗi với cảnh báo ở trên hoặc đúng hơn, cảnh báo từ ffmpeg: [Parsed_highpass_0 @ 0x1524780] cắt 52 lần. Hãy giảm lợi ích.
shevy

6
Bạn có thể xem trước bộ lọc của mình vớiffplay <input file> -af lowpass=3000,highpass=200
Bjorn

11

FFmpeg hiện có 2 bộ lọc riêng để xử lý nền nhiễu:

Ngoài ra, vì đôi khi, người ta có thể sử dụng các bộ lọc ladspa(tìm kiếm bộ khử nhiễu) và / hoặc lv2(tìm bộ khử nhiễu giọng nói) với FFmpeg.


9

ffmpeg không có bất kỳ bộ lọc âm thanh tốt nào để tích hợp giảm nhiễu. Audacity có bộ lọc NR khá hiệu quả, nhưng nó được thiết kế để sử dụng cho hoạt động 2 lượt với một mẫu chỉ là tiếng ồn và sau đó là đầu vào.

Các ý kiến ​​ở đầu https://github.com/audacity/audacity/blob/master/src/effects/NatyRedraction.cpp giải thích cách thức hoạt động của nó. (về cơ bản: triệt tiêu mọi thùng FFT dưới ngưỡng. Vì vậy, nó chỉ cho phép tín hiệu phát ra khi chúng to hơn mức nhiễu trong dải tần số đó. Nó có thể làm những điều tuyệt vời mà không gây ra sự cố. Giống như bộ lọc thông dải thích ứng đến tín hiệu. Vì năng lượng của nhiễu được lan truyền trên toàn bộ phổ, chỉ cho qua một vài dải hẹp của nó sẽ làm giảm tổng năng lượng nhiễu rất nhiều.

Xem thêm Giảm tiếng ồn âm thanh: làm thế nào để âm thanh so sánh với các tùy chọn khác? để biết thêm chi tiết về cách thức hoạt động của nó và việc đập các thùng FFT theo cách này hay cách khác cũng là cơ sở của các bộ lọc giảm tiếng ồn thương mại điển hình.

Chuyển bộ lọc đó sang ffmpeg sẽ hơi khó xử. Có thể triển khai nó dưới dạng bộ lọc với 2 đầu vào, thay vì bộ lọc 2 chiều, sẽ hoạt động tốt nhất. Vì nó chỉ cần một vài giây để có được một hồ sơ tiếng ồn, nó không giống như nó phải đọc qua toàn bộ tập tin. Và dù sao bạn cũng không nên cho nó toàn bộ luồng âm thanh dưới dạng mẫu nhiễu. Nó cần phải xem một mẫu tiếng ồn CHỈ để đặt ngưỡng cho mỗi thùng FFT.

Vì vậy, yeah, một đầu vào thứ 2, chứ không phải 2pass, sẽ có ý nghĩa. Nhưng điều đó làm cho nó dễ sử dụng hơn nhiều so với hầu hết các bộ lọc ffmpeg. Bạn sẽ cần một loạt các voodoo với trích xuất luồng / phân chia thời gian. Và tất nhiên bạn cần can thiệp thủ công, trừ khi bạn có một mẫu nhiễu trong một tệp riêng sẽ phù hợp với nhiều tệp đầu vào. (một mẫu nhiễu từ cùng một mic / thiết lập sẽ tốt cho tất cả các clip từ thiết lập đó.)

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.