Python实现播放和录制声音的功能


Posted in Python onAugust 12, 2020

Python语言已经无所不能了,今天就来分享一下,如何使用Python来录制和播放音频文件。

下面是一些可以播放和录制音频的Python第三方库:

  • playsound,支持MP3和WAV,目前只支持简单的回放。
  • simpleaudio,支持WAV,提供检查文件是否仍在播放的功能。
  • winsound,支持WAV,只支持windows。
  • python-sounddevice和pyaudio为PortAudio库提供绑定,以便跨平台回放WAV文件。
  • pydub,需要pyaudio来播放音频,但是安装了ffmpeg之后,它允许您使用几行代码来播放各种音频格式。

一、播放音频文件

使用playsound库

1、安装

$ pip install playsound

2、使用播放音频

from playsound import playsound
playsound('myfile.wav')

使用simpleaudio库

1、安装

$ pip install simpleaudio

2、使用播放音频

mport simpleaudio as sa

filename = 'myfile.wav'
wave_obj = sa.WaveObject.from_wave_file(filename)
play_obj = wave_obj.play()
play_obj.wait_done() # Wait until sound has finished playing

使用winsound库

如果您使用Windows,您可以使用内置的winsound模块来访问其基本的声音播放机制。播放WAV文件可以在几行代码:

import winsound

filename = 'myfile.wav'
winsound.PlaySound(filename, winsound.SND_FILENAME)

使用python-sounddevice库

1、安装

$ pip install sounddevice

2、使用播放音频

import sounddevice as sd
import soundfile as sf

filename = 'myfile.wav'
# Extract data and sampling rate from file
data, fs = sf.read(filename, dtype='float32') 
sd.play(data, fs)
status = sd.wait() # Wait until file is done playing

使用pydub库

1、安装

$ pip install pydub

2、使用播放音频

from pydub import AudioSegment
from pydub.playback import play

sound = AudioSegment.from_wav('myfile.wav')
play(sound)

默认情况下,pydub只支持播放wav格式音频。如果你想播放更多其他格式的音频文件。需要安装ffmpeg-python。

$ pip install ffmpeg-python

安装了ffmpeg后,播放MP3文件只需要在我们之前的代码中做一个小小的修改:

from pydub import AudioSegment
from pydub.playback import play

sound = AudioSegment.from_mp3('myfile.mp3')
play(sound)

使用pyaudio库

1、安装

$ pip install pyaudio

2、使用播放音频

import pyaudio
import wave

filename = 'myfile.wav'


chunk = 1024 
wf = wave.open(filename, 'rb')
p = pyaudio.PyAudio()
stream = p.open(format = p.get_format_from_width(wf.getsampwidth()),
    channels = wf.getnchannels(),
    rate = wf.getframerate(),
    output = True)

data = wf.readframes(chunk)

while data != '':
 stream.write(data)
 data = wf.readframes(chunk)

stream.close()
p.terminate()

您可能已经注意到,使用pyaudio播放声音比使用前面看到的库播放声音要复杂一些。这意味着如果您只想在Python应用程序中播放声音效果,那么它可能不是您的首选。

但是,由于pyaudio提供了更低级的控制,因此可以获取和设置输入和输出设备的参数,并检查CPU负载和输入或输出延迟。

它还允许您在回调模式下播放和录制音频,在回调模式中,当需要回放新数据或记录可用数据时,将调用指定的回调函数。如果您的音频需要的不仅仅是简单的回放,那么这些选项使pyaudio成为一个合适的库。

既然您已经了解了如何使用许多不同的库来播放音频,现在就来看看如何使用Python自己录制音频。

二、录音

Python -sounddevice和pyaudio库提供了用Python录制音频的方法。

1 、使用python-sounddevice录音

import sounddevice as sd
from scipy.io.wavfile import write

fs = 44100 # Sample rate
seconds = 3 # Duration of recording

myrecording = sd.rec(int(seconds * fs), samplerate=fs, channels=2)
sd.wait() # Wait until recording is finished
write('output.wav', fs, myrecording) # Save as WAV file

2、使用pyaudio录音

import pyaudio
import wave

chunk = 1024 # Record in chunks of 1024 samples
sample_format = pyaudio.paInt16 # 16 bits per sample
channels = 2
fs = 44100 # Record at 44100 samples per second
seconds = 3
filename = "output.wav"

p = pyaudio.PyAudio() # Create an interface to PortAudio

print('Recording')

stream = p.open(format=sample_format,
    channels=channels,
    rate=fs,
    frames_per_buffer=chunk,
    input=True)

frames = [] # Initialize array to store frames

# Store data in chunks for 3 seconds
for i in range(0, int(fs / chunk * seconds)):
 data = stream.read(chunk)
 frames.append(data)

# Stop and close the stream 
stream.stop_stream()
stream.close()
# Terminate the PortAudio interface
p.terminate()

print('Finished recording')

# Save the recorded data as a WAV file
wf = wave.open(filename, 'wb')
wf.setnchannels(channels)
wf.setsampwidth(p.get_sample_size(sample_format))
wf.setframerate(fs)
wf.writeframes(b''.join(frames))
wf.close()

三、保存和格式转换

1、使用pydub保存音频

from pydub import AudioSegment
sound = AudioSegment.from_wav('myfile.wav')
sound.export('myfile.mp3', format='mp3')

2、使用pydub完成格式转换

from pydub import AudioSegment
sound = AudioSegment.from_wav('myfile.wav')
sound.export('myfile.mp3', format='mp3')

如果觉得内容还不错,分享给更多朋友,一起提升编程技能。

以上就是Python实现播放和录制声音的功能的详细内容,更多关于python 播放和录制声音的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
基python实现多线程网页爬虫
Sep 06 Python
深入理解python对json的操作总结
Jan 05 Python
Python实现公历(阳历)转农历(阴历)的方法示例
Aug 22 Python
python使用邻接矩阵构造图代码示例
Nov 10 Python
详解Python3中的迭代器和生成器及其区别
Oct 09 Python
Pycharm无法使用已经安装Selenium的解决方法
Oct 13 Python
Python3多目标赋值及共享引用注意事项
May 27 Python
python数据分析:关键字提取方式
Feb 24 Python
jupyter notebook oepncv 显示一张图像的实现
Apr 24 Python
你应该知道的Python3.6、3.7、3.8新特性小结
May 12 Python
Python多线程的退出控制实现
Aug 10 Python
python 获取字典特定值对应的键的实现
Sep 29 Python
Python实现文件压缩和解压的示例代码
Aug 12 #Python
Python爬取数据并实现可视化代码解析
Aug 12 #Python
Python下载网易云歌单歌曲的示例代码
Aug 12 #Python
Python爬取12306车次信息代码详解
Aug 12 #Python
Python读取xlsx数据生成图标代码实例
Aug 12 #Python
Idea安装python显示无SDK问题解决方案
Aug 12 #Python
Python selenium如何打包静态网页并下载
Aug 12 #Python
You might like
php中sql注入漏洞示例 sql注入漏洞修复
2014/01/24 PHP
destoon实现首页显示供应、企业、资讯条数的方法
2014/07/15 PHP
10条php编程小技巧
2015/07/07 PHP
Zend Framework教程之Loader以及PluginLoader用法详解
2016/03/09 PHP
thinkPHP5框架分页样式类完整示例
2018/09/01 PHP
用js得到网页中所有的div的id
2020/10/19 Javascript
使用Jquery打造最佳用户体验的登录页面的实现代码
2011/07/08 Javascript
JavaScript中__proto__与prototype的关系深入理解
2012/12/04 Javascript
js substr支持中文截取函数代码(中文是双字节)
2013/04/17 Javascript
JS实现div内部的文字或图片自动循环滚动代码
2013/04/19 Javascript
JS写的贪吃蛇游戏(个人练习)
2013/07/08 Javascript
jQuery使用load()方法载入另外一个网页文件内的指定标签内容到div标签的方法
2015/03/25 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
2017/01/12 Javascript
jQuery validata插件实现方法
2017/06/25 jQuery
vue移动端裁剪图片结合插件Cropper的使用实例代码
2017/07/10 Javascript
浅谈Node.js ORM框架Sequlize之表间关系
2017/07/24 Javascript
关于Vue背景图打包之后访问路径错误问题的解决
2017/11/03 Javascript
探秘vue-rx 2.0(推荐)
2018/09/21 Javascript
[01:01:01]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第一场 10.29
2020/10/29 DOTA
[45:06]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第二场 11.28
2020/12/02 DOTA
Python实现的异步代理爬虫及代理池
2017/03/17 Python
Python如何计算语句执行时间
2019/11/22 Python
Python 根据数据模板创建shapefile的实现
2019/11/26 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
2020/11/02 Python
python数据抓取3种方法总结
2021/02/07 Python
澳大利亚UGG工厂直销:Australian Ugg Boots
2017/10/14 全球购物
TheFork葡萄牙:欧洲领先的在线餐厅预订平台
2019/05/27 全球购物
运动员口号
2014/06/09 职场文书
教师批评与自我批评(群众路线)
2014/10/15 职场文书
2015年教师自我评价范文
2015/03/04 职场文书
《火烧云》教学反思
2016/02/23 职场文书
2016大学优秀学生干部事迹材料
2016/03/01 职场文书
诺贝尔奖获得者名言100句:句句启人心智,值永久收藏
2019/08/09 职场文书
如何理解Vue简单状态管理之store模式
2021/05/15 Vue.js
使用 DataAnt 监控 Apache APISIX的原理解析
2022/07/07 Servers
SpringBoot接入钉钉自定义机器人预警通知
2022/07/15 Java/Android