深度学习笔记(5)——playsoud声音播放
文章目录
前言
调试代码需要将NLP领域的模型往计算机视觉迁移,需要跑通NLP代码,用文本转声音模型,为播放声音信号。
一、播放声音信号
1.windows使用playsound库无法播放问题
在windows调用playsound库播放wav文件可能会出现下面的问题
报错内容
Error 305 for command:
close “./infer_out\s1667115101.wav”
在用引号括起的字符串不能指定额外的字符。
Failed to close the file: “./infer_out\s1667115101.wav”
原因是wav文件在windows下的的python的编码格式为utf-8不能以utf-16解码
所以
解决方式
是在playsound的源码第55行
command = ’ '.join(command).encode(‘utf-16’)
改为 command = ’ '.join(command)
以下是代码:ctrl+鼠标左键点击引入的库playsoud进入源码
def winCommand(*command):
bufLen = 600
buf = c_buffer(bufLen)
# command = ' '.join(command).encode('utf-16')
command = ' '.join(command)
2.播放文件夹下所有wav文件代码
from playsound import playsound
# # 播放声音文件
path = './infer_out'
files = os.listdir(path)
files.sort()
print(files)
# 依次播放文件夹下的文件
for i in files:
file = os.path.join(path,i)
print(file)
playsound(file)
二、可视化wav波形
1.文件放置
声音文件wav文件应放到该代码同级目录下的infer_out文件夹下
|——— code.py
|——— infer_out
|——————|—— 1.wav
|——————|—— 2.wav
2.绘制波形图
代码如下:
# 绘图
import os
import wave
import numpy as np
import matplotlib.pyplot as plt
filepath = "infer_out"
wavelist = []
filenames = os.listdir(filepath)
for filename in filenames:
name, category = os.path.splitext(filepath + filename) # 分解文件扩展名
if category == '.wav': # 若文件为wav音频文件
wavelist.append(os.path.join(filepath,filename))
for wav in wavelist:
print(wav)
f = wave.open(wav, 'rb')
params = f.getparams()
# print(params)
nchannels, sampwidth, framerate, nframes = params[:4]
strData = f.readframes(nframes)
f.close()
waveData = np.frombuffer(strData, dtype=np.int16) # 将字符串转化为int
waveData = waveData * 1.0 / max(abs(waveData)) # 幅值归一化
# plot the figure
time = (1.0 / framerate) * np.arange(0, nframes)
plt.plot(time, waveData)
plt.title('wave plot')
plt.xlabel('Time')
plt.ylabel('Amplitude')
plt.grid('on') # 标尺
plt.show()
3.图形结果
波形如下(示例):
总结
以上就是今天要讲的内容,本文仅仅简单介绍了playsoud的使用,提供了windows下可能出现的问题。