В настоящее время технология глубокого распознавания подделок голоса достигла определенного прогресса. Исследователи использовали методы машинного и глубокого обучения для разработки серии алгоритмов подделки путем анализа характеристик речевого сигнала.
Однако с постоянным развитием генеративных больших моделей и других технологий синтеза речи точность поддельной речи также постоянно улучшается, что делает задачу идентификации подделки речи все более сложной и сложной.
Эта серия статей начнется с базового хранения речевых данных и подробного анализа. Поскольку в этой серии колонок подробно объясняется содержание глубокого обучения и машинного обучения, обработки аудиоданных и современных моделей классификации речи и моделей кодирования, используемых в современных технологиях. Основное содержание серии статей этого проекта. Подробное содержание этой серии проектов представлено на рисунке ниже:
Я сделаю все возможное, чтобы все поняли и ознакомились с структурой нейронных сетей, обеспечили четкое понимание и плавные выводы, а также постараемся не использовать слишком много математических формул и профессиональных теоретических знаний. Быстро поймите и реализуйте алгоритм в одной статье и овладейте этими знаниями наиболее эффективным способом. Надеюсь, нуждающиеся друзья не пропустят рубрику, заботливо созданную автором.
В предыдущей статье были даны подробные ответы на некоторые типы и эффекты аудиошума, а также на спектральное вычитание (Spectral Вычитание) и адаптивная фильтрация (Адаптивная Фильтрация), далее нам нужно продолжить понимание Шумоподавления. вейвлет-преобразованияи Винеровский В конце фильтр выполняет алгоритм шумоподавления.
Вейвлет-преобразование — это метод, позволяющий одновременно анализировать сигналы во временной и частотной областях. Он использует вейвлет-функции для разложения сигналов в нескольких масштабах и может эффективно фиксировать локальные характеристики и точки мутации сигналов. В приложениях шумоподавления вейвлет-преобразование широко используется для обработки различных типов сигналов, таких как речевые сигналы, изображения, медицинские сигналы и т. д.
Выполняя вейвлет-разложение сигнала, можно получить коэффициенты аппроксимации и коэффициенты детализации в разных масштабах.
Выполните пороговую обработку коэффициентов детализации, чтобы удалить шум. Распространенными методами пороговой обработки являются:
Жесткая установка порога — это простой метод установки нуля, в то время как мягкая установка порога «сжимает» вейвлет-коэффициенты, превышающие порог, то есть вычитая порог, так что кривая ввода-вывода становится непрерывной. При выборе порогов люди обычно используют мягкие пороги.
Улучшенный порог представляет собой компромисс между жестким порогом и мягким порогом, то есть, когда вейвлет-коэффициент меньше порога, он не просто устанавливается на ноль, а плавно снижается до нуля. Когда он больше порога, амплитуда. вейвлет-коэффициента снижается. Перейти к порогу. Таким образом, обеспечиваются как большие вейвлет-коэффициенты, так и плавный переход коэффициентов после пороговой обработки.
В процессе шумоподавления вейвлет-преобразованием решающее значение имеет выбор порога, который напрямую влияет на эффект шумоподавления. Обычно используемые методы выбора порога включают универсальный порог и адаптивный порог. Логика расчета этих двух методов подробно представлена ниже.
Универсальный порог — это простой и эффективный метод выбора порога, предложенный Донохо и Джонстоном. Общий порог рассчитывается следующим образом:
в:
\sigma — стандартное отклонение шума.
sigma = np.median(np.abs(coeffs[-level])) / 0.6745
n длина сигнала.
Метод адаптивного порога (SURE, несмещенная оценка риска Штейна) выбирает порог путем минимизации предполагаемого риска (ошибки). Метод SURE позволяет выбирать пороговые значения отдельно для коэффициентов разных шкал, что делает его более гибким.
Рассчитайте порог для каждой шкалы:Для каждого масштабного коэффициента,Рассчитайте оптимальный порог.
Рассчитать значение SURE:РассчитайтеSUREценить,Выберите порог, который минимизирует значение SURE.
def calculate_sure_threshold(coeff):
n = len(coeff)
sorted_coeff = np.sort(np.abs(coeff))
risks = np.zeros(n)
for i in range(n):
t = sorted_coeff[i]
risk = (n - 2 * (i + 1) + np.sum(np.minimum(coeff**2, t**2))) / n
risks[i] = risk
best_threshold = sorted_coeff[np.argmin(risks)]
return best_threshold
Выполните обратное вейвлет-преобразование на обработанных коэффициентах, чтобы восстановить сигнал. Формула обратного преобразования противоположна формуле разложения и использует обработанные коэффициенты для восстановления сигнала.
# Вейвлет-реконструкция
denoised_signal = pywt.waverec(coeffs_thresh, wavelet)
Общий код шумоподавления:
def wavelet_denoising(signal, wavelet='db1', level=1, thresholding='soft'):
# Вейвлет-разложение
coeffs = pywt.wavedec(signal, wavelet, level=level)
# Рассчитать порог
universal_threshold = calculate_universal_threshold(coeffs)
# Пороговое значение
coeffs_thresh = []
for i, c in enumerate(coeffs):
if i == 0: # Сохранять коэффициенты аппроксимации
coeffs_thresh.append(c)
else:
# использоватьSUREПороговое значение Коэффициент детализации
sure_threshold = calculate_sure_threshold(c)
if thresholding == 'hard':
coeffs_thresh.append(pywt.threshold(c, sure_threshold, mode='hard'))
elif thresholding == 'soft':
coeffs_thresh.append(pywt.threshold(c, sure_threshold, mode='soft'))
# Вейвлет-реконструкция
denoised_signal = pywt.waverec(coeffs_thresh, wavelet)
return denoised_signal
def calculate_universal_threshold(coeffs):
# Использовать коэффициент высокочастотной детализации стандартное отклонение шума
sigma = np.median(np.abs(coeffs[-1])) / 0.6745
# Вычислить общий порог
threshold = sigma * np.sqrt(2 * np.log(len(coeffs[-1])))
return threshold
def calculate_sure_threshold(coeff):
n = len(coeff)
if n == 0:
return 0
sorted_coeff = np.sort(np.abs(coeff))
risks = np.zeros(n)
for i in range(n):
t = sorted_coeff[i]
risk = (n - 2 * (i + 1) + np.sum(np.minimum(coeff**2, t**2))) / n
risks[i] = risk
best_threshold = sorted_coeff[np.argmin(risks)]
return best_threshold
Способность шумоподавления аудиоэффекта по-прежнему средняя, и он немного чище, чем исходный звук.
Винеровский фильтр — метод линейной фильтрации, предложенный Норбертом Винером.,Направлен на достижение оценки сигналов с шумоподавлением путем минимизации среднеквадратической ошибки (MSE) между выходным сигналом и полезным сигналом. Фильтрация Винера может применяться как во временной, так и в частотной области.,Это классический метод в области обработки сигналов и изображений.
Основная идея фильтрации Винера заключается в использовании статистических характеристик сигнала и шума для разработки фильтра, минимизирующего среднеквадратическую ошибку между отфильтрованным выходным сигналом и полезным сигналом. Логику алгоритма можно разделить на четыре этапа:
Рассчитать спектральную плотность мощности сигналов и шума:
Рассчитать отражение фильтра Винера частотной области Режим:
Фильтрация и обратное преобразование:
def wiener_filter(noisy_signal, sample_rate, noise_power_spectrum):
# Рассчитайте спектральную плотность мощности наблюдаемого сигнала
f, Pxx = scipy.signal.welch(noisy_signal, sample_rate, nperseg=1024)
# Оцените спектральную плотность мощности сигнала (предполагая, что сигнал шумом не зависит и спектральная плотность мощности шума известна)
signal_power_spectrum = np.maximum(Pxx - noise_power_spectrum, 1e-8)
# Рассчитать отражение фильтра Винера частотной области Режим H_wiener = signal_power_spectrum / (signal_power_spectrum + noise_power_spectrum)
# Преобразование Фурье наблюдаемого сигнала
noisy_signal_fft = np.fft.fft(noisy_signal)
# Интерполяция частотной области фильтров Винера
H_wiener_interp = np.interp(np.fft.fftfreq(len(noisy_signal)), f, H_wiener)
# Примените фильтр Винера для фильтрации в частотной области
filtered_signal_fft = noisy_signal_fft * H_wiener_interp
# Выполните обратное преобразование Фурье на отфильтрованном сигнале
filtered_signal = np.fft.ifft(filtered_signal_fft).real
return filtered_signal
Обязательным условием использования этого алгоритма является расчет спектральной плотности мощности шума. Спектральная плотность мощности шума (PSD) является важным инструментом для описания распределения энергии шумовых сигналов в частотной области. В практических приложениях спектральную плотность мощности шума обычно необходимо оценивать на основе наблюдаемого шумового сигнала. Мы можем оценить спектральную плотность мощности шума с помощью адаптивных методов, статистического анализа или методов, основанных на моделях, что подходит для ситуаций, когда сигнал и шум смешиваются более сложно.
def adaPtive_noisy(file,noise_estimation_duration=1.0):
# Чтение шумных аудиофайлов
noisy_signal, sample_rate = sf.read(file)
# Рассчитайте спектральную плотность мощности зашумленных сигналов с помощью метода Уэлча.
frequencies, Pxx = scipy.signal.welch(noisy_signal, sample_rate, nperseg=10000)
# Оцените спектральную плотность мощности шума
noise_frames = int(noise_estimation_duration * sample_rate / 512)
noise_power_spectrum = np.mean(Pxx[:noise_frames])
# Визуализация спектральной плотности мощности шума
plt.figure()
plt.semilogy(frequencies, noise_power_spectrum)
plt.title('Estimated Noise Power Spectral Density')
plt.xlabel('Frequency [Hz]')
plt.ylabel('Power Spectral Density [V^2/Hz]')
plt.show()
return noise_power_spectrum
Затем путем кодирования сначала реализуются различные алгоритмы шумоподавления. Позже мы можем выполнять небольшие приложения с различными эффектами шумоподавления в соответствии с различными бизнес-сценариями и потребностями, а также использовать их для прямой трансляции аудио и видео или для шумоподавления голоса в реальном времени. эффекты. Итак, в следующей главе мы начнем изучать наиболее важные особенности аудио и соответствующие им значения, как нам следует использовать эти функции и как видеть сквозь WAV-данные эти функции.