[python] 2、python使用pyaudio進行錄音,及其在python虛擬環境virtualenv中安裝遇到的問題


 

1、pyaudio安裝大背景 

最近在做智能音箱,需要編寫聲音拾取代碼,我先是百度兩篇比較常見的用python進行錄音的操作的文章:

 

發現需要用到pyaudio,然后在其官網找到如何安裝:http://people.csail.mit.edu/hubert/pyaudio/

 

但是,在py虛擬環境中通過pip安裝會報錯,而采用sudo apt-get install python-pyaudio python3-pyaudio安裝沒有報錯,但是在虛擬環境中不行。

注:全局安裝不適用於python虛擬環境中,python虛擬環境和全局環境互不影響。

 

2、解決python虛擬環境中安裝pyaudio走過的坑

坑一:utbutu16.10 安裝pyaudio模塊過程出現錯誤 fatal error: portaudio.h: 沒有那個文件或目錄 error: command 'x86_64-linux-gn

嘗試http://blog.csdn.net/hellodrawing/article/details/60868939,發現沒用

 

坑二:安裝pyaudio找不到portaudio.h的問題

嘗試http://blog.csdn.net/qq_23729557/article/details/78956602,發現無用

 1 ➜  ~  sudo apt-get install portaudio19-dev python-all-dev python3-all-dev
 2 Reading package lists... Done
 3 Building dependency tree       
 4 Reading state information... Done
 5 python-all-dev is already the newest version (2.7.14-2ubuntu1).
 6 The following additional packages will be installed:
 7   jackd1 jackd1-firewire libasound2-dev libjack-dev libjack0 libportaudiocpp0 libpython3-all-dev libzita-alsa-pcmi0 libzita-resampler1 python3-all uuid-dev
 8 Suggested packages:
 9   jack-tools meterbridge libasound2-doc portaudio19-doc
10 The following packages will be REMOVED:
11   jackd2 jackd2-firewire libjack-jackd2-0
12 The following NEW packages will be installed:
13   jackd1 jackd1-firewire libasound2-dev libjack-dev libjack0 libportaudiocpp0 libpython3-all-dev libzita-alsa-pcmi0 libzita-resampler1 portaudio19-dev python3-all python3-all-dev uuid-dev
14 0 upgraded, 13 newly installed, 3 to remove and 5 not upgraded.
15 Need to get 0 B/798 kB of archives.
16 After this operation, 2,595 kB of additional disk space will be used.
17 Do you want to continue? [Y/n] Y
18 Preconfiguring packages ...
19 dpkg: warning: files list file for package 'emacsen-common' missing; assuming package has no files currently installed
20 (Reading database ... 419524 files and directories currently installed.)
21 Removing jackd2-firewire (1.9.10+20150825git1ed50c92~dfsg-5ubuntu1) ...
22 dpkg: jackd2: dependency problems, but removing anyway as you requested:
23  jackd depends on jackd2 | jackd1; however:
24   Package jackd2 is to be removed.
25   Package jackd1 is not installed.
26 
27 Removing jackd2 (1.9.10+20150825git1ed50c92~dfsg-5ubuntu1) ...
28 dpkg: warning: files list file for package 'emacsen-common' missing; assuming package has no files currently installed
29 (Reading database ... 419435 files and directories currently installed.)
30 Preparing to unpack .../jackd1_1%3a0.125.0-2_amd64.deb ...
31 Unpacking jackd1 (1:0.125.0-2) ...
32 dpkg: error processing archive /var/cache/apt/archives/jackd1_1%3a0.125.0-2_amd64.deb (--unpack):
33  trying to overwrite '/usr/lib/x86_64-linux-gnu/libjackserver.so.0', which is also in package libjack-jackd2-0:amd64 1.9.10+20150825git1ed50c92~dfsg-5ubuntu1
34 Errors were encountered while processing:
35  /var/cache/apt/archives/jackd1_1%3a0.125.0-2_amd64.deb
36 E: Sub-process /usr/bin/dpkg returned an error code (1)
37 ➜  ~  
操作log

 

坑三:Installing pyaudio with pip in a virtualenv

嘗試https://stackoverflow.com/questions/35708238/installing-pyaudio-with-pip-in-a-virtualenv,在操作時,安裝一個東西會報錯!!!

 

 3、最終解決方案

  • 首先在virtualenv中安裝pyaudio安裝失敗,搜索下說要先安裝portaudio19-dev

  https://stackoverflow.com/questions/35708238/installing-pyaudio-with-pip-in-a-virtualenv

  • 安裝portaudio19-dev失敗,搜索說缺少依賴(依賴版本不對),因此要安裝sudo apt-get install jackd2

  https://ubuntuforums.org/showthread.php?t=1680154

  • 之后在虛擬環境中安裝(du_tts_stt) ➜ ~ pip install pyaudio,出現因SOCK proxy導致有問題,關閉所有翻牆的服務,重啟電腦再次安裝OK

         

  (真是費勁呀,哈哈哈)

 

之后調用官方的一些demo http://people.csail.mit.edu/hubert/pyaudio/運行有效果,但是有警告(可以忽略)

 

4、官方簡單DEMO

官方一個簡單的錄音3S的DEMO:

 1 """PyAudio example: Record a few seconds of audio and save to a WAVE file."""
 2 
 3 import pyaudio
 4 import wave
 5 
 6 CHUNK = 1024
 7 FORMAT = pyaudio.paInt16
 8 CHANNELS = 1
 9 RATE = 8000
10 RECORD_SECONDS = 3
11 WAVE_OUTPUT_FILENAME = "output.wav"
12 
13 p = pyaudio.PyAudio()
14 
15 stream = p.open(format=FORMAT,
16                 channels=CHANNELS,
17                 rate=RATE,
18                 input=True,
19                 frames_per_buffer=CHUNK)
20 
21 print("* recording")
22 
23 frames = []
24 
25 for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
26     data = stream.read(CHUNK)
27     frames.append(data)
28 
29 print("* done recording")
30 
31 stream.stop_stream()
32 stream.close()
33 p.terminate()
34 
35 wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
36 wf.setnchannels(CHANNELS)
37 wf.setsampwidth(p.get_sample_size(FORMAT))
38 wf.setframerate(RATE)
39 wf.writeframes(b''.join(frames))
40 wf.close()

 

官方一個播放上述錄制音頻的DEMO:

 1 """PyAudio Example: Play a WAVE file."""
 2 
 3 import pyaudio
 4 import wave
 5 import sys
 6 
 7 CHUNK = 1024
 8 
 9 if len(sys.argv) < 2:
10     print("Plays a wave file.\n\nUsage: %s filename.wav" % sys.argv[0])
11     sys.exit(-1)
12 
13 wf = wave.open(sys.argv[1], 'rb')
14 
15 p = pyaudio.PyAudio()
16 
17 stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
18                 channels=wf.getnchannels(),
19                 rate=wf.getframerate(),
20                 output=True)
21 
22 data = wf.readframes(CHUNK)
23 
24 while data != '':
25     stream.write(data)
26     data = wf.readframes(CHUNK)
27 
28 stream.stop_stream()
29 stream.close()
30 
31 p.terminate()

 

 

參考鏈接

 

:: 如果您覺得不錯,請推薦給更多人,幫助他們更快地解決實際問題中的坑~


@beautifulzzzz
智能硬件、物聯網,熱愛技術,關注產品
博客:http://blog.beautifulzzzz.com
園友交流群:414948975


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM