[Python] Python Sounddevice implementation sounds choppy

Discussão em 'Python' iniciado por Stack, Junho 12, 2025.

  1. Stack

    Stack Membro Participativo

    I am currently playing around with the python library sounddevice. Now I have the problem that with the following implementation the sound sounds choppy, as if there was an underflow or clipping. Here is my code:

    from queue import Queue


    class Buffer:
    def __init__(self):
    self.q = Queue()

    def get_q(self):
    return self.q


    from audio.buffer.buffer import Buffer

    import sounddevice as sd


    class Input:
    def __init__(self, input_device):
    self.input_device = input_device
    self.device_settings = sd.query_devices(input_device)
    self.input_stream = sd.InputStream(device=input_device, callback=self.read_data, blocksize=32768, dtype="int16")
    self.buffer = Buffer()

    def read_data(self, indata, frames, time, status):
    if status:
    print(status, flush=True)
    print(f"indata: {indata}")
    self.buffer.get_q().put(indata)

    def start_stream(self):
    self.input_stream.start()

    def stop_stream(self):
    self.input_stream.stop()



    import sounddevice as sd


    class Output:
    def __init__(self, output_device):
    self.output_device = output_device
    self.device_settings = sd.query_devices(output_device)
    self.input_stream = sd.OutputStream(device=output_device, callback=self.write_data, blocksize=32768, dtype="int16")
    self.output_buffer = None

    def write_data(self, outdata, frames, time, status):
    if status:
    print(status, flush=True)
    q = self.output_buffer.get_q()
    if q.empty():
    print("Q empty", flush=True)
    else:
    data = q.get_nowait()
    print(f"outdata: {data}")
    outdata[:] = data

    def start_stream(self, output_buffer):
    self.output_buffer = output_buffer
    self.input_stream.start()

    def stop_stream(self):
    self.input_stream.stop()
    self.output_buffer = None


    from audio.input.input import Input
    from audio.output.output import Output
    import sounddevice as sd


    input1 = Input(2)
    output1 = Output(2)

    input1.start_stream()
    output1.start_stream(input1.buffer)


    Debug output:

    indata: [[ 0 0]
    [ 0 0]
    [ 0 0]
    ...
    [-2 -3]
    [-3 -5]
    [-5 -6]]
    outdata: [[-2 -3]
    [ 2 3]
    [ 3 3]
    ...
    [-2 -3]
    [-3 -5]
    [-5 -6]]
    indata: [[-2 -3]
    [ 2 3]
    [ 3 3]
    ...
    [ 2 2]
    [ 1 0]
    [ 0 1]]
    outdata: [[ 1 2]
    [-1 -1]
    [-6 -7]
    ...
    [ 2 2]
    [ 1 0]
    [ 0 1]]
    Q empty
    indata: [[ 1 2]
    [-1 -1]
    [-6 -7]
    ...
    [ 2 3]
    [ 1 2]
    [ 3 4]]
    indata: [[ 1 2]
    [ 3 4]
    [ 2 1]
    ...
    [-3 -2]
    [-3 -2]
    [ 0 0]]
    outdata: [[-3 -3]
    [-7 -6]
    [-4 -4]
    ...
    [-3 -2]
    [-3 -2]
    [ 0 0]]
    indata: [[-3 -3]
    [-7 -6]
    [-4 -4]
    ...
    [ 4 5]
    [ 4 6]
    [ 4 4]]
    outdata: [[6 6]
    [3 4]
    [5 5]
    ...
    [4 5]
    [4 6]
    [4 4]]
    outdata: [[6 6]
    [3 4]
    [5 5]
    ...
    [4 5]
    [4 6]
    [4 4]]
    indata: [[ 6 6]
    [ 3 4]
    [ 5 5]
    ...
    [-5 -5]
    [-5 -4]
    [-4 -3]]
    indata: [[ -5 -4]
    [ 2 2]
    [ -2 -2]
    ...
    [-4256 -3531]
    [-3562 -270]
    [-5817 -2898]]
    outdata: [[-6996 -4607]
    [-4653 -2403]
    [ -950 288]
    ...
    [-4256 -3531]
    [-3562 -270]
    [-5817 -2898]]
    outdata: [[-6996 -4607]
    [-4653 -2403]
    [ -950 288]
    ...
    [-4256 -3531]
    [-3562 -270]
    [-5817 -2898]]
    indata: [[-6996 -4607]
    [-4653 -2403]
    [ -950 288]
    ...
    [22415 20869]
    [22785 20992]
    [22681 20857]]
    indata: [[ 22843 20948]
    [ 23259 21106]
    [ 23064 20686]
    ...
    [-32411 -24239]
    [-32322 -22860]
    [-32252 -21027]]
    outdata: [[-32166 -19012]
    [-32095 -17178]
    [-32006 -15459]
    ...
    [-32411 -24239]
    [-32322 -22860]
    [-32252 -21027]]
    outdata: [[-32166 -19012]
    [-32095 -17178]
    [-32006 -15459]
    ...
    [-32411 -24239]
    [-32322 -22860]
    [-32252 -21027]]
    indata: [[-32166 -19012]
    [-32095 -17178]
    [-32006 -15459]
    ...
    [ -3367 451]
    [ -4995 -3081]
    [ -6701 -6331]]
    indata: [[ -6691 -8941]
    [ -6266 -10015]
    [ -5759 -10552]
    ...
    [ 14335 13256]
    [ 13517 12118]
    [ 12756 11777]]
    outdata: [[12683 11770]
    [12776 11501]
    [12607 11241]
    ...
    [14335 13256]
    [13517 12118]
    [12756 11777]]
    indata: [[12683 11770]
    [12776 11501]
    [12607 11241]
    ...
    [-1871 -1134]
    [-2522 -886]
    [-3541 -801]]
    outdata: [[-4660 -635]
    [-6320 -998]
    [-7844 -2366]
    ...
    [-1871 -1134]
    [-2522 -886]
    [-3541 -801]]
    outdata: [[-4660 -635]
    [-6320 -998]
    [-7844 -2366]
    ...
    [-1871 -1134]
    [-2522 -886]
    [-3541 -801]]
    indata: [[-4660 -635]
    [-6320 -998]
    [-7844 -2366]
    ...
    [-6790 2150]
    [-7303 2614]
    [-7760 3178]]
    indata: [[-8136 3854]
    [-8446 4600]
    [-8715 5383]
    ...
    [ 973 376]
    [ 941 372]
    [ 914 364]]
    outdata: [[883 355]
    [853 347]
    [821 333]
    ...
    [973 376]
    [941 372]
    [914 364]]
    outdata: [[883 355]
    [853 347]
    [821 333]
    ...
    [973 376]
    [941 372]
    [914 364]]
    indata: [[ 883 355]
    [ 853 347]
    [ 821 333]
    ...
    [ -3 -1137]
    [ 4 -1142]
    [ 17 -1152]]
    indata: [[ 29 -1150]
    [ 37 -1146]
    [ 45 -1143]
    ...
    [ 3967 -2368]
    [ 4042 -2401]
    [ 4111 -2441]]
    outdata: [[ 4185 -2471]
    [ 4262 -2500]
    [ 4338 -2524]
    ...
    [ 3967 -2368]
    [ 4042 -2401]
    [ 4111 -2441]]
    outdata: [[ 4185 -2471]
    [ 4262 -2500]
    [ 4338 -2524]
    ...
    [ 3967 -2368]
    [ 4042 -2401]
    [ 4111 -2441]]
    indata: [[ 4185 -2471]
    [ 4262 -2500]
    [ 4338 -2524]
    ...
    [ 6557 8529]
    [ 6581 8635]
    [ 6606 8742]]
    indata: [[ 6628 8840]
    [ 6656 8941]
    [ 6689 9039]
    ...
    [14234 11089]
    [14141 11118]
    [14049 11147]]
    outdata: [[13961 11176]
    [13878 11204]
    [13798 11231]
    ...
    [14234 11089]
    [14141 11118]
    [14049 11147]]
    outdata: [[13961 11176]
    [13878 11204]
    [13798 11231]
    ...
    [14234 11089]
    [14141 11118]
    [14049 11147]]
    indata: [[13961 11176]
    [13878 11204]
    [13798 11231]
    ...
    [ 3 3]
    [ 4 2]
    [ 4 2]]
    indata: [[ 2 1]
    [-1 -2]
    [-4 -5]
    ...
    [-4 -4]
    [-9 -8]
    [-6 -7]]
    outdata: [[-6 -7]
    [-7 -8]
    [-4 -6]
    ...
    [-4 -4]
    [-9 -8]
    [-6 -7]]
    indata: [[-6 -7]
    [-7 -8]
    [-4 -6]
    ...
    [ 3 3]
    [ 3 3]
    [ 3 4]]
    outdata: [[3 3]
    [3 4]
    [3 3]
    ...
    [3 3]
    [3 3]
    [3 4]]
    outdata: [[3 3]
    [3 4]
    [3 3]
    ...
    [3 3]
    [3 3]
    [3 4]]
    indata: [[ 3 3]
    [ 3 4]
    [ 3 3]
    ...
    [ 0 0]
    [ 4 4]
    [-1 -1]]
    indata: [[-2 -1]
    [-6 -5]
    [-1 0]
    ...
    [ 1 2]
    [ 3 4]
    [ 3 2]]
    outdata: [[2 2]
    [3 3]
    [3 3]
    ...
    [1 2]
    [3 4]
    [3 2]]
    outdata: [[2 2]
    [3 3]
    [3 3]
    ...
    [1 2]
    [3 4]
    [3 2]]
    indata: [[ 2 2]
    [ 3 3]
    [ 3 3]
    ...
    [-6 -7]
    [-4 -4]
    [-2 -2]]
    indata: [[1 0]
    [2 1]
    [3 2]
    ...
    [2 4]
    [2 2]
    [3 3]]
    outdata: [[-2 -1]
    [-3 -3]
    [-4 -3]
    ...
    [ 2 4]
    [ 2 2]
    [ 3 3]]
    outdata: [[-2 -1]
    [-3 -3]
    [-4 -3]
    ...
    [ 2 4]
    [ 2 2]
    [ 3 3]]
    indata: [[-2 -1]
    [-3 -3]
    [-4 -3]
    ...
    [ 1 3]
    [ 2 2]
    [ 1 1]]
    indata: [[ 2 2]
    [ 3 3]
    [ 2 2]
    ...
    [-2 -2]
    [ 0 1]
    [-3 -2]]
    outdata: [[-4 -3]
    [-1 -2]
    [-6 -5]
    ...
    [-2 -2]
    [ 0 1]
    [-3 -2]]
    indata: [[-4 -3]
    [-1 -2]
    [-6 -5]
    ...
    [ 2 2]
    [ 1 1]
    [ 1 1]]



    These repetitions on the outdata is what i mean with the choppy sound.

    I have already tried the following: checked for underflow, checked for clipping, checked for cpu utilisation, checked for suitable samplerates. With the Input to Output Pass-Through example from the sounddevice documentation the whole thing works without any problems.

    Continue reading...

Compartilhe esta Página