按信噪比 SNR 混合纯净语音和噪声

可以选择 cut 或者 append 模式

SNR_a1.py:

import scipy.io.wavfile as wav
import numpy as np
import scipy


# x1--合并的纯净语音, x2--单个噪声 ,所以 x1 >> x2
def signal_by_db(x1, x2, snr, handle_method):
    from numpy.linalg import norm
    from math import sqrt
    import math

    # target_clean_rms = 0.020
    # x1 = x1 - np.mean(x1)
    # stand_rms = np.sqrt(np.mean(x1))
    #
    # x1 = (target_clean_rms / stand_rms) * x1
    # stand_rms = np.sqrt(np.mean(x1))
    #
    # x2 = x2 - np.mean(x2)
    #
    # x2 = stand_rms / np.sqrt(np.mean(x2)) * x2
    print(x1.shape)
    print(x2.shape)
    x1 = x1.astype(np.int16)
    x2 = x2.astype(np.int16)
    # x2 = x2[:250000]
    l1 = x1.shape[0]
    l2 = x2.shape[0]

    # print(l1)    # 82228
    # print(l2)    #250000

    if l1 != l2:
        print("l1!=l2")
        if handle_method == 'cut':
            ll = min(l1, l2)
            print(l1)
            x1 = x1[:ll]
            x2 = x2[:ll]
        elif handle_method == 'append':
            x2 = x2[:250000]      #让噪声小于纯净语音
            ll = max(l1, l2)
            if l2 < ll:
                x2_total = []
                for i in range(int(l1 // l2) * 2):     # "//"表示整数除法,返回不大于结果的一个最大的整数
                    x2_total.append(x2)                # 添加噪声
                x2_total = np.hstack(x2_total)
                #    x2 = np.append(x2, x2[:l2])

                ll2 = x1.shape[0]

                x2 = x2_total[:ll2]
            print(np.shape(x1))
            print(np.shape(x2))

    x2 = x2 / norm(x2) * norm(x1) / (10.0 ** (0.05 * snr))

    # x2 = math.sqrt(np.sum(np.abs(x1) ** 2)) / math.sqrt((np.sum(np.abs(x2) ** 2)) * (10 ** snr)) * x2
    # x2 = np.sqrt(np.sum(np.abs(x1)**2))/np.sqrt((np.sum(np.abs(x2)**2))*(10**snr))*x2
    # print(np.shape(x1))
    # print(np.shape(x2))
    mix = x1 + x2
    print(mix.shape)
    return mix, x2

def SNR_mixed(snr):
    clean_test = "datasets/timit_clean_selected/timit_clean_selected_test.wav"
    noise = "datasets/noise/NOISEX/factory1.wav"
    sr, clean_test = scipy.io.wavfile.read(clean_test)
    sr, noise= scipy.io.wavfile.read(noise)

    # noisy_factory_test, _ = signal_by_db(clean_test, noise, snr, 'append')
    noisy_factory_test, _ = signal_by_db(clean_test, noise, snr, 'cut')
    noisy_factory_test = np.asarray(noisy_factory_test, dtype=np.int16)
    wav.write("datasets/snr_output/timit_speech_factory_snr%s_test.wav" % snr, sr,
              noisy_factory_test)

# del noisy_factory_test
if __name__ == "__main__":
    snr = 0
    SNR_mixed(snr)

混合多段语音:generate_timit_merged_noisy.py

import os
import glob
import scipy.io.wavfile as wav
import numpy as np
from matplotlib import pyplot as plt
import librosa
import scipy


def makedirs(path):
    if not os.path.exists(path):
        print(" [*] Make directories : {}".format(path))
        os.makedirs(path)

#merge_files_in_a_folder # 合并音频
def merge_files(path_read_folder, path_write_wav_file):
    # files = os.listdir(path_read_folder)
    # print(files)
    merged_signal = []
    for filename in glob.glob(os.path.join(path_read_folder, '*.wav')):
        # print(filename)
        sr, signal = wav.read(filename)
        merged_signal.append(signal)
    merged_signal=np.hstack(merged_signal)      #在水平方向上平铺
    merged_signal = np.asarray(merged_signal, dtype=np.int16)
    wav.write(path_write_wav_file, sr, merged_signal)


def merge_files_n(path_read_folder, path_write_wav_file):
    files = os.listdir(path_read_folder)      #返回指定路径下的文件和文件夹列表
    print(files)
    merged_signal = []
    for file_single in files:                 # files为os.listdir()返回的列表
        file_single_path = path_read_folder + file_single + "/"
        print(file_single_path)
        files = os.listdir(file_single_path)  # 返回指定路径下的文件和文件夹列表
        for file in files:                    # files为os.listdir()返回的列表
            path_n = os.path.join(file_single_path, file)  # 连接两个或更多的路径名
            path_ns = path_n + "/"
            print(path_ns)
            for filename in glob.glob(os.path.join(path_ns, '*.wav')):
                sr, signal = wav.read(filename)
                merged_signal.append(signal)
    print(len(merged_signal))
    merged_signal=np.hstack(merged_signal)      #在水平方向上平铺
    merged_signal = np.asarray(merged_signal, dtype=np.int16)
    wav.write(path_write_wav_file, sr, merged_signal)
    print("merge_files_n completed!")


def SNR(x1, x2):
    from numpy.linalg import norm
    return 20 * np.log10(norm(x1) / norm(x2))

# x1--合并的纯净语音, x2--单个噪声 ,所以 x1 >> x2
def signal_by_db(x1, x2, snr, handle_method):
    from numpy.linalg import norm
    from math import sqrt
    import math

    # target_clean_rms = 0.020
    # x1 = x1 - np.mean(x1)
    # stand_rms = np.sqrt(np.mean(x1))
    #
    # x1 = (target_clean_rms / stand_rms) * x1
    # stand_rms = np.sqrt(np.mean(x1))
    #
    # x2 = x2 - np.mean(x2)
    #
    # x2 = stand_rms / np.sqrt(np.mean(x2)) * x2

    x1 = x1.astype(np.int16)
    x2 = x2.astype(np.int16)
    x2= x2[:250000]
    l1 = x1.shape[0]
    l2 = x2.shape[0]

    # print(l1)    # 82228
    # print(l2)    #250000

    if l1 != l2:
        print("l1!=l2")
        if handle_method == 'cut':
            ll = min(l1, l2)
            x1 = x1[:ll]
            x2 = x2[:ll]
        elif handle_method == 'append':
            ll = max(l1, l2)
            if l2 < ll:
                x2_total = []
                for i in range(int(l1 // l2)*3):
                    x2_total.append(x2)
                x2_total = np.hstack(x2_total)
                #    x2 = np.append(x2, x2[:l2])

                ll2 = x1.shape[0]

                x2 = x2_total[:ll2]
            print(np.shape(x1))
            print(np.shape(x2))

    x2 = x2 / norm(x2) * norm(x1) / (10.0 ** ( 0.05*snr))
    # x2 = math.sqrt(np.sum(np.abs(x1) ** 2)) / math.sqrt((np.sum(np.abs(x2) ** 2)) * (10 ** snr)) * x2
    # x2 = np.sqrt(np.sum(np.abs(x1)**2))/np.sqrt((np.sum(np.abs(x2)**2))*(10**snr))*x2
    # print(np.shape(x1))
    # print(np.shape(x2))
    mix = x1 + x2

    return mix, x2


def generate_noise(x1, x2):
    x1 = x1.astype(np.int16)
    x2 = x2.astype(np.int16)
    l1 = x1.shape[0]
    l2 = x2.shape[0]

    # print(x1.shape)
    # print(x2.shape)

    ll = max(l1, l2)
    x2_total=[]
    for i in range(int(l1 / l2) + 5):
        x2_total.append(x2)
    x2_total = np.hstack(x2_total)
    #    x2 = np.append(x2, x2[:l2])

    ll2 = x1.shape[0]

    x2 = x2_total[:ll2]

    return x2


def generate_noisy_data(path_clean_noise,nSNR):
    sr, clean_train = scipy.io.wavfile.read(path_clean_noise['path_clean_train_wav'])
    sr, clean_test = scipy.io.wavfile.read(path_clean_noise['path_clean_test_wav'])

    sr, noise_white = scipy.io.wavfile.read(path_clean_noise['path_noise_white_wav'])
    sr, noise_factory = scipy.io.wavfile.read(path_clean_noise['path_noise_factory_wav'])
    sr, noise_babble = scipy.io.wavfile.read(path_clean_noise['path_noise_babble_wav'])
    sr, noise_machinegun = scipy.io.wavfile.read(path_clean_noise['path_noise_machinegun_wav'])
    sr, noise_f16 = scipy.io.wavfile.read(path_clean_noise['path_noise_f16_wav'])
    sr, noise_buccaneer = scipy.io.wavfile.read(path_clean_noise['path_noise_buccaneer_wav'])

    for snr in nSNR:
        print("Gernerating Noisy SNR [%s] ................." % snr)

        # noisy_white_train, noise_white_total  = signal_by_db(clean_train, noise_white, snr, 'append')       # return mix, x2
        noisy_factory_train, noise_factory_total = signal_by_db(clean_train, noise_factory, snr, 'append')    # return mix, x2
        noisy_babble_train, noise_babble_total = signal_by_db(clean_train, noise_babble, snr, 'append')       # return mix, x2
        noisy_machinegun_train, noise_machinegun_total = signal_by_db(clean_train, noise_machinegun, snr, 'append')

        #matched noise
        noisy_white_test, _ = signal_by_db(clean_test, noise_white, snr, 'append')
        noisy_factory_test, _ = signal_by_db(clean_test, noise_factory, snr, 'append')
        noisy_babble_test, _ = signal_by_db(clean_test, noise_babble, snr, 'append')
        noisy_machinegun_test, _ = signal_by_db(clean_test, noise_machinegun, snr, 'append')
        #mismatched noise
        noisy_f16_test, _ = signal_by_db(clean_test, noise_f16, snr, 'append')
        noisy_buccaneer_test, _ = signal_by_db(clean_test, noise_buccaneer, snr, 'append')

        # noisy_white_train = np.asarray(noisy_white_train, dtype=np.int16)
        noisy_factory_train = np.asarray(noisy_factory_train, dtype=np.int16)
        noisy_babble_train = np.asarray(noisy_babble_train, dtype=np.int16)
        noisy_machinegun_train = np.asarray(noisy_machinegun_train, dtype=np.int16)

        # noisy_white_test = np.asarray(noisy_white_test, dtype=np.int16)
        noisy_factory_test = np.asarray(noisy_factory_test, dtype=np.int16)
        noisy_babble_test = np.asarray(noisy_babble_test, dtype=np.int16)
        noisy_machinegun_test = np.asarray(noisy_machinegun_test, dtype=np.int16)
        noisy_f16_test = np.asarray(noisy_f16_test, dtype=np.int16)
        noisy_buccaneer_test = np.asarray(noisy_buccaneer_test, dtype=np.int16)


        # noise_white_total = np.asarray(noise_white_total, dtype=np.int16)
        noise_factory_total = np.asarray(noise_factory_total, dtype=np.int16)
        noise_babble_total = np.asarray(noise_babble_total, dtype=np.int16)
        noise_machinegun_total = np.asarray(noise_machinegun_total, dtype=np.int16)


        PATH_ROOT = os.getcwd()
        makedirs(os.path.join(PATH_ROOT, "datasets/timit_noisy_selected/train/"))
        makedirs(os.path.join(PATH_ROOT, "datasets/timit_noisy_selected/test_match/"))
        makedirs(os.path.join(PATH_ROOT, "datasets/timit_noisy_selected/test_mismatch/"))
        makedirs(os.path.join(PATH_ROOT, "datasets/timit_noise_selected/"))

        # wav.write("datasets/timit_noisy/train/timit_noisy_white_snr%s_train.wav"%snr, sr, noisy_white_train)
        wav.write("datasets/timit_noisy_selected/train/timit_noisy_factory_snr%s_train.wav"%snr, sr, noisy_factory_train)  #6种信噪比:0、-5、+5、10、15、20
        wav.write("datasets/timit_noisy_selected/train/timit_noisy_babble_snr%s_train.wav"%snr, sr, noisy_babble_train)
        wav.write("datasets/timit_noisy_selected/train/timit_noisy_machinegun_snr%s_train.wav"%snr, sr, noisy_machinegun_train)

        #matched
        # wav.write("datasets/timit_noisy/test/timit_noisy_white_snr%s_test.wav"%snr, sr, noisy_white_test)
        wav.write("datasets/timit_noisy_selected/test_match/timit_noisy_factory_snr%s_test.wav"%snr, sr, noisy_factory_test)
        wav.write("datasets/timit_noisy_selected/test_match/timit_noisy_babble_snr%s_test.wav"%snr, sr, noisy_babble_test)
        wav.write("datasets/timit_noisy_selected/test_match/timit_noisy_machinegun_snr%s_test.wav"%snr, sr, noisy_machinegun_test)
        #mismatched
        wav.write("datasets/timit_noisy_selected/test_mismatch/timit_noisy_f16_snr%s_test.wav"%snr, sr, noisy_f16_test)
        wav.write("datasets/timit_noisy_selected/test_mismatch/timit_noisy_buccaneer_snr%s_test.wav"%snr, sr, noisy_buccaneer_test)

        # wav.write("datasets/timit_noisy/test/timit_noise_white_snr%s_total.wav"%snr, sr, noise_white_total)
        wav.write("datasets/timit_noise_selected/timit_noise_factory_snr%s_total.wav"%snr, sr, noise_factory_total)
        wav.write("datasets/timit_noise_selected/timit_noise_babble_snr%s_total.wav"%snr, sr, noise_babble_total)
        wav.write("datasets/timit_noise_selected/timit_noise_machinegun_snr%s_total.wav"%snr, sr, noise_machinegun_total)

        # noisy_f16_train = signal_by_db(clean_train, noise_f16, snr, 'append')
        # noisy_buccaneer_train = signal_by_db(clean_train, noise_buccaneer, snr, 'append')
        # noisy_f16_test = signal_by_db(clean_test, noise_f16, snr, 'append')
        # noisy_buccaneer_test = signal_by_db(clean_test, noise_buccaneer, snr, 'append')

        # noise_f16_total
        # noise_buccaneer_total

        # wav.write("datasets/timit_noisy_f16_snr%s_train.wav"%snr, sr, noisy_f16_train)
        # wav.write("datasets/timit_noisy_buccaneer_snr%s_train.wav"%snr, sr, noisy_buccaneer_train)
        # wav.write("datasets/timit_noisy_f16_snr%s_test.wav"%snr, sr, noisy_f16_test)
        # wav.write("datasets/timit_noisy_buccaneer_snr%s_test.wav"%snr, sr, noisy_buccaneer_test)

        del noisy_factory_train, noisy_babble_train, noisy_machinegun_train
        del noisy_factory_test, noisy_babble_test, noisy_machinegun_test
        del noise_factory_total, noise_babble_total, noise_machinegun_total

        # print("Finished generating the Noisy SNR [%s] ................." % snr)


if __name__ == '__main__':
    nSNR = [-5, 0, 5, 10, 15, 20]
    nNoise = 3


    nTrain=len(nSNR)*nNoise
    nTest =len(nSNR)*nNoise

    PATH_ROOT = os.getcwd()
    makedirs(os.path.join(PATH_ROOT, "datasets/timit_clean_selected/train/"))
    makedirs(os.path.join(PATH_ROOT, "datasets/timit_clean_selected/test/"))

    
    # makedirs("datasets/timit_clean/train/")
    # makedirs("datasets/timit_clean/test/")
    # path_read_train_folder    = "datasets/timit_8k_wav/train"
    # path_write_train_wav_file = "datasets/timit_clean/train/timit_clean_train.wav"
    # path_read_test_folder    = "datasets/timit_8k_wav/test"
    # path_write_test_wav_file = "datasets/timit_clean/test/timit_clean_test.wav"

    path_read_train_folder    = "datasets/timit_clean_selected/train/"
    path_write_train_wav_file = "datasets/timit_clean_selected/timit_clean_selected_train.wav"
    path_read_test_folder    = "datasets/timit_clean_selected/test/"
    path_write_test_wav_file = "datasets/timit_clean_selected/timit_clean_selected_test.wav"

    # noise data path
    # factory, babble, machinegun noises from NOISEX-92 DB
    path_noise_white = "datasets/noise/NOISEX/white.wav"
    path_noise_factory = "datasets/noise/NOISEX/factory1.wav"
    path_noise_babble = "datasets/noise/NOISEX/babble.wav"
    path_noise_machinegun = "datasets/noise/NOISEX/machinegun.wav"

    # buccaneer, f16 noises from NOISEX-92 DB and Cafeteria noise from ITU-T recommendation P.501
    # were used additionally for the test in mismatched condition
    path_noise_f16 = "datasets/noise/NOISEX/f16.wav"
    path_noise_buccaneer = "datasets/noise/NOISEX/buccaneer1.wav"


    # merge train, test waves to a wave file each 合并训练集和测试集中的语音
    merge_files_n(path_read_train_folder, path_write_train_wav_file)
    merge_files_n(path_read_test_folder,path_write_test_wav_file)

    path_clean_noise = {'path_clean_train_wav': path_write_train_wav_file,
            'path_clean_test_wav': path_write_test_wav_file,
            'path_noise_white_wav': path_noise_white,
            'path_noise_factory_wav': path_noise_factory,
            'path_noise_babble_wav': path_noise_babble,
            'path_noise_machinegun_wav': path_noise_machinegun,
            'path_noise_f16_wav': path_noise_f16,
            'path_noise_buccaneer_wav': path_noise_buccaneer
            }

    generate_noisy_data(path_clean_noise,nSNR)

    # make size of "clean_train" to size of "len(nSNR)*nNoise"
    sr, clean_train = scipy.io.wavfile.read(path_write_train_wav_file)
    clean_train_list=[]

    for i in range(int(nTrain)):
        clean_train_list.append(clean_train)
    clean_train_list=np.hstack(clean_train_list)

    sr, clean_test = scipy.io.wavfile.read(path_write_test_wav_file)
    clean_test_list=[]

    for i in range(int(nTest)):
        clean_test_list.append(clean_test)
    clean_test_list=np.hstack(clean_test_list)

    #clean total
    clean_train_list = np.asarray(clean_train_list, dtype=np.int16)
    wav.write("datasets/timit_clean_selected_train_total.wav", sr, clean_train_list)
    clean_test_list = np.asarray(clean_test_list, dtype=np.int16)
    wav.write("datasets/timit_clean_selected_test_total.wav", sr, clean_test_list)
    del clean_train_list, clean_test_list

    #noise total ,6种信噪比下的纯净噪声
    path_read_folder    = "datasets/timit_noise_selected/"
    path_write_wav_file = "datasets/timit_noise_selected_total.wav"
    merge_files(path_read_folder, path_write_wav_file)

    #noisy train total ,6种信噪比下的混合语音
    path_read_folder    = "datasets/timit_noisy_selected/train/"
    path_write_wav_file = "datasets/timit_noisy_selected_train_total.wav"
    merge_files(path_read_folder, path_write_wav_file)

    # #matched noisy test total  # 测试
    # path_read_folder    = "datasets/timit_noisy/test_match/"
    # path_write_wav_file = "datasets/timit_noisy_test_matched_total.wav"
    # merge_files(path_read_folder, path_write_wav_file)
    #
    # #mismatched noisy test total   # 测试
    # path_read_folder    = "datasets/timit_noisy/test_mismatch/"
    # path_write_wav_file = "datasets/timit_noisy_test_mismatched_total.wav"
    # merge_files(path_read_folder, path_write_wav_file)

 

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值