python: audio

发布时间 2023-08-09 21:34:54作者: ®Geovin Du Dream Park™

 

"""
python.exe -m pip install --upgrade pip
pip install pyaudio
pip install matplotlib
https://matplotlib.org/3.1.1/gallery/animation/simple_anim.html
https://matplotlib.org/stable/api/figure_api.html

"""

# encoding: utf-8
# 版权所有 2023 涂聚文有限公司
# 许可信息查看:
# 描述:
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2023.1 python 311
# Datetime  : 2023/8/9 21:03
# User      : geovindu
# Product   : PyCharm
# Project   : pythonTkinterDemo
# File      : AudioHelper.py
# explain   : 学习

import pyaudio
import wave
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt


class audioHelper(object):
    """
     if __name__ == '__main__':
   # 录制5s的声音
   getAudio(5)
   # 播放声音
   play_audio('录音.wav')
   # 录制5s的音乐
   fig, line = plotInit()
   # 播放音乐
   play_audio('录音.wav')

      
    """



    def __init__(self):
        """

        """


    def getAudio(slef,sec):
        """
        录音
        :return:
        """
        # 创建对象
        p = pyaudio.PyAudio()
        # 创建流:采样位,声道数,采样频率,缓冲区大小,input=True
        stream = p.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=1024)
        # 创建式打开音频文件
        wf = wave.open('录音.wav', 'wb')
        # 设置声道数
        wf.setnchannels(1)
        # 设置采样位数
        wf.setsampwidth(p.get_sample_size(pyaudio.paInt16))
        wf.setframerate(16000)
        print('开始录音')
        for w in range(int(16000 * sec / 1024)):
             data = stream.read(1024)
             wf.writeframes(data)
        print('录音结束')
        stream.stop_stream()
        stream.close()
        p.terminate()
        wf.close()
        # return 'test.wav'



    def play_audio(self,file):
        """
        播放音乐
        :return:
        """
        p = pyaudio.PyAudio()
        wf = wave.open(file, 'rb')
        stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                       channels=wf.getnchannels(),
                       rate=wf.getframerate(),
                       output=True
                      )
        data = wf.readframes(1024)
        while len(data) > 0:
           stream.write(data)
           data = wf.readframes(1024)
        stream.stop_stream()
        stream.close()
        p.terminate()
        wf.close()

    def play_audio(sslf,file):
        """
        播放音乐
        :return:
        """
        fig, ax = plt.subplots()
        x = np.arange(0, 2 * np.pi, 0.01)
        line, = ax.plot(x, np.sin(x))
        p = pyaudio.PyAudio()
        wf = wave.open(file, 'rb')
        stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                       channels=wf.getnchannels(),
                       rate=wf.getframerate(),
                       output=True
                      )
        data = wf.readframes(1024)
        while len(data) > 0:
           stream.write(data)
           data = wf.readframes(1024)
           data = np.frombuffer(data, dtype=np.int16)
           if len(data) <= 0:
               break
           print(data)
           line.set_ydata(data)
           fig.canvas.draw()
           fig.canvas.flush_events()
           plt.pause(0.01)

        stream.stop_stream()
        stream.close()
        p.terminate()
        wf.close()


    def plotInit(self):
        """
         录制5s的音乐
        :return:
        """
        CHUNK = 1024
        mpl.rcParams['toolbar'] = 'None'
        fig, ax = plt.subplots(figsize=(12, 3))
        ax.set_xlim(0, CHUNK - 1)
        ax.set_ylim(-2 ** 15, 2 ** 15)
        plt.subplots_adjust(left=0.001, top=0.999, right=0.999, bottom=0.001)
        plt.get_current_fig_manager().set_window_title('wave')
        x = np.arange(0, CHUNK)
        line, = ax.plot(x, np.random.rand(CHUNK), color='#C04851')
        plt.axis('off')
        plt.ion()
        plt.show()
        return fig, line