Chương 7·Bài 7.1

Dữ liệu âm thanh

Bài 1Đọc tệp WAV

Đọc một tệp WAV và kiểm vài con số cơ bản trước khi đưa âm thanh vào mô hình. Một bẫy quen thuộc: hai kênh trái phải có thể rất to mà gộp thành mono lại gần như im lặng, khi hai kênh ngược pha nhau.

Tệp clip.wav là PCM 16 bit (số nguyên có dấu, little-endian), có NN khung, CC kênh, tần số lấy mẫu FsF_s.

  • Đổi mỗi mẫu thành số thực bằng cách chia cho 3276832768.
  • duration là N/FsN/F_s giây; last_sample_time là thời điểm của mẫu cuối, (N−1)/Fs(N-1)/F_s.
  • mono là trung bình các kênh tại từng khung.
  • channel_rms là trung bıˋnh bıˋnh phương\sqrt{\text{trung bình bình phương}} của từng kênh; mono_rms tương tự cho tín hiệu mono.

Dữ liệu vào

Mỗi thư mục test có input.json (gồm file, tên tệp WAV) và tệp WAV ấy.

Kết quả

Một đối tượng JSON gồm frames, channels, sample_rate, duration, last_sample_time, mono, channel_rms và mono_rms.

Chấm điểm

Có 20 test, mỗi test 5 điểm. Số thực được chấm với sai số khoảng 10−710^{-7}.

Ví dụ

Input mẫu

{"file": "clip.wav"}

Output mẫu

{
  "frames": 64,
  "channels": 2,
  "sample_rate": 2048,
  "duration": 0.03125,
  "last_sample_time": 0.03076171875,
  "mono": [
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
  ],
  "channel_rms": [0.4242614408971766, 0.4242614408971766],
  "mono_rms": 0.0
}

Bài 2Phổ theo thời gian

Một đoạn âm thanh có hai nốt nối tiếp nhau. Biến đổi Fourier cả đoạn chỉ cho biết có hai tần số, không cho biết nốt nào trước. Phổ theo thời gian (STFT) cắt tín hiệu thành từng khung ngắn rồi biến đổi từng khung.

Tệp WAV có một kênh, PCM 16 bit (chia cho 3276832768). Cửa sổ dài LL (chẵn), bước nhảy HH, không đệm.

  1. Cửa sổ Hann dạng tuần hoàn: w[n]=0.5(1−cos⁡(2πn/L))w[n]=0.5\big(1-\cos(2\pi n/L)\big), n=0..L−1n=0..L-1.
  2. Khung jj gồm các mẫu jHjH tới jH+L−1jH+L-1; có F=1+⌊(N−L)/H⌋F=1+\lfloor (N-L)/H\rfloor khung.
  3. Với mỗi khung, Sk=∑nx[jH+n] w[n] e−2πikn/LS_k=\sum_n x[jH+n]\,w[n]\,e^{-2\pi i kn/L} với k=0..L/2k=0..L/2. Công suất là ∣Sk∣2/(∑nw[n])2|S_k|^2/(\sum_n w[n])^2 (không nhân đôi).
  4. Tần số của hàng kk là kFs/LkF_s/L; thời điểm giữa khung jj là (jH+L/2)/Fs(jH+L/2)/F_s.

Dữ liệu vào

Mỗi thư mục test có input.json (gồm file, window, hop) và tệp WAV.

Kết quả

Một đối tượng JSON gồm power (ma trận (L/2+1)×F(L/2+1)\times F: hàng là tần số, cột là khung), frequencies, centers và shape.

Chấm điểm

Có 20 test, mỗi test 5 điểm. Số thực được chấm với sai số khoảng 10−710^{-7}.

Ví dụ

Input mẫu

{"file": "clip.wav", "window": 16, "hop": 4}

Output mẫu

{
  "power": [
    [
      1.8662148313654636e-34, 1.8662148313654636e-34,
      1.8662148313654636e-34, 1.8662148313654636e-34,
      1.8662148313654636e-34, 1.8662148313654636e-34,
      1.8662148313654636e-34, 1.8662148313654636e-34,
      1.8662148313654636e-34, 0.0005109490235715746,
      0.010536096251347285, 0.000510949023571574,
      1.4745401136714774e-34, 1.4745401136714774e-34,
      1.4745401136714774e-34, 1.4745401136714774e-34,
      1.4745401136714774e-34, 1.4745401136714774e-34,
      1.4745401136714774e-34, 1.4745401136714774e-34,
      1.4745401136714774e-34
    ],
    [
      0.018906184580641115, 0.018906184580641115, 0.018906184580641115,
      0.018906184580641115, 0.018906184580641115, 0.018906184580641115,
      0.018906184580641115, 0.018906184580641115, 0.018906184580641115,
      0.02406031963162483, 0.015262713729091364, 0.0004933906290543393,
      1.0765364306217286e-12, 1.0765364306217286e-12,
      1.0765364306217286e-12, 1.0765364306217286e-12,
      1.0765364306217286e-12, 1.0765364306217286e-12,
      1.0765364306217286e-12, 1.0765364306217286e-12,
      1.0765364306217286e-12
    ],
    [
      0.07562473832256449, 0.07562473832256449, 0.07562473832256449,
      0.07562473832256449, 0.07562473832256449, 0.07562473832256449,
      0.07562473832256449, 0.07562473832256449, 0.07562473832256449,
      0.06462425084724736, 0.01895223260004381, 0.00044454253777256923,
      4.30614572254361e-12, 4.30614572254361e-12, 4.30614572254361e-12,
      4.30614572254361e-12, 4.30614572254361e-12, 4.30614572254361e-12,
      4.30614572254361e-12, 4.30614572254361e-12, 4.30614572254361e-12
    ],
    [
      0.018906184580641115, 0.018906184580641115, 0.018906184580641115,
      0.018906184580641115, 0.018906184580641115, 0.018906184580641115,
      0.018906184580641115, 0.018906184580641115, 0.018906184580641115,
      0.0220803196934442, 0.01266825453078567, 0.00037372496610447927,
      1.076536430521385e-12, 1.076536430521385e-12,
      1.076536430521385e-12, 1.076536430521385e-12,
      1.076536430521385e-12, 1.076536430521385e-12,
      1.076536430521385e-12, 1.076536430521385e-12,
      1.076536430521385e-12
    ],
    [
      1.1803686644254785e-33, 1.1803686644254785e-33,
      1.1803686644254785e-33, 1.1803686644254785e-33,
      1.1803686644254785e-33, 1.1803686644254785e-33,
      1.1803686644254785e-33, 1.1803686644254785e-33,
      1.1803686644254785e-33, 0.0002943113132956006,
      0.006328039169602558, 0.0002943113132955992,
      3.3162226667577625e-34, 3.3162226667577625e-34,
      3.3162226667577625e-34, 3.3162226667577625e-34,
      3.3162226667577625e-34, 3.3162226667577625e-34,
      3.3162226667577625e-34, 3.3162226667577625e-34,
      3.3162226667577625e-34
    ],
    [
      7.917858911626925e-12, 7.917858911626925e-12,
      7.917858911626925e-12, 7.917858911626925e-12,
      7.917858911626925e-12, 7.917858911626925e-12,
      7.917858911626925e-12, 7.917858911626925e-12,
      7.917858911626925e-12, 0.00021910354044098892,
      0.006811789807004145, 0.010171261482217255, 0.007656698608858587,
      0.007656698608858587, 0.007656698608858587, 0.007656698608858587,
      0.007656698608858587, 0.007656698608858587, 0.007656698608858587,
      0.007656698608858587, 0.007656698608858587
    ],
    [
      3.1671435649607314e-11, 3.1671435649607314e-11,
      3.1671435649607314e-11, 3.1671435649607314e-11,
      3.1671435649607314e-11, 3.1671435649607314e-11,
      3.1671435649607314e-11, 3.1671435649607314e-11,
      3.1671435649607314e-11, 0.00015898704886117,
      0.007702953747350382, 0.026536086581121037, 0.030626794435434364,
      0.030626794435434364, 0.030626794435434364, 0.030626794435434364,
      0.030626794435434364, 0.030626794435434364, 0.030626794435434364,
      0.030626794435434364, 0.030626794435434364
    ],
    [
      7.917858910888631e-12, 7.917858910888631e-12,
      7.917858910888631e-12, 7.917858910888631e-12,
      7.917858910888631e-12, 7.917858910888631e-12,
      7.917858910888631e-12, 7.917858910888631e-12,
      7.917858910888631e-12, 0.00012022808921187036,
      0.00510117784547736, 0.008888471078754729, 0.007656698608858587,
      0.007656698608858587, 0.007656698608858587, 0.007656698608858587,
      0.007656698608858587, 0.007656698608858587, 0.007656698608858587,
      0.007656698608858587, 0.007656698608858587
    ],
    [
      2.8006037159027796e-32, 2.8006037159027796e-32,
      2.8006037159027796e-32, 2.8006037159027796e-32,
      2.8006037159027796e-32, 2.8006037159027796e-32,
      2.8006037159027796e-32, 2.8006037159027796e-32,
      2.8006037159027796e-32, 0.00010704141494701892,
      0.0031868800809066538, 0.00010704141494701863,
      1.5594189661920613e-32, 1.5594189661920613e-32,
      1.5594189661920613e-32, 1.5594189661920613e-32,
      1.5594189661920613e-32, 1.5594189661920613e-32,
      1.5594189661920613e-32, 1.5594189661920613e-32,
      1.5594189661920613e-32
    ]
  ],
  "frequencies": [0.0, 128.0, 256.0, 384.0, 512.0, 640.0, 768.0, 896.0, 1024.0],
  "centers": [
    0.00390625, 0.005859375, 0.0078125, 0.009765625, 0.01171875,
    0.013671875, 0.015625, 0.017578125, 0.01953125, 0.021484375,
    0.0234375, 0.025390625, 0.02734375, 0.029296875, 0.03125,
    0.033203125, 0.03515625, 0.037109375, 0.0390625, 0.041015625,
    0.04296875
  ],
  "shape": [9, 21]
}

Bài 3Thang mel

Tai người phân biệt tần số thấp tốt hơn tần số cao, nên mô hình âm thanh thường gộp phổ theo thang mel: các dải hẹp ở tần số thấp, rộng dần ở tần số cao. Bài này dựng bộ lọc mel kiểu HTK, đổi sang dB, rồi che một vùng theo kiểu SpecAugment khi huấn luyện.

Có ma trận công suất power (K×FK\times F: KK tần số, FF khung) và các tần số frequencies (tăng dần, từ 00).

  1. Thang mel HTK: m(f)=2595log⁡10(1+f/700)m(f)=2595\log_{10}(1+f/700), ngược lại f(m)=700 (10m/2595−1)f(m)=700\,(10^{m/2595}-1).
  2. Lấy M+2M+2 mốc cách đều trên thang mel từ 00 tới m(fmax⁡)m(f_{\max}) (tần số cuối), đổi về Hz: e0<e1<⋯<eM+1e_0<e_1<\dots<e_{M+1}.
  3. Bộ lọc ii (i=0..M−1i=0..M-1) là tam giác có đỉnh bằng 11 tại ei+1e_{i+1}: trọng số tại tần số ff là max⁡ ⁣(0,min⁡(f−eiei+1−ei,ei+2−fei+2−ei+1))\max\!\big(0,\min\big(\tfrac{f-e_i}{e_{i+1}-e_i},\tfrac{e_{i+2}-f}{e_{i+2}-e_{i+1}}\big)\big). Không chuẩn hóa diện tích.
  4. Công suất mel == ma trận bộ lọc nhân power. Log-mel =10log⁡10(max⁡(mel,ε))=10\log_{10}(\max(\text{mel},\varepsilon)).
  5. Nếu training là true: gán fill_db cho các cột (khung) trong time_mask =[a,b)=[a,b) và các hàng (dải mel) trong frequency_mask =[a,b)=[a,b) của log-mel. Nếu false thì không che.

Dữ liệu vào

Mỗi tệp input.json gồm power, frequencies, num_bands, epsilon, training, time_mask, frequency_mask và fill_db.

Kết quả

Một đối tượng JSON gồm filters (M×KM\times K), mel_power (M×FM\times F) và log_mel (M×FM\times F).

Chấm điểm

Có 20 test, mỗi test 5 điểm. Số thực được chấm với sai số khoảng 10−710^{-7}.

Ví dụ

Input mẫu

{
  "power": [
    [
      0.0, 0.0160934218907673, 0.24863377649642798,
      0.24085960568753526, 0.27638875574198934, 0.12823787900437386,
      0.2098010637186374
    ],
    [
      0.0, 0.16066956720595074, 0.05704535098459383,
      0.0728649221385621, 0.2287067805130169, 0.0047792073632989315,
      0.2327090240555335
    ],
    [
      0.0, 0.24478260016070197, 0.018414467975575086,
      0.04407874740930374, 0.025333079674545622, 0.24205544345317082,
      0.24617735348083278
    ],
    [
      0.0, 0.08478781291788427, 0.24140034645186864,
      0.22317662428930365, 0.12192449712039813, 0.22216526592003277,
      0.2853314685293211
    ],
    [
      0.0, 0.23770226891540702, 0.24699551551322346,
      0.054314383751533954, 0.12268944027433815, 0.29202763806596044,
      0.15888221680215955
    ],
    [
      0.0, 0.24983563772893805, 0.2395983781935675,
      0.20433803924622965, 0.05450899919680857, 0.05832532725414415,
      0.04272830684046135
    ],
    [
      0.0, 0.1455486531609049, 0.11701601094790869,
      0.12019098381408784, 0.2725148613997855, 0.12214432081606746,
      0.19664002677848882
    ],
    [
      0.0, 0.0029280833503202096, 0.23428476746696786,
      0.08500864878180896, 0.08487209486129604, 0.09243168694741187,
      0.1555090215890856
    ],
    [
      0.0, 0.013900807302614792, 0.18792611655782313,
      0.27596017677942364, 0.2363904507461124, 0.18745313136333283,
      0.02377968932875155
    ]
  ],
  "frequencies": [0, 128, 256, 384, 512, 640, 768, 896, 1024],
  "num_bands": 5,
  "epsilon": 1e-08,
  "training": false,
  "time_mask": [1, 3],
  "frequency_mask": [2, 4],
  "fill_db": -80
}

Output mẫu

{
  "filters": [
    [0, 0.8897511794671071, 0, 0, 0, 0, 0, 0, 0],
    [
      0, 0.11024882053289278, 0.9302842643468093, 0.09492132250876847,
      0, 0, 0, 0, 0
    ],
    [
      0, 0, 0.06971573565319071, 0.9050786774912315,
      0.36283640835184594, 0, 0, 0, 0
    ],
    [
      0, 0, 0, 0, 0.6371635916481541, 0.6936479662481062,
      0.07506854941691166, 0, 0
    ],
    [
      0, 0, 0, 0, 0, 0.3063520337518938, 0.9249314505830883,
      0.5322989316899984, 0
    ]
  ],
  "mel_power": [
    [
      0.0, 0.1429559369259643, 0.05075616832165746,
      0.06483165041456455, 0.20349212771358158, 0.004252305388413108,
      0.20705312862605035
    ],
    [
      0.0, 0.2534792027301759, 0.04633391259621838,
      0.07022325716157374, 0.060354852700993805, 0.24679549297550127,
      0.2817548539574163
    ],
    [
      0.0, 0.18005187813874773, 0.30938905022199237,
      0.22477262218328162, 0.1566335727452244, 0.32391037770791403,
      0.3330581163776956
    ],
    [
      0.0, 0.33567933967440694, 0.33235769973611845,
      0.1853683759874715, 0.13644059619741752, 0.23569582034440292,
      0.14563384861535955
    ],
    [
      0.0, 0.21271879825976683, 0.3063427706246572,
      0.21901780783309668, 0.31393383424663557, 0.18004449467285494,
      0.27774573497030247
    ]
  ],
  "log_mel": [
    [
      -80.0, -8.447978037852131, -12.945111710448495,
      -11.882129224536314, -6.9145238720869795, -23.71375553240924,
      -6.839182028106538
    ],
    [
      -80.0, -5.960576675339755, -13.341010249166036,
      -11.535190305458068, -12.192878056571516, -6.0766277573175564,
      -5.501285933696539
    ],
    [
      -80.0, -7.44602344100859, -5.094950607475656, -6.48256587937561,
      -8.051151458840883, -4.895751374820062, -4.774799784458061
    ],
    [
      -80.0, -4.740753878002975, -4.783942554661204,
      -7.319643549034851, -8.65056391546355, -6.276481188649706,
      -8.367376733856167
    ],
    [
      -80.0, -6.721941291863906, -5.13792364115658, -6.595205722410254,
      -5.031618756514717, -7.44620153769254, -5.563526013090908
    ]
  ]
}

Bài 4Khung đặc trưng

Nhiều mô hình tiếng nói (như wav2vec 2.0) không dùng phổ mà đưa thẳng sóng âm qua một chồng conv 1D. Mỗi lớp thu ngắn chuỗi lại. Bài này tính chuỗi còn dài bao nhiêu sau mỗi lớp, và mỗi khung đầu ra “nghe” bao nhiêu mẫu âm thanh.

Mỗi lớp có kernel kk, stride ss, padding pp (đệm pp mẫu mỗi bên). Một chuỗi dài aa qua lớp ấy còn

b=⌊a+2p−ks⌋+1b=\left\lfloor\frac{a+2p-k}{s}\right\rfloor+1

khung, nếu a>0a>0 và a+2p≥ka+2p\ge k; ngược lại còn 00 khung (và mọi lớp sau cũng 00).

Hãy tính:

  • total_stride: tích các stride, tức số mẫu giữa hai khung đầu ra liền nhau.
  • receptive_field: số mẫu đầu vào mà một khung đầu ra phụ thuộc vào. Đi từ lớp đầu: bắt đầu với r=1r=1, J=1J=1; qua mỗi lớp, r←r+(k−1)Jr\leftarrow r+(k-1)J rồi J←J⋅sJ\leftarrow J\cdot s.
  • frame_rate: số khung đầu ra mỗi giây, Fs/total_strideF_s/\text{total\_stride}; và receptive_field_ms: vùng nhìn tính bằng mili giây.
  • Với mỗi độ dài trong input_samples: số khung sau từng lớp.
  • Với mỗi số trong target_frames: số mẫu nhỏ nhất để lớp cuối ra ít nhất chừng ấy khung.

Dữ liệu vào

Một đối tượng JSON gồm layers (mỗi lớp là {"kernel", "stride", "padding"}), sample_rate, input_samples và target_frames.

Kết quả

Một đối tượng JSON gồm total_stride, receptive_field, frame_rate, receptive_field_ms, inputs (với mỗi độ dài là {"samples", "frames_per_layer"}) và min_samples.

Giới hạn

  • Không quá 77 lớp. Đáp số của min_samples không quá 4000040000.

Chấm điểm

Có 20 test, mỗi test 5 điểm. Số thực được chấm với sai số khoảng 10−710^{-7}.

Ví dụ

Input mẫu

{
  "layers": [
    {"kernel": 10, "stride": 5, "padding": 0},
    {"kernel": 3, "stride": 2, "padding": 0},
    {"kernel": 3, "stride": 2, "padding": 0},
    {"kernel": 3, "stride": 2, "padding": 0},
    {"kernel": 3, "stride": 2, "padding": 0},
    {"kernel": 2, "stride": 2, "padding": 0},
    {"kernel": 2, "stride": 2, "padding": 0}
  ],
  "sample_rate": 16000,
  "input_samples": [16000, 8000, 400, 399],
  "target_frames": [1, 50, 100]
}

Output mẫu

{
  "total_stride": 320,
  "receptive_field": 400,
  "frame_rate": 50.0,
  "receptive_field_ms": 25.0,
  "inputs": [
    {
      "samples": 16000,
      "frames_per_layer": [3199, 1599, 799, 399, 199, 99, 49]
    },
    {
      "samples": 8000,
      "frames_per_layer": [1599, 799, 399, 199, 99, 49, 24]
    },
    {"samples": 400, "frames_per_layer": [79, 39, 19, 9, 4, 2, 1]},
    {"samples": 399, "frames_per_layer": [78, 38, 18, 8, 3, 1, 0]}
  ],
  "min_samples": [400, 16080, 32080]
}

Bài 5Trộn nhiễu

Một cách làm giàu dữ liệu âm thanh là trộn thêm tiếng ồn ở một mức SNR (tỉ số tín hiệu trên nhiễu) định trước. Làm sai, tiếng ồn có thể to hơn ý muốn, hoặc tín hiệu trộn vượt quá giới hạn của PCM 16 bit và bị cắt méo.

Tín hiệu sạch ss và nhiễu nn cùng độ dài, giá trị thực (theo thang của PCM đã chia 3276832768). Công suất là trung bình bình phương: PsP_s, PnP_n.

Với mỗi mức SNR (dB) trong snr_db:

  1. Hệ số nhân nhiễu a=PsPn⋅10SNR/10a=\sqrt{\dfrac{P_s}{P_n\cdot10^{\text{SNR}/10}}}, để 10log⁡10PsPan10\log_{10}\dfrac{P_s}{P_{an}} đúng bằng SNR.
  2. Tín hiệu trộn m=s+a nm=s+a\,n.
  3. Báo SNR đạt được (tính lại từ a na\,n), đỉnh max⁡∣m∣\max|m|, và số mẫu bị cắt khi đổi về PCM 16 bit: nhân 3276832768, làm tròn tới số nguyên gần nhất, đếm các giá trị lớn hơn 3276732767 hoặc nhỏ hơn −32768-32768.
  4. safe_gain: hệ số nhân cả tín hiệu trộn để đỉnh không vượt 32767/3276832767/32768, tức min⁡ ⁣(1, 32767/32768max⁡∣m∣)\min\!\big(1,\ \tfrac{32767/32768}{\max|m|}\big).

Dữ liệu vào

Một đối tượng JSON gồm clean, noise (cùng độ dài, nhiễu không toàn 00) và snr_db.

Kết quả

Một đối tượng JSON gồm clean_power, noise_power và mixes: với mỗi mức SNR là {"snr_db", "noise_scale", "achieved_snr_db", "mix", "peak", "clipped", "safe_gain"}.

Giới hạn

  • Không quá 3232 mẫu. Không mẫu nào nằm sát ranh giới làm tròn hay ranh giới cắt.

Chấm điểm

Có 20 test, mỗi test 5 điểm. Số thực được chấm với sai số khoảng 10−710^{-7}.

Ví dụ

Input mẫu

{
  "clean": [
    0.0, 0.3536, 0.5, 0.3536, 0.0, -0.3536, -0.5, -0.3536, -0.0,
    0.3536, 0.5, 0.3536, 0.0, -0.3536, -0.5, -0.3536
  ],
  "noise": [
    0.1, -0.1, 0.1, -0.1, 0.1, -0.1, 0.1, -0.1, 0.1, -0.1, 0.1, -0.1,
    0.1, -0.1, 0.1, -0.1
  ],
  "snr_db": [20, 10, 0, -5]
}

Output mẫu

{
  "clean_power": 0.12501648,
  "noise_power": 0.010000000000000002,
  "mixes": [
    {
      "snr_db": 20,
      "noise_scale": 0.35357669606465864,
      "achieved_snr_db": 20.0,
      "mix": [
        0.035357669606465865, 0.31824233039353417, 0.5353576696064659,
        0.31824233039353417, 0.035357669606465865, -0.3889576696064659,
        -0.46464233039353414, -0.3889576696064659,
        0.035357669606465865, 0.31824233039353417, 0.5353576696064659,
        0.31824233039353417, 0.035357669606465865, -0.3889576696064659,
        -0.46464233039353414, -0.3889576696064659
      ],
      "peak": 0.5353576696064659,
      "clipped": 0,
      "safe_gain": 1.0
    },
    {
      "snr_db": 10,
      "noise_scale": 1.1181076871214148,
      "achieved_snr_db": 10.0,
      "mix": [
        0.11181076871214149, 0.24178923128785854, 0.6118107687121415,
        0.24178923128785854, 0.11181076871214149, -0.4654107687121415,
        -0.38818923128785854, -0.4654107687121415, 0.11181076871214149,
        0.24178923128785854, 0.6118107687121415, 0.24178923128785854,
        0.11181076871214149, -0.4654107687121415, -0.38818923128785854,
        -0.4654107687121415
      ],
      "peak": 0.6118107687121415,
      "clipped": 0,
      "safe_gain": 1.0
    },
    {
      "snr_db": 0,
      "noise_scale": 3.5357669606465865,
      "achieved_snr_db": -9.643274665532871e-16,
      "mix": [
        0.3535766960646587, 2.330393534133446e-05, 0.8535766960646587,
        2.330393534133446e-05, 0.3535766960646587, -0.7071766960646587,
        -0.1464233039353413, -0.7071766960646587, 0.3535766960646587,
        2.330393534133446e-05, 0.8535766960646587,
        2.330393534133446e-05, 0.3535766960646587, -0.7071766960646587,
        -0.1464233039353413, -0.7071766960646587
      ],
      "peak": 0.8535766960646587,
      "clipped": 0,
      "safe_gain": 1.0
    },
    {
      "snr_db": -5,
      "noise_scale": 6.287581584813727,
      "achieved_snr_db": -5.0,
      "mix": [
        0.6287581584813727, -0.2751581584813727, 1.1287581584813728,
        -0.2751581584813727, 0.6287581584813727, -0.9823581584813728,
        0.12875815848137273, -0.9823581584813728, 0.6287581584813727,
        -0.2751581584813727, 1.1287581584813728, -0.2751581584813727,
        0.6287581584813727, -0.9823581584813728, 0.12875815848137273,
        -0.9823581584813728
      ],
      "peak": 1.1287581584813728,
      "clipped": 2,
      "safe_gain": 0.8859023298376247
    }
  ]
}