用python生成显示wav文件波形和增加可以在时间轴裁剪波形后保存波形文件的PYQT程序
时间: 2024-05-01 08:19:04 浏览: 297
以下是一个简单的PYQT程序,用于显示wav文件波形和裁剪波形后保存波形文件。它使用Python的wave和pyqtgraph库。
```python
import sys
import wave
import pyqtgraph as pg
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog, QPushButton
from PyQt5.QtCore import Qt
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Waveform Viewer")
self.setGeometry(100, 100, 800, 600)
self.filepath = None
self.initUI()
def initUI(self):
# 选择文件按钮
btn_open = QPushButton('Open', self)
btn_open.move(10, 10)
btn_open.clicked.connect(self.open_file)
# 保存按钮
btn_save = QPushButton('Save', self)
btn_save.move(100, 10)
btn_save.clicked.connect(self.save_file)
btn_save.setDisabled(True)
# 显示波形图
self.plot_widget = pg.PlotWidget(self)
self.plot_widget.setGeometry(10, 50, 780, 540)
def open_file(self):
# 打开文件对话框选择wav音频文件
self.filepath, _ = QFileDialog.getOpenFileName(self, 'Open file', '', 'WAV files (*.wav)')
if self.filepath:
self.load_waveform()
self.statusBar().showMessage(f"Loaded {self.filepath}")
self.findChild(QPushButton, 'Save').setEnabled(True)
def load_waveform(self):
# 从wav文件中加载波形数据
with wave.open(self.filepath, 'r') as wf:
num_channels = wf.getnchannels()
num_frames = wf.getnframes()
sample_rate = wf.getframerate()
sample_width = wf.getsampwidth()
duration = num_frames / sample_rate
data = wf.readframes(num_frames)
# 将二进制数据转换为整数数组
if sample_width == 1:
data = pg.Byte(data)
elif sample_width == 2:
data = pg.Short(data)
else:
raise ValueError("Unsupported sample width")
# 将多通道数据转换为二维数组
if num_channels > 1:
data = data.reshape((num_frames, num_channels))
self.plot_widget.plot(data[:, 0], pen='b')
self.plot_widget.plot(data[:, 1], pen='g')
else:
self.plot_widget.plot(data, pen='b')
# 设置坐标轴范围和标签
self.plot_widget.setXRange(0, duration, padding=0)
self.plot_widget.getAxis('bottom').setLabel("Time (s)")
self.plot_widget.getAxis('left').setLabel("Amplitude")
def save_file(self):
# 打开文件对话框选择保存路径和文件名
save_path, _ = QFileDialog.getSaveFileName(self, 'Save file', '', 'WAV files (*.wav)')
if save_path:
# 截取波形数据
region = self.plot_widget.getViewBox().viewRange()[0]
start_time = region[0]
end_time = region[1]
with wave.open(self.filepath, 'r') as wf:
num_channels = wf.getnchannels()
num_frames = wf.getnframes()
sample_rate = wf.getframerate()
sample_width = wf.getsampwidth()
data = wf.readframes(num_frames)
# 计算截取开始和结束的帧数
start_frame = int(start_time * sample_rate)
end_frame = int(end_time * sample_rate)
if end_frame > num_frames:
end_frame = num_frames
# 将二进制数据转换为整数数组
if sample_width == 1:
data = pg.Byte(data)
elif sample_width == 2:
data = pg.Short(data)
else:
raise ValueError("Unsupported sample width")
# 将多通道数据转换为二维数组
if num_channels > 1:
data = data.reshape((num_frames, num_channels))
# 保存截取后的波形数据到新的wav文件中
with wave.open(save_path, 'w') as wf:
wf.setnchannels(num_channels)
wf.setsampwidth(sample_width)
wf.setframerate(sample_rate)
wf.writeframes(data[start_frame:end_frame].tostring())
self.statusBar().showMessage(f"Saved {save_path}")
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
```
该程序包括三个主要部分:
1. 初始化用户界面:创建一个窗口,包括一个“打开”按钮、一个“保存”按钮和一个用于显示波形图的绘图小部件。
2. 打开文件:当用户点击打开按钮时,程序打开一个文件对话框,让用户选择一个.wav音频文件。然后,程序加载该文件的波形数据,并在绘图小部件中显示它。
3. 保存文件:当用户点击保存按钮时,程序打开一个文件对话框,让用户选择保存路径和文件名。然后,程序截取用户在绘图小部件中选择的时间范围,并将截取后的波形数据保存到新的.wav文件中。
注意:该程序只支持单声道和双声道16位或8位WAV文件。如果需要支持其他类型的音频文件,需要进行一些修改。
阅读全文