

Python 3.x についての質問です。  
マイクに一定以上の入力が一定時間無いと入力を中断し、  
それまでに入力があった音声をスピーカーから出力するプログラムを考えております。  
ですが、入力は受け付けるのですが、出力することが出来ません。  
どなたかお知恵を貸していただけないでしょうか。

[code]

    import pyaudio
    import math
    import struct
    import time
    
    Threshold = 50
    
    SHORT_NORMALIZE = (1.0/32768.0)
    CHUNK = 8192
    FORMAT = pyaudio.paInt16
    CHANNELS = 1
    RATE = 16000
    swidth = 2
    
    TIMEOUT_LENGTH = 1
    
    p=pyaudio.PyAudio()
    
    def rms(frame):
        count = len(frame) / swidth
        format = "%dh" % (count)
        shorts = struct.unpack(format, frame)
    
        sum_squares = 0.0
        for sample in shorts:
            n = sample * SHORT_NORMALIZE
            sum_squares += n * n
        rms = math.pow(sum_squares / count, 0.5)
    
        return rms * 1000
    
    stream=p.open(  format = pyaudio.paInt16,
            channels = 1,
            rate = RATE,
            frames_per_buffer = CHUNK,
            input = True,
            output = True) # inputとoutputを同時にTrueにする
    
    while stream.is_active():
        current = time.time()
        end = time.time() + TIMEOUT_LENGTH
    
        while current <= end:
            data = stream.read(CHUNK)
    
            if rms(data) >= Threshold:
                end = time.time() + TIMEOUT_LENGTH
                print(rms(data))
    
            current = time.time()
            # output = stream.write(data) # ここでならスピーカーから音声が出力される(ここには書きたくない)
            
        output = stream.write(data) # ここでスピーカーから音声を出力したい
    
    stream.stop_stream()
    stream.close()
    p.terminate()
    
    print("Stop Streaming")
    
[/code]


CC BY-SA 4.0
2022-05-19T21:52:59.093
88928
2022-05-28T02:23:24.227
2022-05-20T00:32:52.340
3060
52712
question
python python3
マイクで入力した音声をスピーカーで出力したい


以下はコメント欄に書かれた結果をコミュニティWiki形式の回答としたものです。

* * *

ソースコードを以下のように修正したら想定通りの動きをしました。

[code]

    while stream.is_active():
        current = time.time()
        end = time.time() + TIMEOUT_LENGTH
    
        save_data = [] # 入力データを貯めるため
        while current <= end:
            data = stream.read(CHUNK)
            save_data.append(data) # データを貯める
    
            if rms(data) >= Threshold:
                end = time.time() + TIMEOUT_LENGTH
                print(rms(data))
    
            current = time.time()
    
        # 貯めたデータを出力する
        for data in save_data:
            output = stream.write(data)
    
[/code]


CC BY-SA 4.0
2022-05-27T07:33:07.353
89084
2022-05-28T02:23:24.227
2022-05-28T02:23:24.227
26370
26370
88928
answer