代码之家  ›  专栏  ›  技术社区  ›  Luc Angevare

OSX-#include“portaudio.h”1生成错误。错误:命令“/usr/bin/clang”失败,退出状态为1

  •  1
  • Luc Angevare  · 技术社区  · 8 年前

    我正忙于制作语音识别代码,我有:

    from pocketsphinx.pocketsphinx import *
    from sphinxbase.sphinxbase import *
    
    import os
    import pyaudio
    import wave
    import audioop
    from collections import deque
    import time
    import math
    
     class SpeechDetector:
         def __init__(self):
            self.CHUNK = 1024
            self.FORMAT = pyaudio.paInt16
            self.CHANNELS = 1
            self.RATE = 16000
    
            self.SILENCE_LIMIT = 1
            self.PREV_AUDIO = 0.5
    
            self.THRESHOLD = 4500
            self.num_phrases = -1
    
            MODELDIR = "../../tools/pocketsphinx/model"
            DATADIR = "../../tools/pocketsphinx/test/data"
    
            config = Decoder.default_config()
            config.set_string('-hmm', os.path.join(MODELDIR, 'en-us/en-us'))
            config.set_string('-lm', os.path.join(MODELDIR, 'en-us/en-us.lm.bin'))
            config.set_string('-dict', os.path.join(MODELDIR, 'en-us/cmudict-en-us.dict'))
    
            self.decoder = Decoder(config)
    
        def setup_mic(self, num_samples=50):
            print "Getting intensity values from mic."
            p = pyaudio.PyAudio()
            stream = p.open(format=self.FORMAT,
                            channels=self.CHANNELS,
                            rate=self.RATE,
                            input=True,
                            frames_per_buffer=self.CHUNK)
    
            values = [math.sqrt(abs(audioop.avg(stream.read(self.CHUNK), 4)))
                for x in range(num_samples)]
                values = sorted(values, reverse=True)
            r = sum(values[:int(num_samples * 0.2)]) / int(num_samples * 0.2)
            print " Finished "
            print " Average audio intensity is ", r
            stream.close()
            p.terminate()
    
            if r < 3000:
                self.THRESHOLD = 3500
            else:
                self.THRESHOLD = r + 100
    
        def save_speech(self, data, p):
    
            filename = 'output_'+str(int(time.time()))
            data = ''.join(data)
            wf = wave.open(filename + '.wav', 'wb')
            wf.setnchannels(1)
            wf.setsampwidth(p.get_sample_size(pyaudio.paInt16))
            wf.setframerate(16000)
            wf.writeframes(data)
            wf.close()
            return filename + '.wav'
    
    def decode_phrase(self, wav_file):
        self.decoder.start_utt()
        stream = open(wav_file, "rb")
        while True:
            buf = stream.read(1024)
            if buf:
                self.decoder.process_raw(buf, False, False)
                self.decoder.end_utt()
    
                words = []
                [words.append(seg.word) for seg in self.decoder.seg()]
                return words
    
    def run(self):
        self.setup_mic()
    
    p = pyaudio.PyAudio()
    stream = p.open(format=self.FORMAT,
                    channels=self.CHANNELS,
                    rate=self.RATE,
                    input=True,
                    frames_per_buffer=self.CHUNK)
    print "* Mic set up and listening. "
    
    audio2send = []
    cur_data = ''
    rel = self.RATE/self.CHUNK
    slid_win = deque(maxlen=self.SILENCE_LIMIT * rel)
    prev_audio = deque(maxlen=self.PREV_AUDIO * rel)
    started = False
    
    while True:
        cur_data = stream.read(self.CHUNK)
        slid_win.append(math.sqrt(abs(audioop.avg(cur_data, 4))))
    
        if sum([x > self.THRESHOLD for x in slid_win]) > 0:
            if started == False:
                print "Starting recording of phrase"
                started = True
                audio2send.append(cur_data)
           elif started:
               print "Finished recording, decoding phrase"
               filename = self.save_speech(list(prev_audio) + audio2send, p)
                r = self.decode_phrase(filename)
                print "DETECTED: ", r
                os.remove(filename)
    
    stream.close()
    p.terminate()
    
    if __name__ == "__main__":
        sd = SpeechDetector()
        sd.run()
    

    然后我去终端,我做pip安装pyaudio

    #include "portaudio.h"
    
             ^
    1 error generated.
    error: command '/usr/bin/clang' failed with exit status 1
    

    我用的是Macbook和MacOS Sierra 10.12.5版,从2011年开始。我看了每个堆栈溢出页面,但没有任何效果。请帮帮我!

    2 回复  |  直到 8 年前
        1
  •  6
  •   Sanju    8 年前

    在安装pyaudio之前,您需要安装portaudio。使用自制软件安装portaudio

    pyaudio

    苹果Mac OS X

    brew install portaudio 
    pip install pyaudio
    

    如果尚未安装,请下载自制软件。 自制和构建PyAudio还需要安装Xcode的命令行工具(更多信息)。

        2
  •  0
  •   gaozhidf    6 年前

    在我的情况下,安装 pyaudio brew install portaudio .