Spaces:
Configuration error
Configuration error
| import numpy as np | |
| def a_weight(fs, n_fft, min_db=-80.0): | |
| freq = np.linspace(0, fs // 2, n_fft // 2 + 1) | |
| freq_sq = np.power(freq, 2) | |
| freq_sq[0] = 1.0 | |
| weight = 2.0 + 20.0 * (2 * np.log10(12194) + 2 * np.log10(freq_sq) | |
| - np.log10(freq_sq + 12194 ** 2) | |
| - np.log10(freq_sq + 20.6 ** 2) | |
| - 0.5 * np.log10(freq_sq + 107.7 ** 2) | |
| - 0.5 * np.log10(freq_sq + 737.9 ** 2)) | |
| weight = np.maximum(weight, min_db) | |
| return weight | |
| def compute_gain(sound, fs, min_db=-80.0, mode="A_weighting"): | |
| if fs == 16000: | |
| n_fft = 2048 | |
| elif fs == 44100: | |
| n_fft = 4096 | |
| else: | |
| raise Exception("Invalid fs {}".format(fs)) | |
| stride = n_fft // 2 | |
| gain = [] | |
| for i in range(0, len(sound) - n_fft + 1, stride): | |
| if mode == "RMSE": | |
| g = np.mean(sound[i: i + n_fft] ** 2) | |
| elif mode == "A_weighting": | |
| spec = np.fft.rfft(np.hanning(n_fft + 1)[:-1] * sound[i: i + n_fft]) | |
| power_spec = np.abs(spec) ** 2 | |
| a_weighted_spec = power_spec * np.power(10, a_weight(fs, n_fft) / 10) | |
| g = np.sum(a_weighted_spec) | |
| else: | |
| raise Exception("Invalid mode {}".format(mode)) | |
| gain.append(g) | |
| gain = np.array(gain) | |
| gain = np.maximum(gain, np.power(10, min_db / 10)) | |
| gain_db = 10 * np.log10(gain) | |
| return gain_db | |
| def mix(sound1, sound2, r, fs): | |
| gain1 = np.max(compute_gain(sound1, fs)) # Decibel | |
| gain2 = np.max(compute_gain(sound2, fs)) | |
| t = 1.0 / (1 + np.power(10, (gain1 - gain2) / 20.) * (1 - r) / r) | |
| sound = ((sound1 * t + sound2 * (1 - t)) / np.sqrt(t ** 2 + (1 - t) ** 2)) | |
| return sound |