Удалите звук щелчка в потоке pyAudio и в непрерывном потоке с помощью обратного вызова - PullRequest
0 голосов
/ 15 марта 2020

Я попытался использовать PyAudio для своего проекта, и нашел звук щелчка, когда поток остановился. Как убрать звук щелчка? И как сохранить мой выходной поток включенным, даже если нет данных, переданных функции обратного вызова? Например, сейчас я хочу вывести 1 секунду звука 440 Гц, а через 1 секунду я хочу сохранить поток, поэтому, когда я даю другой выходной звук, мне больше не нужно запускать поток снова. Позвольте мне поделиться своим кодом:

import pyaudio
import numpy as np
import time

p = pyaudio.PyAudio()
fs = 44100  # Sampling rate 44.1Khz


class data:
    def __init__(self, data):
        self.data = data

    def get(self):
        # Delete returned frame when the callback's called
        temp = self.data[:1024]
        self.data = self.data[1024:]
        return temp

    def add(self, newData):
        # I want this function to add a new sound frame
        self.data = np.append(self.data, newData)


def callback(in_data, frame_count, time_info, status):
    data = test.get().tobytes()
    return data, pyaudio.paContinue


frames = []
freq = 440
phase = 2 * np.pi * np.arange(fs * 1) * freq / fs  # The phase of a simple sinusoid 1 sec
# lastphase = phase[-1]  # - (int(phase1[-1]/(@*np.pi))*2*np.pi)
sample = np.sin(phase).astype(np.float32)  # Tone with a frequency of 440 Hz
test = data(sample)

stream = p.open(format=pyaudio.paFloat32,
                channels=1,
                rate=fs,
                output=True,
                stream_callback=callback)

stream.start_stream()

# In this part, I want to add 2 more second of sound after the stream start
test.add(sample)
test.add(sample)

while stream.is_active():
    time.sleep(0.1)

stream.stop_stream()
stream.close()

p.terminate()

Результат - всего 1 секунда тона 440 Гц, и я не смог расширить звук. Более того, когда поток закрывается, появляется звук щелчка, поэтому, если я снова запустил начальный поток, весь звук не воспроизводится плавно. Как это побороть?

Примечание: звук щелчка не из-за разрыва. Я уже пытался преодолеть это, но он все еще там.

...