ca5
2/4/2014 - 9:24 AM

pyaudioで取得した音量をOSCを使ってデータを送る。 2つのマイクをコールバック関数にIDを返すことで識別している。

pyaudioで取得した音量をOSCを使ってデータを送る。 2つのマイクをコールバック関数にIDを返すことで識別している。

#!python3
# -*- coding: utf-8 -*-

import math
import pyaudio
import time
import argparse
import struct

from pythonosc import osc_message_builder
from pythonosc import udp_client

FORMAT = pyaudio.paInt16
SHORT_NORMALIZE = (1.0/32768.0)
WIDTH = 2
CHANNELS = 2
RATE = 44100

def get_rms(block):
    count = len(block)/2
    format = "%dh"%(count)
    shorts = struct.unpack( format, block )
        
    # iterate over the block.
    sum_squares = 0.0
    for sample in shorts:
        # sample is a signed short in +/- 32768. 
        # normalize it to 1.0
        n = sample * SHORT_NORMALIZE
        sum_squares += n*n
        
    return math.sqrt( sum_squares / count )

class Callback(object):
    def __init__(self, id, client):
        self.osc_id = id
        self.osc_client = client
        
    def callback(self, in_data, frame_count, time_info, status):
        msg = osc_message_builder.OscMessageBuilder(address='/volume')
        msg.add_arg(self.osc_id, arg_type = "i")
        msg.add_arg(get_rms(in_data), arg_type = "f")
        msg = msg.build()
        self.osc_client.send(msg)
        
        return (in_data, pyaudio.paContinue)
    
class MicSender(object):
    def __init__(self):
        pass

    def start(self, id, cbfunc):  
        stream = p.open(format = FORMAT,
                        channels = CHANNELS,
                        rate = RATE,
                        input = True,
                        input_device_index = id,
                        output = True,
                        stream_callback = cbfunc.callback)
        
        stream.start_stream()
        
        while stream.is_active():
            time.sleep(0.1)
            
        stream.stop_stream()
        stream.close()
        

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--ip', default='127.0.0.1', help='This ip of the OSC server')
    parser.add_argument('--port', type=int, default=8002, help='The port the OSC server is listening on')
    args = parser.parse_args()
    
    client = udp_client.UDPClient(args.ip, args.port)
    
    p = pyaudio.PyAudio()
    ms = MicSender()
    ms.start(1, Callback(1, client))
    ms.start(2, Callback(2, client))
    p.terminate()