获取音频
只是为了验证问题存在,所以就提供了一个获取音频的方法,就是白嫖了。
根据有道翻译的发音获取到地址:https://dict.youdao.com/dictvoice?le=auto&audio=大家好
import requests
def get_audio_file(text, file_path):
"""
根据文本内容生成音频文件
:param text:
:param file_path:
"""
url = "https://dict.youdao.com/dictvoice?le=auto&audio={}".format(text)
res = requests.get(url)
with open(file_path, 'wb') as f:
f.write(res.content)
播放音频
播放音频通过两种方式,分别通过playsound
和pyaudio
两种库,具体使用哪个看个人爱好,两个在使用过程中都遇到过一点小插曲。
通过playsound播放音频
- 安装
pip install playsound
即可安装 - 代码实现:
def play_sound_by_playsound(file_path):
"""
通过playsound库播放音频文件
:param file_path:
:return:
"""
playsound(file_path)
- 遇到问题
>>> playsound('a.wav')
Error 296 for command:
open a.wav
无法在指定的 MCI 设备上播放指定的文件。文件可能已损坏,或格式不对,或没有此格式的文件处理程序可用。
Error 263 for command:
close a.wav
指定的设备未打开,或不被 MCI 所识别。
Failed to close the file: a.wav
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "D:\Python\Python310\lib\site-packages\playsound.py", line 72, in _playsoundWin
winCommand(u'open {}'.format(sound))
File "D:\Python\Python310\lib\site-packages\playsound.py", line 64, in winCommand
raise PlaysoundException(exceptionMessage)
playsound.PlaysoundException:
Error 296 for command:
open a.wav
无法在指定的 MCI 设备上播放指定的文件。文件可能已损坏,或格式不对,或没有此格式的文件处理程序可用。
- 解决方法
打开异常中指定的对应文件playsound.py
,找到文件中有utf-16
的地方,注释掉对应代码,一共三处,
注释后如下(注意括号的匹配问题):
def winCommand(*command):
bufLen = 600
buf = c_buffer(bufLen)
command = ' '.join(command) # .encode('utf-16') 此处添加注释 L55
errorCode = int(windll.winmm.mciSendStringW(command, buf, bufLen - 1, 0)) # use widestring version of the function
if errorCode:
errorBuffer = c_buffer(bufLen)
windll.winmm.mciGetErrorStringW(errorCode, errorBuffer, bufLen - 1) # use widestring version of the function
exceptionMessage = ('\n Error ' + str(errorCode) + ' for command:')
# '\n ' + command.decode('utf-16') + # 此处添加注释 L61
# '\n ' + errorBuffer.raw.decode('utf-16').rstrip('\0')) # 此处添加注释 L62
logger.error(exceptionMessage)
raise PlaysoundException(exceptionMessage)
return buf.value
再次执行OK了。
通过pyaudio播放
-
安装
pip install pyaudio
-
代码文章来源:https://www.toymoban.com/news/detail-403308.html
def play_sound_by_pyaudio(file_path):
wf = wave.open(file_path, 'rb')
p = pyaudio.PyAudio()
# 打开声音输出流
stream = p.open(format = p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True)
# 写声音输出流到声卡进行播放
while True:
data = wf.readframes(chunk)
if len(data) == 0:
break
stream.write(data)
stream.stop_stream()
stream.close()
p.terminate()
- 遇到问题
wf = wave.open(file_path, 'rb')
File "D:\Python\Python310\lib\wave.py", line 509, in open
return Wave_read(f)
File "D:\Python\Python310\lib\wave.py", line 163, in __init__
self.initfp(f)
File "D:\Python\Python310\lib\wave.py", line 130, in initfp
raise Error('file does not start with RIFF id')
wave.Error: file does not start with RIFF id
Process finished with exit code 1
发现在打开音频文件的时候就已经出错了,别说播放了。文章来源地址https://www.toymoban.com/news/detail-403308.html
- 解决方法
音频文件后缀名改成mp3后,通过ffmpeg
重新转换一下ffmpeg -i a.mp3 a.wav
到了这里,关于python音频播放问题解决方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!