음성 데이터 강화 및 python 구현 분석

15519 단어 python음성 데이터
개술
오디 오 시간 영역 파형 은 다음 과 같은 특징 을 가지 고 있다.음조,볼 륨,품질.우리 가 데 이 터 를 강화 할 때 작은 변경 만 해서 데이터 와 소스 데이터 에 작은 차이 가 존재 하도록 하 는 것 이 좋 습 니 다.기 존의 데이터 구 조 를 바 꾸 지 않 으 면'더러 운 데이터'가 발생 할 것 입 니 다.오디 오 데 이 터 를 강화 하면 우리 모델 이 과도 한 합병 을 피하 고 더욱 통용 되 는 데 도움 이 될 것 입 니 다.
나 는 음파 에 대한 다음 과 같은 변화 가 유용 하 다 는 것 을 발견 했다.Noise addition(소음 증가),Add reverb(잔향 증가),Time shifting(시간 이동),Pitch shifting(음조 변경)과 Time stretching(시간 스 트 레 칭)이다.
이 장 에서 사용 할 python 라 이브 러 리:
  • matplotlib:그림 그리 기
  • librosa:오디 오 데이터 처리
  • numpy:매트릭스 데이터 처리
  • 먼저 원시 음성 데이터 의 어 보 도와 파형 도 를 그립 니 다.
    
    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)
    인자:
  • a:배열
  • shift:굴 러 가 는 길이
  • axis:굴 러 가 는 차원.0 은 수직 으로 굴 러 가 고 1 은 수평 으로 굴 러 가 며 매개 변 수 는 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 실현 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

    좋은 웹페이지 즐겨찾기