Сценарий Python объединяет два файла WAV вместо того, чтобы отменить общие амплитуды между ними - PullRequest
0 голосов
/ 15 мая 2018

Мы разработали код, который записывает два wav-файла: 1. Записывает окружающий шум 2. Записывает окружающий шум с помощью голоса

Затем мы будем использовать эти два wav-файла в качестве входных данных для нашего третьего определения.функция, которая вычитает wav-файл окружающего шума из окружающего шума с помощью голоса.Единственная проблема заключается в том, что когда мы запускаем скрипт и вызываем функцию combination(), результирующий файл wav объединяет два предыдущих файла wav.Наша цель - получить выходной сигнал, при котором окружающий шум будет уменьшен, а голос будет слышен громче, чем он.Вот наш скрипт ниже:

import pyaudio
import wave
import matplotlib.pyplot as plt
import numpy as np
import scipy.io.wavfile
import scipy.signal as sp

def ambient():
    FORMAT = pyaudio.paInt16
    CHANNELS = 2
    RATE = 44100
    CHUNK = 1024
    RECORD_SECONDS = 5
    WAVE_OUTPUT_FILENAME = "ambientnoise.wav"

    audio = pyaudio.PyAudio()

    # start Recording
    stream = audio.open(format=FORMAT, channels=CHANNELS,
                        rate=RATE, input=True,
                        frames_per_buffer=CHUNK)
    print ("recording...")
    frames = []

    for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
        data = stream.read(CHUNK)
        frames.append(data)
    print ("finished recording")

        # stop Recording
    stream.stop_stream()
    stream.close()
    audio.terminate()

    waveFile = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
    waveFile.setnchannels(CHANNELS)
    waveFile.setsampwidth(audio.get_sample_size(FORMAT))
    waveFile.setframerate(RATE)
    waveFile.writeframes(b''.join(frames))
    waveFile.close()

    x = scipy.io.wavfile.read('ambientnoise.wav')
    n = x[1]
    y = np.zeros(n.shape)
    y = n.cumsum(axis=0)

    times = np.linspace(0, len(n), len(n))
    plt.title("Plot 261 $speech1.wav\n $Secades, M.F.\spadesuit SIGNLAB \spadesuit 6Feb2018$")
    plt.xlabel("n")
    plt.ylabel("$speech1.wav$")
    plt.plot(times,n)
    plt.show()

def voice():
    FORMAT = pyaudio.paInt16
    CHANNELS = 2
    RATE = 44100
    CHUNK = 1024
    RECORD_SECONDS = 5
    WAVE_OUTPUT_FILENAME = "ambientwithvoice.wav"

    audio = pyaudio.PyAudio()

    # start Recording
    stream = audio.open(format=FORMAT, channels=CHANNELS,
                        rate=RATE, input=True,
                        frames_per_buffer=CHUNK)
    print ("recording...")
    frames = []

    for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
        data = stream.read(CHUNK)
        frames.append(data)
    print ("finished recording")

        # stop Recording
    stream.stop_stream()
    stream.close()
    audio.terminate()

    waveFile = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
    waveFile.setnchannels(CHANNELS)
    waveFile.setsampwidth(audio.get_sample_size(FORMAT))
    waveFile.setframerate(RATE)
    waveFile.writeframes(b''.join(frames))
    waveFile.close()

    x = scipy.io.wavfile.read('ambientwithvoice.wav')
    n = x[1]
    y = np.zeros(n.shape)
    y = n.cumsum(axis=0)

    times = np.linspace(0, len(n), len(n))
    plt.title("Plot 261 $speech1.wav\n $Secades, M.F.\spadesuit SIGNLAB \spadesuit 6Feb2018$")
    plt.xlabel("n")
    plt.ylabel("$speech1.wav$")
    plt.plot(times,n)
    plt.show()

def combination():
    rate1,Data1 = scipy.io.wavfile.read('ambientnoise.wav')
    rate2,Data2 = scipy.io.wavfile.read('ambientwithvoice.wav')
    new_Data = [0]*len(Data1)
    for i in range(0,len(Data1)):
        new_Data[i] = Data2[i] + Data1[i]
    new_Data = np.array(new_Data)
    scipy.io.wavfile.write('filtered.wav', rate1, new_Data)

    x = scipy.io.wavfile.read('ambientwithvoice.wav')
    n = x[1]
    y = np.zeros(n.shape)
    y = n.cumsum(axis=0)

    times = np.linspace(0, len(n), len(n))
    plt.title("Plot 261 $speech1.wav\n $Secades, M.F.\spadesuit SIGNLAB \spadesuit 6Feb2018$")
    plt.xlabel("n")
    plt.ylabel("$speech1.wav$")
    plt.plot(times,n)
    plt.show() 

1 Ответ

0 голосов
/ 16 мая 2018

Мы разработали код, который записывает два файла wav: 1. Записывает окружающий шум 2. Записывает окружающий шум с помощью голоса

Это означает, что во время непрерывного фонового шума на заднем плане делаются две разные записи, одна за другой. Первый записывает только шум, второй также имеет речь.

Чтобы упростить объяснение, давайте предположим, что речь отсутствует (возможно, оратор просто ничего не сказал). Это должно работать аналогично; шум от первой записи следует использовать для уменьшения шума во второй записи - не имеет значения, присутствует ли другой сигнал во второй записи или нет. Мы знаем, что добились успеха, если шум уменьшится.

Ситуация выглядит так: enter image description here

Теперь давайте объединим две записи, либо сложив их, либо вычтя:

enter image description here

Видимо, ни один из подходов не уменьшил шум. Если присмотреться, ситуация ухудшилась: амплитуда шума в результирующем сигнале выше, чем в любой из двух записей!

Чтобы работать, вычитаемый нами сигнал должен быть точной копией шума в речевом сигнале (или, по крайней мере, в разумном приближении). В этом и заключается проблема: мы не знаем шумовой сигнал, потому что каждый раз, когда мы записываем, он выглядит по-разному.

Так что мы можем сделать?

  • Используйте второй микрофон, который записывает шум в то же время , что и речь, но не записывает динамик.

  • Применить знание предметной области (# 1): если вы, например, знаете, что шум находится в другом частотном диапазоне, чем фильтры речевого сигнала, можно уменьшить часть шума.

  • Применить знание предметной области (# 2): если шум предсказуем (например, что-то периодическое, например, вентилятор или двигатель), создайте математическую модель, которая прогнозирует шум и вычтет его из речевого сигнала.

  • Если шум представляет собой «реальный шум» (статистически независимый и широкополосный), такой как гауссовский белый шум, нам в значительной степени не повезло.

...