2014-06-16 154 views
2

我想知道這裏的任何人是否知道如何將NAO機器人音頻傳輸到Python中的遠程模塊,以及您是否有示例。我想直接在筆記本電腦上獲取NAO音頻緩衝區進行處理,因此不需要錄製和scp或其他任何東西。NAO機器人遠程音頻問題

現在我的問題是:aldebaran網站說,爲了遠程接收音頻(在我的筆記本電腦上),我必須編寫一個從ALSoundExtractor繼承的模塊。問題是,這個類沒有包含在python SDK中,所以如果你正在構建一個遠程python程序,你不能從alsoundextractor繼承......我一直被困在這個問題上好幾個星期,它會是真的很好,如果有人可以幫助我。

這樣的想法是與

class AudioClassificationModule(ALSoundExtractor): 

啓動模塊,並有一個函數調用的過程,被自動調用。我得到這個錯誤,但:

NameError: name 'ALSoundExtractor' is not defined 

所以它歸結爲:有人可以說明這應該怎麼做?編寫一個繼承自ALSoundExtractor的python模塊,並且有一個函數'process'來處理音頻?謝謝!!

文檔鏈接:https://community.aldebaran-robotics.com/doc/1-14/naoqi/audio/alaudiodevice-api.html#ALAudioDeviceProxy::subscribe__ssCR

回答

6

這裏的 「小」 樣本

# -*- coding: utf-8 -*- 

########################################################### 
# Retrieve robot audio buffer 
# Syntaxe: 
# python scriptname --pip <ip> --pport <port> 
# 
# --pip <ip>: specify the ip of your robot (without specification it will use the NAO_IP defined some line below 
# 
# Author: Alexandre Mazel 
########################################################### 

NAO_IP = "10.0.252.126" # Romeo on table 
#~ NAO_IP = "10.0.253.99" # Nao Alex Blue 


from optparse import OptionParser 
import naoqi 
import numpy as np 
import time 
import sys 


class SoundReceiverModule(naoqi.ALModule): 
    """ 
    Use this object to get call back from the ALMemory of the naoqi world. 
    Your callback needs to be a method with two parameter (variable name, value). 
    """ 

    def __init__(self, strModuleName, strNaoIp): 
     try: 
      naoqi.ALModule.__init__(self, strModuleName); 
      self.BIND_PYTHON(self.getName(),"callback"); 
      self.strNaoIp = strNaoIp; 
      self.outfile = None; 
      self.aOutfile = [None]*(4-1); # ASSUME max nbr channels = 4 
     except BaseException, err: 
      print("ERR: abcdk.naoqitools.SoundReceiverModule: loading error: %s" % str(err)); 

    # __init__ - end 
    def __del__(self): 
     print("INF: abcdk.SoundReceiverModule.__del__: cleaning everything"); 
     self.stop(); 

    def start(self): 
     audio = naoqi.ALProxy("ALAudioDevice", self.strNaoIp, 9559); 
     nNbrChannelFlag = 0; # ALL_Channels: 0, AL::LEFTCHANNEL: 1, AL::RIGHTCHANNEL: 2; AL::FRONTCHANNEL: 3 or AL::REARCHANNEL: 4. 
     nDeinterleave = 0; 
     nSampleRate = 48000; 
     audio.setClientPreferences(self.getName(), nSampleRate, nNbrChannelFlag, nDeinterleave); # setting same as default generate a bug !?! 
     audio.subscribe(self.getName()); 
     print("INF: SoundReceiver: started!"); 
     # self.processRemote(4, 128, [18,0], "A"*128*4*2); # for local test 

     # on romeo, here's the current order: 
     # 0: right; 1: rear; 2: left; 3: front, 

    def stop(self): 
     print("INF: SoundReceiver: stopping..."); 
     audio = naoqi.ALProxy("ALAudioDevice", self.strNaoIp, 9559); 
     audio.unsubscribe(self.getName());   
     print("INF: SoundReceiver: stopped!"); 
     if(self.outfile != None): 
      self.outfile.close(); 


    def processRemote(self, nbOfChannels, nbrOfSamplesByChannel, aTimeStamp, buffer): 
     """ 
     This is THE method that receives all the sound buffers from the "ALAudioDevice" module 
     """ 
     #~ print("process!"); 
     #~ print("processRemote: %s, %s, %s, lendata: %s, data0: %s (0x%x), data1: %s (0x%x)" % (nbOfChannels, nbrOfSamplesByChannel, aTimeStamp, len(buffer), buffer[0],ord(buffer[0]),buffer[1],ord(buffer[1]))); 
     #~ print("raw data: "), 
     #~ for i in range(8): 
      #~ print("%s (0x%x), " % (buffer[i],ord(buffer[i]))), 
     #~ print(""); 

     aSoundDataInterlaced = np.fromstring(str(buffer), dtype=np.int16); 
     #~ print("len data: %s " % len(aSoundDataInterlaced)); 
     #~ print("data interlaced: "), 
     #~ for i in range(8): 
      #~ print("%d, " % (aSoundDataInterlaced[i])), 
     #~ print(""); 
     aSoundData = np.reshape(aSoundDataInterlaced, (nbOfChannels, nbrOfSamplesByChannel), 'F'); 
     #~ print("len data: %s " % len(aSoundData)); 
     #~ print("len data 0: %s " % len(aSoundData[0])); 
     if(False): 
      # compute average 
      aAvgValue = np.mean(aSoundData, axis = 1); 
      print("avg: %s" % aAvgValue); 
     if(False): 
      # compute fft 
      nBlockSize = nbrOfSamplesByChannel; 
      signal = aSoundData[0] * np.hanning(nBlockSize); 
      aFft = (np.fft.rfft(signal)/nBlockSize); 
      print aFft; 
     if(False): 
      # compute peak 
      aPeakValue = np.max(aSoundData); 
      if(aPeakValue > 16000): 
       print("Peak: %s" % aPeakValue); 
     if(True): 
      bSaveAll = True; 
      # save to file 
      if(self.outfile == None): 
       strFilenameOut = "/out.raw"; 
       print("INF: Writing sound to '%s'" % strFilenameOut); 
       self.outfile = open(strFilenameOut, "wb"); 
       if(bSaveAll): 
        for nNumChannel in range(1, nbOfChannels): 
         strFilenameOutChan = strFilenameOut.replace(".raw", "_%d.raw"%nNumChannel); 
         self.aOutfile[nNumChannel-1] = open(strFilenameOutChan, "wb"); 
         print("INF: Writing other channel sound to '%s'" % strFilenameOutChan); 

      #~ aSoundDataInterlaced.tofile(self.outfile); # wrote the 4 channels 
      aSoundData[0].tofile(self.outfile); # wrote only one channel 
      #~ print("aTimeStamp: %s" % aTimeStamp); 
      #~ print("data wrotten: "), 
      #~ for i in range(8): 
       #~ print("%d, " % (aSoundData[0][i])), 
      #~ print("");    
      #~ self.stop(); # make naoqi crashes 
      if(bSaveAll): 
       for nNumChannel in range(1, nbOfChannels): 
        aSoundData[nNumChannel].tofile(self.aOutfile[nNumChannel-1]); 


    # processRemote - end 


    def version(self): 
     return "0.6"; 

# SoundReceiver - end 


def main(): 
    """ Main entry point 

    """ 
    parser = OptionParser() 
    parser.add_option("--pip", 
     help="Parent broker port. The IP address or your robot", 
     dest="pip") 
    parser.add_option("--pport", 
     help="Parent broker port. The port NAOqi is listening to", 
     dest="pport", 
     type="int") 
    parser.set_defaults(
     pip=NAO_IP, 
     pport=9559) 

    (opts, args_) = parser.parse_args() 
    pip = opts.pip 
    pport = opts.pport 

    # We need this broker to be able to construct 
    # NAOqi modules and subscribe to other modules 
    # The broker must stay alive until the program exists 
    myBroker = naoqi.ALBroker("myBroker", 
     "0.0.0.0", # listen to anyone 
     0,   # find a free port and use it 
     pip,   # parent broker IP 
     pport)  # parent broker port 


    # Warning: SoundReceiver must be a global variable 
    # The name given to the constructor must be the name of the 
    # variable 
    global SoundReceiver 
    SoundReceiver = SoundReceiverModule("SoundReceiver", pip) 
    SoundReceiver.start() 

    try: 
     while True: 
      time.sleep(1) 
    except KeyboardInterrupt: 
     print 
     print "Interrupted by user, shutting down" 
     myBroker.shutdown() 
     sys.exit(0) 



if __name__ == "__main__": 
    main() 
+0

你是如何發送您的聲音?我正在嘗試使用arecord過程來流式傳輸Nao的音頻,但我不知道實際發生的事情是否正確。我沒有收到接收方的回覆/確認。 – Andy

+0

上面的代碼「要求」NAO通過一些ALAudioDevice回調向我發送一些緩衝區,並接收和粘貼這些塊。你不需要更多的東西。 –