tayler6000 / pyVoIP

Pure python VoIP/SIP/RTP library. Currently supports PCMA, PCMU, and telephone-event

Home Page:https://pypi.org/project/pyVoIP/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

bigger buffer length on read_audio(length=buffer_length, blocking=True)

BRIDGE-AI opened this issue · comments

@tayler6000

I know that default buffer length 160 means read_audio() would returns every 0.02 second.
I want to use 800 as buffer length to process audio on every 0.1 seconds.
So, I tested.

def answer(call):

    idx = 0
    t0 = time.time()

    merge_buffer = []

    try:
        call.answer()

        while call.state == CallState.ANSWERED:
            t1 = time.time()
            stream = call.read_audio(length=800, blocking=True)
            gap = time.time() - t1
            print(f"{idx + 1} gap:{gap}, stream[{len(stream)}]:{stream[:10]}, merge[{len(merge_buffer)}]")

            merge_buffer.extend(stream)

            idx += 1

        call.hangup()
    except InvalidStateError as error:
        pass
    except Exception as error:
        print(f"Exception:{error}")
        traceback.print_exc()
        call.hangup()

    elapsed = time.time() - t0
    print(f"elapsed:{elapsed:0.4f}")

    wav = wave.open(f"{__file__.split('.')[0]}.wav", 'wb')
    wav.setparams((1, 8 // 8, 8000, 0, 'NONE', 'NONE'))
    wav.writeframesraw(bytes(merge_buffer))
    wav.close()

But I've got a little strange audio below.

I recorded 3.2635 seconds, but this audio has about 14.5seconds length.
And I can find silences in between on the waveform image.
I said just 'hello'.

image

And read_audio() returns in about 0.02 seconds but stream has 800 samples.
It should be 0.1 if it is correct what I understood.
But all the gap values are about 0.02. (like buffer_size 160 case)

$ python t_readaudio_gap.py
Press enter to disable the phone1 gap:0.07068443298339844, stream[800]:b'\x80\x7f\x7f\x7f\x7f\x80\x80\x80\x7f\x7f', merge[0]
2 gap:0.020250797271728516, stream[800]:b'\x7f\x7f\x7f\x7f\x80\x80\x80\x7f\x7f\x80', merge[800]
3 gap:0.020186662673950195, stream[800]:b'\x7f\x7f\x80\x80\x80\x80\x7f\x7f\x7f\x80', merge[1600]
4 gap:0.03041696548461914, stream[800]:b'\x80\x7f\x7f\x7f\x80\x80\x80\x7f\x7f\x7f', merge[2400]
5 gap:0.020616531372070312, stream[800]:b'\x80\x80\x7f\x7f\x80\x80\x80\x80\x7f\x7f', merge[3200]
6 gap:0.020222902297973633, stream[800]:b'\x80\x80\x80\x80\x80\x7f\x80\x80\x80\x80', merge[4000]
7 gap:0.02021622657775879, stream[800]:b'\x7f\x80\x7f\x7f\x7f\x80\x80\x80\x7f\x7f', merge[4800]
8 gap:0.020152568817138672, stream[800]:b'\x80\x7f\x7f\x80\x80\x80\x7f\x7f\x80\x80', merge[5600]
9 gap:0.02018570899963379, stream[800]:b'\x80\x80\x7f\x80\x80\x80\x80\x7f\x7f\x80', merge[6400]
...
140 gap:0.02017354965209961, stream[800]:b'\x80\x80\x7f\x80\x80\x7f\x80\x7f\x7f\x7f', merge[111200]
141 gap:0.020185470581054688, stream[800]:b'\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80', merge[112000]
142 gap:0.020245075225830078, stream[800]:b'\x7f\x7f\x80\x7f\x80\x80\x80\x80\x7f\x80', merge[112800]
143 gap:0.020184993743896484, stream[800]:b'\x80\x80\x80\x7f\x7f\x7f\x7f\x80\x80\x80', merge[113600]
144 gap:0.020239830017089844, stream[800]:b'\x7f\x80\x80\x80\x80\x80\x80\x80\x80\x80', merge[114400]
145 gap:0.020179271697998047, stream[800]:b'\x80\x7f\x80\x80\x7f\x7f\x80\x80\x80\x80', merge[115200]
146 gap:0.3065614700317383, stream[800]:b'\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80', merge[116000]
elapsed:3.2635

Below is normal output when I set buffer_size to 160.

It looks great.

image

$ python t_readaudio_gap.py
Press enter to disable the phone1 gap:0.06058979034423828, stream[160]:b'\x83\x83\x82\x82\x82\x82\x7f\x7f\x7f\x7f', merge[0]
2 gap:0.020170211791992188, stream[160]:b'\x80\x80\x80\x80\x7f\x80\x80\x80\x80\x80', merge[160]
3 gap:0.020174741744995117, stream[160]:b'\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80', merge[320]
4 gap:0.020209550857543945, stream[160]:b'\x80\x80\x80\x80\x80\x80\x7f\x80\x80\x80', merge[480]
5 gap:0.020265817642211914, stream[160]:b'\x80\x7f\x80\x80\x80\x80\x80\x80\x80\x80', merge[640]
6 gap:0.010126352310180664, stream[160]:b'\x80\x80\x80\x80\x80\x7f\x80\x80\x80\x80', merge[800]
7 gap:0.020278453826904297, stream[160]:b'\x7f\x80\x80\x7f\x80\x80\x80\x80\x80\x80', merge[960]
8 gap:0.03040003776550293, stream[160]:b'\x80\x80\x7f\x80\x7f\x80\x80\x80\x80\x80', merge[1120]
9 gap:0.010085344314575195, stream[160]:b'\x80\x80\x80\x80\x80\x7f\x80\x80\x80\x80', merge[1280]
10 gap:0.02016758918762207, stream[160]:b'\x80\x80\x80\x80\x7f\x80\x80\x80\x80\x80', merge[1440]
11 gap:0.020229339599609375, stream[160]:b'\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80', merge[1600]
12 gap:0.020708322525024414, stream[160]:b'\x80\x7f\x80\x80\x80\x80\x80\x80\x80\x80', merge[1760]
13 gap:0.020191431045532227, stream[160]:b'\x80\x80\x80\x80\x80\x7f\x80\x7f\x80\x80', merge[1920]
14 gap:0.020172119140625, stream[160]:b'\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80', merge[2080]
15 gap:0.020184755325317383, stream[160]:b'\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80', merge[2240]
...
161 gap:0.020198583602905273, stream[160]:b'\x80\x7f\x80\x80\x80\x80\x80\x80\x80\x80', merge[25600]
162 gap:0.020185470581054688, stream[160]:b'\x7f\x80\x80\x80\x80\x80\x80\x80\x80\x7f', merge[25760]
163 gap:0.020391464233398438, stream[160]:b'\x80\x80\x7f\x80\x80\x80\x80\x80\x80\x80', merge[25920]
164 gap:0.021258831024169922, stream[160]:b'\x82\x82\x82\x82\x82\x82\x82\x82\x81\x81', merge[26080]
165 gap:0.568103551864624, stream[160]:b'\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80', merge[26240]
elapsed:3.8894

@tayler6000
Please can you check this out?

buffer_size160.wav.zip
buffer_size800.wav.zip

I've tested this on pyVoIP 1.6.8.

@tayler6000

I'm on testing and found that I can use buffer size 800 with blocking=False and sleep(proper seconds) like below.

            stream = call.read_audio(length=buffer_length, blocking=False)

            ...

            time.sleep(1 / (8000 / buffer_length))