2

我正尝试通过IBM Watson websockets通过麦克风流式传输音频。我收到以下错误:通过websockets流式传输音频IBM不工作

TypeError: The system cannot find the file specified

我觉得子进程有问题,请帮我解决这个问题/让它工作。

from ws4py.client.threadedclient import WebSocketClient 
import base64, json, ssl, subprocess, threading, time 

class SpeechToTextClient(WebSocketClient): 
    def __init__(self): 
     ws_url = "wss://stream.watsonplatform.net/speech-to-text/api/v1/recognize" 

     username = "81bffb34-906b-4057-becf-72752e14e756" 
     password= "jPwZAMMB5Fwp" 
     auth_string = "%s:%s" % (username, password) 
     base64string= base64.encodestring(auth_string).replace("\n", "") 

     self.listening = False 

     try: 
      WebSocketClient.__init__(self, ws_url, headers=[("Authorization", "Basic %s" % base64string)]) 
      self.connect() 
     except: print("Failed to open WebSocket.") 

    def opened(self): 
     self.send('{"action": "start", "content-type": "audio/l16;rate=16000"}') 
     self.stream_audio_thread = threading.Thread(target=self.stream_audio) 
     self.stream_audio_thread.start() 

    def received_message(self, message): 
     message = json.loads(str(message)) 
     if "state" in message: 
      if message["state"] == "listening": 
       self.listening = True 
     print("Message received: " + str(message)) 

    def stream_audio(self): 
     while not self.listening: 
      time.sleep(0.1) 

     reccmd = ["arecord", "-f", "S16_LE", "-r", "16000", "-t", "raw"] 
     p = subprocess.Popen(reccmd, stdout=subprocess.PIPE) 

     while self.listening: 
      data = p.stdout.read(1024) 

      try: 
       self.send(bytearray(data), binary=True) 
      except ssl.SSLError: 
       pass 

     p.kill() 

    def close_connection(self): 
     self.listening = False 
     self.stream_audio_thread.join() 
     WebSocketClient.close(self) 





if __name__ == "__main__": 

    SpeechToTextClient() 

以下是完整的错误输出:

C:\Python27\python.exe C:/Users/vetle/Desktop/testing_ibm.py 

Message received: {u'state': u'listening'} 
Exception in thread Thread-2: 
Traceback (most recent call last): 
File "C:\Python27\lib\threading.py", line 801, in __bootstrap_inner 
    self.run() 
File "C:\Python27\lib\threading.py", line 754, in run 
self.__target(*self.__args, **self.__kwargs) 
File "C:/Users/vetle/Desktop/testing_ibm.py", line 38, in stream_audio 
p = subprocess.Popen(reccmd, stdout=subprocess.PIPE) 
File "C:\Python27\lib\subprocess.py", line 390, in __init__ 
errread, errwrite) 
File "C:\Python27\lib\subprocess.py", line 640, in _execute_child 
startupinfo) 
WindowsError: [Error 2] The system cannot find the file specified 

回答

3

的arecord是一个Linux工具来记录艾莎框架的音频,它是不会工作在Linux上。您需要使用像pyaudio这样的东西来录制声音。

def stream_audio(self): 
     while not self.listening: 
      time.sleep(0.1) 

     p = pyaudio.PyAudio() 

     stream = p.open(format=pyaudio.paInt16, 
       channels=1, 
       rate=16000, 
       input=True, 
       frames_per_buffer=1024) 

     while self.listening: 
      data = stream.read(2048) 

      try: 
       self.send(bytearray(data), binary=True) 
      except ssl.SSLError: 
       pass 
+0

谢谢,这解决了整个事情!你真了不起。 –