python - 无法使用python播放音频文件
问题描述
我正在尝试为我的项目创建一个简单的助手。我创建了一个 mp3 文件并使用 gtts 模块保存它。之后,我尝试播放该文件,但无法播放。我尝试了许多不同的模块。我尝试 os.system() 播放 mp3 文件,但它给了我权限被拒绝错误。我在 pycharm 中使用 anaconda 环境来运行我的项目。我在anaconda环境中使用的python版本是3.6。我已经尝试过 pygame 来尝试减少音频文件,但它也没有工作。
下面是我尝试的代码和我得到的错误。
import time
import speech_recognition as sr
from gtts import gTTS
from pydub import AudioSegment
from pydub.playback import play
def playMp3(filename):
mp3file = AudioSegment.from_mp3(filename)
play(mp3file)
def playWav(filename):
wavfile = AudioSegment.from_file(filename)
play(wavfile)
def speak(sentence):
tts = gTTS(text=sentence, lang='en')
filename = './new.wav'
tts.save(filename)
playMp3(filename)
def get_audio():
r = sr.Recognizer()
with sr.Microphone() as source:
r.adjust_for_ambient_noise(source)
print('say something')
audio = r.listen(source)
said = ''
try:
said = r.recognize_google(audio)
print(said)
except Exception as e:
print('Exception: ' + str(e))
return said
# text = get_audio()
# if 'hello' or 'hi' in text:
speak('hello, how are you?')
运行上述代码后,我收到以下错误
ALSA lib conf.c:3723:(snd_config_hooks_call) Cannot open shared library libasound_module_conf_pulse.so (libasound_module_conf_pulse.so: libasound_module_conf_pulse.so: cannot open shared object file: No such file or directory)
ALSA lib control.c:1379:(snd_ctl_open_noupdate) Invalid CTL hw:0
ALSA lib pcm_dsnoop.c:642:(snd_pcm_dsnoop_open) unable to open slave
ALSA lib pcm_dmix.c:1090:(snd_pcm_dmix_open) unable to open slave
ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib dlmisc.c:340:(snd_dlobj_cache_get0) Cannot open shared library libasound_module_pcm_jack.so (libasound_module_pcm_jack.so: libasound_module_pcm_jack.so: cannot open shared object file: No such file or directory)
ALSA lib dlmisc.c:340:(snd_dlobj_cache_get0) Cannot open shared library libasound_module_pcm_jack.so (libasound_module_pcm_jack.so: libasound_module_pcm_jack.so: cannot open shared object file: No such file or directory)
ALSA lib dlmisc.c:340:(snd_dlobj_cache_get0) Cannot open shared library libasound_module_pcm_oss.so (libasound_module_pcm_oss.so: libasound_module_pcm_oss.so: cannot open shared object file: No such file or directory)
ALSA lib dlmisc.c:340:(snd_dlobj_cache_get0) Cannot open shared library libasound_module_pcm_oss.so (libasound_module_pcm_oss.so: libasound_module_pcm_oss.so: cannot open shared object file: No such file or directory)
ALSA lib dlmisc.c:340:(snd_dlobj_cache_get0) Cannot open shared library libasound_module_pcm_pulse.so (libasound_module_pcm_pulse.so: libasound_module_pcm_pulse.so: cannot open shared object file: No such file or directory)
ALSA lib dlmisc.c:340:(snd_dlobj_cache_get0) Cannot open shared library libasound_module_pcm_pulse.so (libasound_module_pcm_pulse.so: libasound_module_pcm_pulse.so: cannot open shared object file: No such file or directory)
ALSA lib dlmisc.c:340:(snd_dlobj_cache_get0) Cannot open shared library libasound_module_pcm_upmix.so (libasound_module_pcm_upmix.so: libasound_module_pcm_upmix.so: cannot open shared object file: No such file or directory)
ALSA lib dlmisc.c:340:(snd_dlobj_cache_get0) Cannot open shared library libasound_module_pcm_upmix.so (libasound_module_pcm_upmix.so: libasound_module_pcm_upmix.so: cannot open shared object file: No such file or directory)
ALSA lib dlmisc.c:340:(snd_dlobj_cache_get0) Cannot open shared library libasound_module_pcm_vdownmix.so (libasound_module_pcm_vdownmix.so: libasound_module_pcm_vdownmix.so: cannot open shared object file: No such file or directory)
ALSA lib dlmisc.c:340:(snd_dlobj_cache_get0) Cannot open shared library libasound_module_pcm_vdownmix.so (libasound_module_pcm_vdownmix.so: libasound_module_pcm_vdownmix.so: cannot open shared object file: No such file or directory)
ALSA lib dlmisc.c:340:(snd_dlobj_cache_get0) Cannot open shared library libasound_module_pcm_usb_stream.so (libasound_module_pcm_usb_stream.so: libasound_module_pcm_usb_stream.so: cannot open shared object file: No such file or directory)
ALSA lib dlmisc.c:340:(snd_dlobj_cache_get0) Cannot open shared library libasound_module_pcm_usb_stream.so (libasound_module_pcm_usb_stream.so: libasound_module_pcm_usb_stream.so: cannot open shared object file: No such file or directory)
ALSA lib pcm_dsnoop.c:642:(snd_pcm_dsnoop_open) unable to open slave
ALSA lib pcm_dmix.c:1090:(snd_pcm_dmix_open) unable to open slave
ALSA lib pcm_dmix.c:1090:(snd_pcm_dmix_open) unable to open slave
Expression 'paInvalidSampleRate' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 2043
Expression 'PaAlsaStreamComponent_InitialConfigure( &self->playback, outParams, self->primeBuffers, hwParamsPlayback, &realSr )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 2717
Expression 'PaAlsaStream_Configure( stream, inputParameters, outputParameters, sampleRate, framesPerBuffer, &inputLatency, &outputLatency, &hostBufferSizeMode )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 2838
Traceback (most recent call last):
File "/home/nabeel/PycharmProjects/EmotionsAgent/PersonalAssistant.py", line 44, in <module>
speak('hello, how are you?')
File "/home/nabeel/PycharmProjects/EmotionsAgent/PersonalAssistant.py", line 24, in speak
playMp3(filename)
File "/home/nabeel/PycharmProjects/EmotionsAgent/PersonalAssistant.py", line 11, in playMp3
play(mp3file)
File "/home/nabeel/anaconda3/envs/EmotionsAgent/lib/python3.8/site-packages/pydub/playback.py", line 67, in play
_play_with_pyaudio(audio_segment)
File "/home/nabeel/anaconda3/envs/EmotionsAgent/lib/python3.8/site-packages/pydub/playback.py", line 26, in _play_with_pyaudio
stream = p.open(format=p.get_format_from_width(seg.sample_width),
File "/home/nabeel/anaconda3/envs/EmotionsAgent/lib/python3.8/site-packages/pyaudio.py", line 750, in open
stream = Stream(self, *args, **kwargs)
File "/home/nabeel/anaconda3/envs/EmotionsAgent/lib/python3.8/site-packages/pyaudio.py", line 441, in __init__
self._stream = pa.open(**arguments)
OSError: [Errno -9997] Invalid sample rate
我运行以下脚本来检查默认采样率并得到以下结果:
from pydub import AudioSegment
from pydub.playback import play
import pyaudio
import sounddevice as sd
pa = pyaudio.PyAudio()
print(pa.get_default_input_device_info())
print(pyaudio.pa.__file__)
samplerates = 32000, 44100.0, 48000, 96000, 128000
device = 0
supported_samplerates = []
for fs in samplerates:
try:
sd.check_output_settings(device=device, samplerate=fs)
except Exception as e:
print(fs, e)
else:
supported_samplerates.append(fs)
print(supported_samplerates)
# import pyglet
#
# song = pyglet.media.load('new.mp3')
# song.play()
# pyglet.app.run()
# pyglet.app.exit()
我得到的上述代码的输出是:
/home/nabeel/anaconda3/envs/EmotionsAgent/bin/python3 /home/nabeel/PycharmProjects/EmotionsAgent/test.py
{'index': 0, 'structVersion': 2, 'name': 'HDA Intel PCH: CX20751/2 Analog (hw:1,0)', 'hostApi': 0, 'maxInputChannels': 2, 'maxOutputChannels': 0, 'defaultLowInputLatency': 0.005804988662131519, 'defaultLowOutputLatency': -1.0, 'defaultHighInputLatency': 0.034829931972789115, 'defaultHighOutputLatency': -1.0, 'defaultSampleRate': 44100.0}
/home/nabeel/anaconda3/envs/EmotionsAgent/lib/python3.8/site-packages/_portaudio.cpython-38-x86_64-linux-gnu.so
32000 Invalid number of channels [PaErrorCode -9998]
44100.0 Invalid number of channels [PaErrorCode -9998]
48000 Invalid number of channels [PaErrorCode -9998]
96000 Invalid number of channels [PaErrorCode -9998]
128000 Invalid number of channels [PaErrorCode -9998]
[]
之后我运行以下命令来检查我的声卡
lspci -knn|grep -iA2 audio
并得到以下结果
00:03.0 Audio device [0403]: Intel Corporation Broadwell-U Audio Controller [8086:160c] (rev 09)
Subsystem: Lenovo Broadwell-U Audio Controller [17aa:390b]
Kernel driver in use: snd_hda_intel
Kernel modules: snd_hda_intel
--
00:1b.0 Audio device [0403]: Intel Corporation Wildcat Point-LP High Definition Audio Controller [8086:9ca0] (rev 03)
Subsystem: Lenovo Wildcat Point-LP High Definition Audio Controller [17aa:390b]
Kernel driver in use: snd_hda_intel
Kernel modules: snd_hda_intel
我还调试了我的代码并进入了 pyaudio.py 文件。它在给出错误的行有一个断点。但是,我真的不知道它是什么。也许我必须在 pyaudio 中手动更改采样率。因为默认采样率为 44100,而在 pyaudio.py 中采样率为 24000。
下面是 self._stream = pa.open(**arguments) 的参数
{'rate':24000,'channels':1,'format':8,'input':False,'output':True,'input_device_index':无,'output_device_index':无,'frames_per_buffer':1024}
对于我的系统信息,我使用的是 ubuntu 20.04,默认的 python 版本是 3.8,但在我的 anaconda 环境中,我使用的是 python 3.6
我在终端中运行了 alsamixer 命令,得到了以下关于声卡的信息
0 HDA Intel HDMI
1 HDA Intel PCH
请帮助我摆脱这种情况。我已经坚持了太久并且一直在寻找它,但似乎找不到解决方案。如果需要有关我的硬件或任何其他配置的更多信息,我可以提供。
解决方案
推荐阅读
- java - Java中的内存使用
- google-apps-script - 左侧转移无效。(第 1 行,“测试”文件)
- php - 测试 Laravel Flash 会话
- testing - Testcafe - useRole 问题 - 需要更简洁的登录方式
- jenkins - 如何使用 Bitbucket Branch Source 插件在 Jenkins 中访问 webhook 请求的正文数据(事件有效负载)?
- symfony - 在匹配 2.2 的版本中找不到包 api-platform/api-pack
- database - 在文本输入中获取的值需要作为参数传递以插入数据库
- jenkins - 如何从 Jenkins 的多分支管道中提取分支名称?
- python - 从子类中调用从父类继承的类方法
- python - 使用 R 和 Python 的自动 arima