Kỹ thuật sử dụng SoX để xử lí âm thanh

1.    SoX là gì? 

SoX, viết tắt của Sound eXchange, được mệnh danh là "The Swiss Army knife of audio manipulation"
SoX là một bộ công cụ Command-Line đa nền tảng (Windows, Linux, MacOS) cho phép thực hiện một loạt các tác vụ trên các tệp tin âm thanh, có thể kể đến như sau: 

  • - Đọc / Phát / Ghi các tệp tin âm thanh với rất nhiều định dạng khá nhau. (chi tiết định dạng xem tại đây
  • - Chuyển đổi định dạng tệp tin âm thanh sang các định dạng khác, ví dụ như định dạng .AU (.au) sang định dạng Microsoft WAV (.wav)
  • - Sửa đổi tệp tin âm thanh, như thay đổi sampling rate, thay đổi channel, các tác vụ liên quan đến remix âm thanh, điều chỉnh tốc độ hay âm lượng của âm thanh. 
  • - Ghi âm các đoạn âm thanh (hỗ trợ multi-track recording, tức là cho phép ghi âm trên nhiều cấu hình khác nhau). SoX sử dụng biến môi trường $AUDIODRIVER để sử dụng micro của máy tính.
  • - Gộp nhiều tệp tin âm thanh lại với nhau.
  • - Xem thêm tại: https://linux.die.net/man/1/sox 
  • - SoX 14.4.2 được ra mắt vào February 22, 2015. Tải xuống và cài đặt SoX tại: https://sox.sourceforge.net/Main/HomePage hoặc cài trực tiếp SoX bằng Ubuntu CLI: sudo apt-get -y install sox

 

Một trong những khả năng chính của SoX được sử dụng phổ biến trong bài toán Speech Regconition chính là việc xử lí tệp tin âm thanh trên cơ chế loại bỏ các đoạn silence. Cụ thể, chúng ta rất khó xác định rằng cụ thể thì khi nào sẽ có một giọng nói vang lên và thực hiện ghi âm giọng nói này. Trong quá trình ghi âm, ta cũng không thật sự biết rõ rằng khi nào giọng nói sẽ kết thúc. 


SoX sẽ sử dụng tác vụ silence của mình để tự động ghi âm, tự động ngắt ghi âm theo logic như sau: 

< IM LẶNG > --- < XIN CHÀO CÁC BẠN SINH VIÊN > --- < IM LẶNG > 

Tức là nếu chúng ta xác định được: sau một đoạn < IM LẶNG > --> bắt đầu có tiếng nói vang lên thì ta sẽ thực hiện ghi âm. 
Sau khi hết giọng nói --> gặp một đoạn < IM LẶNG > nhất định --> ta sẽ kết thúc ghi âm.
Lúc này, ta đã có đoạn ghi âm ghi lại câu nói < XIN CHÀO CÁC BẠN SINH VIÊN >

 

Chúng ta sẽ tìm hiểu kĩ hơn về cơ chế này ngay sau đây. 

Một số keyword sẽ xuất hiện trong bài viết này: 

  • - Tệp (tin) âm thanh gốc / Tệp (tin) audio gốc: chỉ tệp tin chưa được SoX can thiệp vào, có tác dụng như một mẫu thử ví dụ cho bài viết.
  • - Đoạn silence: là một đoạn âm thanh rất nhỏ, hoặc không có âm thanh xuất hiện bất kì (ở đầu, ở giữa, ở cuối) của tệp tin âm thanh gốc. Có thể có rất nhiều đoạn silence trong một tệp âm thanh.
  • - Đoạn audio: là một đoạn âm thanh có độ lớn âm thanh trong ngưỡng cho phép. 
  • - Threshold: ngưỡng.
  • - Duration: độ dài. 

 

 

2.    Sử dụng tác vụ silence của SoX cho bài toán lọc đoạn silence và audio nhiễu. 

Một số lệnh SoX Silence được biểu điễn như sau, chú ý phần màu sắc để liên kết với các nhóm lệnh của chúng: 

Sau đây, ta sẽ tiến hành phân tích từng phần nhỏ bên trong tác vụ silence của SoX, theo thứ tự là above-periods, rồi đến below-periods. Hãy bắt đầu với các tham số thuộc nhóm above-periods: 

Trong đó, 

  • - above-periods: (integer) giá trị để xác định có cần lược bỏ các đoạn silence kể từ đầu đoạn audio hay không?
    • + Nếu above-periods = 0: Không cần quan tâm đến các đoạn silence ở đầu đoạn audio.
    • + Nếu above-periods = 1: SoX sẽ cắt bỏ tất cả các đoạn silence và đoạn âm thanh kể từ bắt đầu tệp audio gốc cho đến khi nó tìm thấy đoạn audio có âm lượng trên ngưỡng threshold. 
    • + Nếu above-periods > 1: SoX sẽ cắt bỏ số lượng (= giá trị biến above-periods) các đoạn silence kể từ đầu tệp audio gốc.
      Ví dụ trong trường hợp sau: Chúng ta có 1 tệp audio gốc gồm 2 bài hát, phân cách bởi một đoạn silence. Thì khi giá trị = 2, thì đoạn audio sẽ bị cắt bỏ 2 lần:
      • Lần 1:  Cắt bỏ đoạn silence trước khi bắt đầu bài hát 
      • Lần 2:  Cắt bỏ đoạn silence ở giữa bài hát số 1 và bài hát số 2.
    • + Trong thực tế, thường ta chỉ sử dụng 0 và 1 vì không thể biết rõ đặc trưng của các tệp audio gốc cần xử lí. 
  • - duration: (float) là thời lượng tối thiểu mà đoạn audio cần đạt được trước khi cắt bỏ đoạn silence trước nó. 
  • - threshold: (float) là ngưỡng giá trị phân định giữa đoạn silence và đoạn audio. Tức là nếu âm lượng của nó nhỏ hơn ngưỡng --> đó là đoạn silence và ngược lại.
    Giá trị threshold có thể biểu diễn trên thang đo % (0% là im lặng tuyệt đối và 100% là âm lượng cao nhất của tệp audio gốc),  hoặc ta có thể thêm giá trị d vào sau và dùng nó như độ đo decibel. 

Ví dụ về việc sử dụng above-periods để cắt bỏ các đoạn silence hay âm thanh từ đầu tệp audio gốc.

 

 

Ta tiếp tục tiến hành phân tích từng phần nhỏ bên trong tác vụ below-periods. Hãy bắt đầu với các tham số thuộc nhóm below-periods

Lưu ý rằng, khi sử dụng tác vụ below-periods thì phải bắt buộc đi kèm với tác vụ below-periods. Các tham số có ý nghĩa như sau: 

  • - below-periods: (integer) Xác định các điều kiện mà sau khi đạt được, SoX sẽ cắt bỏ những đoạn âm thanh phía sau điều kiện này. 
    • + Nếu below-periods=0: Bỏ qua, không quan tâm đến các điều kiện theo sau. 
    • + Nếu below-periods=1: Ngay khi điều kiện theo sau (duration, threshold) thỏa sẽ tiến hành cắt bỏ. 
    • + Nếu below-periods>1: Bỏ qua (skip) N-1 các điều kiện thỏa, đến trường hợp cuối thì mới tiến hành cắt bỏ.
      Ví dụ: Cho một tệp audio gốc có một bài hát, trong đó có 02 giây silence ở giữa bài hát và 02 giây silence ở cuối bài hát.
      • Nếu below-periods=1 thì đoạn audio sẽ kéo dài từ đầu --> đoạn silence đầu tiên. 
      • Nếu below-periods=2 thì đoạn audio sẽ kéo dài từ đầu --> cuối bài hát. (bỏ qua đoạn silence đầu tiên thỏa điều kiện). 
  • - duration: (float): xác định độ dài đoạn silence nhất định trước khi ngắt. Ta có thể tăng giá trị biến duration lên nếu muốn giữ lại nhiều đoạn silence hơn. Ví dụ nếu duration quá thấp, SoX sẽ ngắt tệp audio gốc khi người nói trong tệp ngắt nghỉ / thở giữa các từ. 
    Ví dụ khác: ta có một bài hát có hai đoạn silence,  1 đoạn dài 1 giây và 1 đoạn dài 2 giây, thì bằng cách đặt duration=2 có thể được sử dụng để giữ lại đoạn silence dài 1 giây.
  • - threshold: (float) có thể được dùng dưới dạng decibel hoặc % (tương tự như above-periods threshold) để biểu thị phần trăm giá trị lớn nhất cho phép của đoạn âm thanh (0% chỉ định độ im lặng kỹ thuật số thuần túy).

Ví dụ về việc sử dụng  below-periods để cắt bỏ tệp audio gốc khi thỏa điều kiện.

 

Một vấn đề của việc xóa đi các đoạn silence của tệp audio gốc chính là chúng ta không biết chính xác có bao nhiêu đoạn silence vượt ngưỡng trong đoạn audio gốc. Một kĩ thuật thường hay được sử dụng chính là phát ngược (reverse play) tệp audio gốc và sử dụng các tham số của nhóm lệnh above-periods để xử lí chúng. Sau khi xử lí, tệp audio gốc được phát ngược trở lại. Các lệnh có thể dùng trong trường hợp này như sau: 

 

Ngoài ra, ta có thể dùng các lệnh thuộc nhóm below-periods nhằm mục đích loại bỏ toàn bộ các đoạn silence nằm giữa tệp audio gốc. 
Ta cần xác định một giá trị below-periods dưới dạng số âm. Giá trị này có tác dụng tương tự như giá trị dương, nhưng có tác dụng lặp lại liên tục quá trình xử lý như được chỉ định bởi điều kiện của nhóm lệnh above-periods, làm cho nó phù hợp để loại bỏ các đoạn silence ở giữa tệp âm thanh.

 

 

Cuối cùng, ta vẫn còn option [-l], nhớ chứ? Tùy chọn -l chỉ ra rằng độ dài tối đa của đoạn silence phải được giữ lại. Ví dụ: nếu bạn muốn xóa các đoạn silence dài giữa các từ nhưng không muốn xóa hoàn toàn các đoạn silence (làm chúng ngắn lại).

 

3.    Kết luận

Vậy là thông qua bài viết này, hi vọng các bạn đã có thêm một phần khiêm tốn kiến thức về việc sử dụng SoX cho bài toán xử lí silence nhằm phục vụ task Speech Regconition tốt hơn. SoX là một công cụ cực kì powerful, vì vậy, bài viết này chỉ có thể bao quát một phần rất nhỏ về công cụ này. Hi vọng sẽ được tiếp tục trình bày về SoX với các bạn trong những bài viết sau. 

 

 

Tham khảo: https://digitalcardboard.com/blog/2009/08/25/the-sox-of-silence