음성 데이터 강화 및 python 구현 분석
오디 오 시간 영역 파형 은 다음 과 같은 특징 을 가지 고 있다.음조,볼 륨,품질.우리 가 데 이 터 를 강화 할 때 작은 변경 만 해서 데이터 와 소스 데이터 에 작은 차이 가 존재 하도록 하 는 것 이 좋 습 니 다.기 존의 데이터 구 조 를 바 꾸 지 않 으 면'더러 운 데이터'가 발생 할 것 입 니 다.오디 오 데 이 터 를 강화 하면 우리 모델 이 과도 한 합병 을 피하 고 더욱 통용 되 는 데 도움 이 될 것 입 니 다.
나 는 음파 에 대한 다음 과 같은 변화 가 유용 하 다 는 것 을 발견 했다.Noise addition(소음 증가),Add reverb(잔향 증가),Time shifting(시간 이동),Pitch shifting(음조 변경)과 Time stretching(시간 스 트 레 칭)이다.
이 장 에서 사용 할 python 라 이브 러 리:
import librosa
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #
plt.rcParams['axes.unicode_minus'] = False #
fs = 16000
wav_data, _ = librosa.load("./p225_001.wav", sr=fs, mono=True)
# ###########
plt.subplot(2, 2, 1)
plt.title(" ", fontsize=15)
plt.specgram(wav_data, Fs=16000, scale_by_freq=True, sides='default', cmap="jet")
plt.xlabel(' /s', fontsize=15)
plt.ylabel(' /Hz', fontsize=15)
plt.subplot(2, 2, 2)
plt.title(" ", fontsize=15)
time = np.arange(0, len(wav_data)) * (1.0 / fs)
plt.plot(time, wav_data)
plt.xlabel(' /s', fontsize=15)
plt.ylabel(' ', fontsize=15)
plt.tight_layout()
plt.show()
둘째,소음 증가
추 가 된 소음 은 평균 값 이 0 이 고 표준 차 가 1 인 고 스 백 소음 은 두 가지 방법 으로 데 이 터 를 소음 을 낸다.
2.1 첫 번 째:소음 제어 인자
def add_noise1(x, w=0.004):
# w:
output = x + w * np.random.normal(loc=0, scale=1, size=len(x))
return output
Augmentation = add_noise1(x=wav_data, w=0.004)
2.2 두 번 째:소음 비 제어
소음 비의 공식 을 통 해 소음 을 유도 해 내다.
def add_noise2(x, snr):
# snr:
P_signal = np.sum(abs(x) ** 2) / len(x) #
P_noise = P_signal / 10 ** (snr / 10.0) #
return x + np.random.randn(len(x)) * np.sqrt(P_noise)
Augmentation = add_noise2(x=wav_data, snr=50)
혼성
제 가 여기 서 사용 하 는 것 은 Image Source Method(미 러 소스 방법)입 니 다.저 는 두 가지 방법 으로 여러분 에 게 실현 하고 싶 습 니 다.첫 번 째 는 python 라 이브 러 리-Pyroomacoustics를 직접 호출 하여 오디 오 믹스 를 실현 하 는 것 입 니 다.두 번 째 는 공식 에 따라 한 걸음 한 걸음 씩 유도 하여 실현 하 는 것 입 니 다.두 가지 효과 와 마찬가지 로 디 테 일 한 것 을 보고 싶 으 면 두 번 째 방법 을 참고 하 십시오.효 과 를 실현 하고 싶 은 것 은 첫 번 째 방법 만 볼 수 있다.
3.1 방법 1:Pyroomacoustics 오디 오 믹스 실현
우선 Pyroomacoustics 를 설치 해 야 합 니 다.이 라 이브 러 리 는 매우 강하 고 관심 이 있 으 면 다른 API 인터페이스 도 많이 볼 수 있 습 니 다.
pip install Pyroomacoustics
단계:
1.방 만 들 기(방 크기,필요 한 잔향 시간,벽면 재료,허용 되 는 최대 반사 횟수,)
2.방 안에 신호원 만 들 기
3.방 안에 마 이 크 를 놓는다
4.방 충격 응답 만 들 기
5.모 의 음성 전파
# -*- coding:utf-8 -*-
import pyroomacoustics as pra
import numpy as np
import matplotlib.pyplot as plt
import librosa
# 1、
#
rt60_tgt = 0.5 # ,
room_dim = [9, 7.5, 3.5] # 9m x 7.5m x 3.5m ,
# Sabine's ISM (RT60, RIR 60 )
e_absorption, max_order = pra.inverse_sabine(rt60_tgt, room_dim) #
#
# m = pra.Material(energy_absorption="hard_surface") # ,
# max_order = 3
room = pra.ShoeBox(room_dim, fs=16000, materials=pra.Material(e_absorption), max_order=max_order)
# [2.5,3.73,1.76] , 0.3 wav
audio, _ = librosa.load("speech.wav",sr=16000) # source signal
room.add_source([2.5, 3.73, 1.76], signal=audio, delay=0.3)
# 3、
# :(ndim, nmics)
# ,
# [6.3,4.87,1.2] [6.3,4.93,1.2]。
mic_locs = np.c_[
[6.3, 4.87, 1.2], # mic 1
[6.3, 4.93, 1.2], # mic 2
]
room.add_microphone_array(mic_locs) #
# 4、 (Room Impulse Response)
room.compute_rir()
# 5、 , 。 。
room.simulate()
# wav
room.mic_array.to_wav("./guitar_16k_reverb_ISM.wav", norm=True, bitdepth=np.float32,)
#
rt60 = room.measure_rt60()
print("The desired RT60 was {}".format(rt60_tgt))
print("The measured RT60 is {}".format(rt60[1, 0]))
plt.figure()
# RIR. both can also be plotted using room.plot_rir()
rir_1_0 = room.rir[1][0] # mic 1 source 0 RIR
plt.subplot(2, 1, 1)
plt.plot(np.arange(len(rir_1_0)) / room.fs, rir_1_0)
plt.title("The RIR from source 0 to mic 1")
plt.xlabel("Time [s]")
# microphone 1
plt.subplot(2, 1, 2)
plt.plot(np.arange(len(room.mic_array.signals[1, :])) / room.fs, room.mic_array.signals[1, :])
plt.title("Microphone 1 signal")
plt.xlabel("Time [s]")
plt.tight_layout()
plt.show()
room = pra.ShoeBox(
room_dim,
fs=16000,
materials=pra.Material(e_absorption),
max_order=3,
ray_tracing=True,
air_absorption=True,
)
#
room.set_ray_tracing()
room.simulate(reference_mic=0, snr=10) #
3.2 방법 2:Image Source Method 알고리즘 설명
여기 서 알고리즘 과 원 리 를 말 해 야 하 는데,
코드 참조:matlab 버 전:RIR-Generator,python 버 전:rir-generator
미 러 소스 소개:
반사 면 등 효 를 허상 으로 하거나 거울 상 으로 한다.예 를 들 어 하나의 개방 공간 에 평평 한 벽면 이 있 으 면 하나의 음 원 은 같은 효 과 를 가 질 수 있다.열 린 공간 에 양면 수직 으로 평평 한 벽면 이 있 으 면 하나의 음 원 은 4 개 와 같은 효 과 를 가 질 수 있다.동 리 삼면 이면 여덟 개.원리 적 으로 는 그렇지만 폐쇄 된 3 차원 공간 에 서 는 상황 이 좀 복잡 하 다.
일반적으로 집안 의 빈 방 은 어느 정도 직사각형 상자 와 비슷 할 수 있 고 방 의 사 이 즈 를 다음 과 같이 가정 할 수 있다.
요소 의 크기 는 각각 길이 와 너비,높이 를 나타 내 고 사 운 드 소스 의 3 차원 좌 표 는?
마이크 의 3 차원 좌 표 는?
미 러 사 운 드 소스$(i,j,k)$마이크 거리 가 세 좌표 축 에 있 는 위 치 는?
그러면 음 원$(i,j,k)$마이크 거리 는
직통 소리의 도착 지연 시간 에 비해
그 중$c$는 음속 이 고,$r$는 음 원 에서 마이크 까지 의 직선 거리 입 니 다.그러면 잔향 효과 등 효 과 는 서로 다른 지연 신호 의 중첩 이다.즉,잔향 효 과 는 FIR 필터 와 신호원 볼 륨 형식 으로 표시 할 수 있 는데 이 필 터 는 다음 과 같은 형식 으로 쓸 수 있다.
필터 의 추출 계 수 는 거울 면 의 반사 계수 와 거리 와 관련 이 있 으 며,각 면 의 반사 계수 가 다 르 면 형식 이 약간 복잡 하 다.상세 한 코드 는 봐 야 한다RIR-Generator.나 는 여기 서 포전 인 옥 만 만 하고 가장 간단 한 것 을 쓴다.
아 날로 그 이미지 원본:
방 사이즈(m):4 X 4 X 3
음 원 좌표(m):2 X 2 X 0
마이크 좌표(m):2 X 2 X 1.5
잔향 시간(s):0.2
RIR 길이:512
clc;clear;
c = 340; % (m/s)
fs = 16000; % Sample frequency (samples/s)
r = [2 2 1.5]; % [x y z] (m)
s = [2 2 0]; % [x y z] (m)
L = [4 4 3]; % [x y z] (m)
beta = 0.2; % (s)
n = 512; % RIR
h = rir_generator(c, fs, r, s, L, beta, n);
disp(size(h)) % (1,4096)
[speech, fs] = audioread("./test_wav/p225_001.wav");
disp(size(speech)); % (46797,1)
y = conv(speech', h);
disp(length(y))
%
figure('color','w'); %
subplot(3,1,1)
plot(h)
title(" RIR","FontSize",14)
subplot(3,2,3)
plot(speech)
title(" ","FontSize",14)
subplot(3,2,4)
plot(y)
title(" ","FontSize",14)
subplot(3,2,5)
specgram(speech,512,fs,512,256);
title(" ","FontSize",14)
subplot(3,2,6)
specgram(y,512,fs,512,256);
title(" ","FontSize",14)
audiowrite("./test_wav/matlab_p225_001_reverber.wav",y,fs)
4.지정 한 SER 의 잔향 생 성
SER 의 공식 은...
그 중에서 E 는 통계 기대 조작 입 니 다.$s(n)$는 근거리 음성 이 고$d(n)$는 원 격 메아리 입 니 다.
우 리 는 지 정 된 SER 에 따라 잔향 신 호 를 구 해 야 하기 때문에 가 까 운 음성 과 원 격 잔향 은 모두 알 고 있 습 니 다.우 리 는 하나의 계 수 를 구 해서 메아리 신호 의 에너지 크기 를 조정 하고 원 격 잔향 과 곱 하면 우리 가 원 하 는 잔향 음성 을 얻 을 수 있 습 니 다.즉,조 정 된 메아리 신 호 는$kd(n)$입 니 다.
이상 의 공식 에 따라$k$의 값 을 유도 할 수 있 습 니 다.
최종$kd(n)$는 우리 가 원 하 는 지정 한 SER 의 잔향 입 니 다.
def add_echo_ser(near_speech, far_echo, SER):
""" SER
:param near_speech:
:param far_echo:
:param SER: SER
:return: SER
"""
p_near_speech = np.mean(near_speech ** 2) #
p_far_echo = np.mean(far_echo ** 2) #
k = np.sqrt(p_near_speech / (10 ** (SER / 10)) / p_far_echo)
return k * far_echo
파형 변위
음성 파형 이동 은 numpy.roll 함 수 를 사용 하여 shift 거 리 를 오른쪽으로 이동 합 니 다.
numpy.roll(a,shift,axis=None)
인자:
x = np.arange(10)
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print(np.roll(x, 2))
# array([8, 9, 0, 1, 2, 3, 4, 5, 6, 7])
파형 변위 함수:
def time_shift(x, shift):
# shift:
return np.roll(x, int(shift))
Augmentation = time_shift(wav_data, shift=fs//2)
6.파형 스 트 레 칭
음고 에 영향 을 주지 않 고 소리의 속 도 를 바꾸다.이것 은 librosa 의 time 를 사용 할 수 있 습 니 다.stretch 함수 로 구현 합 니 다.
def time_stretch(x, rate):
# rate: ,
# rate > 1
# rate < 1
return librosa.effects.time_stretch(x, rate)
Augmentation = time_stretch(wav_data, rate=2)
7.음고 수정(Pitch Shifting)
음고 수정 은 음고 만 바 꾸 고 음속 에 영향 을 주지 않 는 다.나 는-5 에서 5 사이 의 걸음 수가 더 적합 하 다 는 것 을 발견 했다.
def pitch_shifting(x, sr, n_steps, bins_per_octave=12):
# sr:
# n_steps:
# bins_per_octave: ( )
return librosa.effects.pitch_shift(x, sr, n_steps, bins_per_octave=bins_per_octave)
# ( bins_per_octave 12, )
Augmentation = pitch_shifting(wav_data, sr=fs, n_steps=6, bins_per_octave=12)
# ( bins_per_octave 24, 3 )
Augmentation = pitch_shifting(wav_data, sr=fs, n_steps=3, bins_per_octave=24)
# ( bins_per_octave 12, )
Augmentation = pitch_shifting(wav_data, sr=fs, n_steps=-6, bins_per_octave=12)
통 하지 않 았 다 고 쓰 여 있 지만 가치 가 있 는 코드 가 여기 기록 되 어 있 습 니 다.
py-RIR-Generator(연결 되 지 않 은 이 유 는 window 시스템)gpuRIR(이것 은 내 가 통 했 지만 비교적 큰 계산 자원 이 필요 하 다)github 에 코드 를 찾 으 러 갈 때 반드시'메아리','잔향'을 검색 하지 않 아 도'RIR'을 검색 하면 원 하 는 결 과 를 얻 을 수 있다.
본문 그림 코드:
# Author:
# -*- coding:utf-8 -*-
import matplotlib.pyplot as plt
import librosa
import numpy as np
plt.rcParams['font.sans-serif']=['SimHei'] #
plt.rcParams['axes.unicode_minus']=False #
y1, _ = librosa.load("./speech.wav", sr=16000)
y2, _ = librosa.load("./guitar_16k_reverb_ISM.wav", sr=16000)
plt.subplot(2, 2, 1)
plt.specgram(y1, Fs=16000, scale_by_freq=True, sides='default', cmap="jet")
plt.title(" ", fontsize=13)
plt.xlabel(' /s', fontsize=13)
plt.ylabel(' /Hz', fontsize=13)
plt.subplot(2, 2, 2)
plt.plot(np.arange(len(y1)) / 16000, y1)
plt.title(" ", fontsize=13)
plt.xlabel(' /s', fontsize=13)
plt.ylabel(' ', fontsize=13)
plt.subplot(2, 2, 3)
plt.specgram(y2, Fs=16000, scale_by_freq=True, sides='default', cmap="jet")
plt.title(" ( )", fontsize=13)
plt.xlabel(' /s', fontsize=13)
plt.ylabel(' /Hz', fontsize=13)
plt.subplot(2, 2, 4)
plt.plot(np.arange(len(y2)) / 16000, y2)
plt.title(" ( )", fontsize=13)
plt.xlabel(' /s', fontsize=13)
plt.ylabel(' ', fontsize=13)
plt.tight_layout()
plt.show()
이상 은 음성 데이터 강화 및 python 실현 에 대한 상세 한 내용 을 분석 하 는 것 입 니 다.음성 데이터 강화 python 실현 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.