python pyaudio实时读取音频数据并展示波形图

python pyaudio实时读取音频数据并展示波形图

下面代码可以驱动电脑接受声音数据,并实时展示音波图:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import pyaudio
import wave
import os
import operator
from functools import reduce


class SubplotAnimation(animation.TimedAnimation):
    def __init__(self, static=False, path=None):
        """
        音频波形动态显示,实时显示波形
        :param static: 是否为静态模式
        :param path:   wav 文件路径
        """
        self.static = static
        if static and os.path.isfile(path):
            self.stream = wave.open(path)
            # 采样频率
            self.rate = self.stream.getparams()[2]
            self.chunk = self.rate / 2
            self.read = self.stream.readframes
        else:
            self.rate = 8000  # 采样率
            self.chunk = 200  # 语音块大小
            self.deviceindex = 0  # 录音设备编号
            p = pyaudio.PyAudio()
            # frames_per_buffer=self.chunk 设置音频流的缓冲区大小,即每次从音频设备读取的数据块的大小
            self.stream = p.open(format=pyaudio.paInt16, channels=1, rate=self.rate,
                                 input_device_index=self.deviceindex,
                                 input=True, frames_per_buffer=self.chunk)
            self.read = self.stream.read

        self.chunknum = 40  # 同屏显示语音块的数量
        self.voicedatas = []
        self.zero = [0 for i in range(self.chunk)]
        for index in range(self.chunknum):
            self.voicedatas.insert(0, self.zero)

    # 定义波形显示图的横纵坐标大小及类别并选用读取实时音频数据方式显示,设定更新间隔
    def start(self):
        fig = plt.figure()
        ax1 = fig.add_subplot(1, 1, 1)
        ax1.set_xlabel("t")
        ax1.set_ylabel("x")
        ax1.set_xlim(0, 1.0 * (self.chunknum * self.chunk - 1) / self.rate)
        ax1.set_ylim(-16000, 16000)
        self.line1, = ax1.plot([], [], lw=2)

        # 更新间隔/ms
        interval = int(1000 * self.chunk / self.rate)
        animation.TimedAnimation.__init__(self, fig, interval=interval, blit=True)

    # 初始化绘图,l.set_data([], []) 将绘图数据清空,使得动画开始时图像为空白状态
    def _init_draw(self):
        lines = [self.line1]
        for l in lines:
            l.set_data([], [])

    def new_frame_seq(self):
        return iter(range(self.chunk))

    def _draw_frame(self, framedata):
        if self.static:
            # 读取静态wav文件波形
            y = np.fromstring(self.read(self.chunk / 2 + 1), dtype=np.int16)[:-1]
        else:
            # 实时读取声频
            data = np.fromstring(self.read(self.chunk, exception_on_overflow=False), dtype=np.int16)
            data = data.tolist()
            self.voicedatas.append(data)
            self.voicedatas.pop(0)
            y = reduce(operator.add, self.voicedatas)  # 将 self.voicedatas 中的 40 个列表数据全部放在 1 个列表中
        x = np.linspace(0, 1.0 * (self.chunknum * self.chunk - 1) / self.rate, self.chunknum * self.chunk)

        # 画波形图
        self.line1.set_data(x, y)


ani = SubplotAnimation()
ani.start()
plt.show()

在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 实时音频通话的变音功能可以通过Python中的OpenCV和PyAudio库来实现。一般地,音频变声的过程可以分为两个步骤: 1.捕获音频数据并进行处理。 2.将处理后的音频数据输出到音频设备,使其发出声音。 以下是一个基本的实现步骤: 1. 安装必要的库 ``` pip install opencv-python-headless pyaudio numpy scipy ``` 2. 导入必要的库 ``` import cv2 import pyaudio import numpy as np from scipy import signal ``` 3. 定义捕获音频数据的回调函数 ``` def audio_callback(in_data, frame_count, time_info, status): # 将音频数据转换为numpy数组 audio_data = np.frombuffer(in_data, dtype=np.int16) # 处理音频数据 processed_data = process_audio(audio_data) # 将处理后的音频数据转换为bytes对象 out_data = processed_data.tobytes() return (out_data, pyaudio.paContinue) ``` 4. 定义音频处理函数 ``` def process_audio(audio_data): # 对音频数据进行变声处理 # 这里可以使用诸如pitch shifting、time stretching、formant shifting等算法 # 以达到不同的变声效果 return audio_data ``` 5. 初始化PyAudio对象并打开音频输入输出设备 ``` p = pyaudio.PyAudio() # 打开音频输入设备 stream_in = p.open(format=pyaudio.paInt16, channels=1, rate=44100, input=True, frames_per_buffer=1024, stream_callback=audio_callback) # 打开音频输出设备 stream_out = p.open(format=pyaudio.paInt16, channels=1, rate=44100, output=True) ``` 6. 开始捕获音频数据并输出处理后的音频数据 ``` stream_in.start_stream() stream_out.start_stream() while True: # 不断读取音频数据并输出处理后的音频数据 try: data = stream_in.read(1024) stream_out.write(data) except KeyboardInterrupt: break stream_in.stop_stream() stream_out.stop_stream() stream_in.close() stream_out.close() p.terminate() ``` 在上述代码中,我们通过`audio_callback()`回调函数捕获音频数据,并将其传递给`process_audio()`函数进行处理。处理后的音频数据再通过`stream_out.write()`函数输出到音频输出设备,使其发出声音。 需要注意的是,变声的效果可以通过调整`process_audio()`函数中的算法参数来自定义实现。这里只是提供了一个基本的框架,具体的变声算法需要根据实际需求进行选择和实现。 ### 回答2: Python OpenCV库本身并不支持实时音频通话的变音功能。OpenCV是一个用于图像处理和计算机视觉的开源库,主要用于图像和视频的读取、处理和显示。要实现实时音频通话的变音功能,可以结合其他音频处理库如PyAudio和NumPy来完成。 首先,使用PyAudio库进行音频的录制和播放PyAudio是一个跨平台的音频处理库,可以用来获取音频输入和输出流。 然后,使用NumPy库来处理音频信号。NumPy提供了强大的多维数组和矩阵操作功能,可以用来对音频信号进行变音处理,如改变音频的音调、速度、声音特效等。具体音频处理的算法可以根据需求选择合适的方法。 最后,使用OpenCV库进行音频录制过程中的可视化。OpenCV可以用来读取、处理和显示音频的频谱图或波形图等可视化效果,增加用户交互性和音频处理的效果展示。 总之,要实现Python OpenCV实时音频通话的变音功能,需要结合PyAudio和NumPy库进行音频的录制、处理和播放,并使用OpenCV库进行音频录制过程中的可视化效果展示。 ### 回答3: 实现实时音频通话的变音功能,可以利用Python和OpenCV来实现。以下是简要的步骤: 1. 导入必要的库:导入OpenCV和PyAudio库。 2. 初始化摄像头和音频输入设备:使用OpenCV的VideoCapture函数初始化摄像头,并使用PyAudio库进行音频输入设备的初始化。 3. 读取音频数据:使用PyAudio库的stream.read()方法读取来自音频输入设备的数据。 4. 处理音频数据:可以使用NumPy库来处理音频数据,例如应用快速傅里叶变换(FFT)将音频信号转换为频域信号。 5. 变换音频信号:通过修改音频信号的频域表示,可以实现变音效果。例如,可以选择某个频率范围,将其倍增或降低。 6. 恢复音频数据:使用NumPy库的傅里叶逆变换(IFFT)将变换后的频域信号转换回时域信号。 7. 播放音频数据:使用PyAudio库的stream.write()方法将变换后的音频数据发送到音频输出设备进行播放。 8. 实时显示视频:使用OpenCV库读取摄像头的数据,并将处理后的音频数据与视频数据进行合成,实现实时显示。 总结:以上是实现实时音频通话的变音功能的基本步骤。根据具体需求,可能还需要进行其他的处理和优化,如添加其他音频特效、调整音频增益等。整体上,通过结合Python的OpenCV和PyAudio库,可以实现音频处理和视频合成,从而实现实时音频通话的变音功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值