1,pyaudio 安装大背景
最近在做智能音箱, 需要编写声音拾取代码, 我先是百度两篇比较常见的用 python 进行录音的操作的文章:
python 写一个录音小程序: http://blog.csdn.net/yexiaohhjk/article/details/73132562
利用百度语言识别 API 实现语音识别 python: http://blog.csdn.net/yexiaohhjk/article/details/73134815
发现需要用到 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 , 发现无用
~ sudo apt-get install portaudio19-dev python-all-dev python3-all-dev
Reading package lists... Done
Building dependency tree
Reading state information... Done
python-all-dev is already the newest version (2.7.14-2ubuntu1).
The following additional packages will be installed:
jackd1 jackd1-firewire libasound2-dev libjack-dev libjack0 libportaudiocpp0 libpython3-all-dev libzita-alsa-pcmi0 libzita-resampler1 python3-all uuid-dev
Suggested packages:
jack-tools meterbridge libasound2-doc portaudio19-doc
The following packages will be REMOVED:
jackd2 jackd2-firewire libjack-jackd2-0
The following NEW packages will be installed:
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
0 upgraded, 13 newly installed, 3 to remove and 5 not upgraded.
Need to get 0 B/798 kB of archives.
After this operation, 2,595 kB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Preconfiguring packages ...
dpkg: warning: files list file for package 'emacsen-common' missing; assuming package has no files currently installed
(Reading database ... 419524 files and directories currently installed.)
Removing jackd2-firewire (1.9.10+20150825git1ed50c92~dfsg-5ubuntu1) ...
dpkg: jackd2: dependency problems, but removing anyway as you requested:
jackd depends on jackd2 | jackd1; however:
Package jackd2 is to be removed.
Package jackd1 is not installed.
Removing jackd2 (1.9.10+20150825git1ed50c92~dfsg-5ubuntu1) ...
dpkg: warning: files list file for package 'emacsen-common' missing; assuming package has no files currently installed
(Reading database ... 419435 files and directories currently installed.)
Preparing to unpack .../jackd1_1%3a0.125.0-2_amd64.deb ...
Unpacking jackd1 (1:0.125.0-2) ...
dpkg: error processing archive /var/cache/apt/archives/jackd1_1%3a0.125.0-2_amd64.deb (--unpack):
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
Errors were encountered while processing:
/var/cache/apt/archives/jackd1_1%3a0.125.0-2_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
~
操作 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 导致有问题, 关闭所有 FQ 的服务, 重启电脑再次安装 OK
(真是费劲呀, 哈哈哈)
之后调用官方的一些
demo
: http://people.csail.mit.edu/hubert/pyaudio/ 运行有效果, 但是有警告 (可以忽略)
4, 官方简单 DEMO
官方一个简单的录音 3S 的 DEMO:
"""PyAudio example: Record a few seconds of audio and save to a WAVE file."""
import pyaudio
import wave
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 8000
RECORD_SECONDS = 3
WAVE_OUTPUT_FILENAME = "output.wav"
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
print("* recording")
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
print("* done recording")
stream.stop_stream()
stream.close()
p.terminate()
wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
官方一个播放上述录制音频的 DEMO:
"""PyAudio Example: Play a WAVE file."""
import pyaudio
import wave
import sys
CHUNK = 1024
if len(sys.argv) < 2:
print("Plays a wave file.\n\nUsage: %s filename.wav" % sys.argv[0])
sys.exit(-1)
wf = wave.open(sys.argv[1], 'rb')
p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True)
data = wf.readframes(CHUNK)
while data != '':
stream.write(data)
data = wf.readframes(CHUNK)
stream.stop_stream()
stream.close()
p.terminate()
参考链接
1. python 写一个录音小程序
2. 利用百度语言识别 API 实现语音识别 python
3. pyaudio 官网
:: 如果您觉得不错, 请推荐给更多人, 帮助他们更快地解决实际问题中的坑~
来源: https://www.cnblogs.com/zjutlitao/p/8411414.html