python语音库_介绍几个python的音频处理库
图 3比如我的机器的地址就是 192.168.152.130。然后将这个ip地址填入 图2 的Host Name 一栏,注意默认端口为22,不要去改它,然后点击open,就会弹出一个登陆界面,接着输入你在linux
下登陆的用户名和密码就可以ssh连上linux啦。http://www.infoworld.com/article/2617683/linux/linux-moving-files-between-unix-and-windows-systems.html这篇文章介绍了
几种在unix与windows之间传递文件的方法。我只讲第一种,使用putty的pscp的secure copy(安全拷贝)。你安装了putty之后,会自带一个叫 pscp.exe的可执行文件,将其目录加入windows
环境变量。然后 cmd执行命令 pscp myfile.txt shs@unixserver:/home/shs 即可以把你的文件 myfile.txt 复制到 linux 下的 /home/shs 目录下了。解释一下,你在执行的时候需要把shs
换成你的用户名,@后面跟你的linux ip地址, /home/shs 是你要把文件移动的位置。执行完之后,文件就会成功拷贝过去了。其他方法不讲了,有兴趣可以自行搜索,或者看我上面说的那篇文章。
回到正题,eyeD3 命令行讲完之后,再来说下如何在Python中使用。还是看官方给的例子吧:
1 import eyed3
2
3 audiofile = eyed3.load("song.mp3")
4 audiofile.tag.artist = u"Nobunny"
5 audiofile.tag.album = u"Love Visions"
6 audiofile.tag.album_artist = u"Various Artists"
7 audiofile.tag.title = u"I Am a Girlfriend"
8 audiofile.tag.track_num = 4
9
10 audiofile.tag.save()
上面的代码,使用 import eyed3 导入eyeD3 库,然后使用load方法加载mp3文件,后面的几行分别是设置 artist,album等等 ID3 tag ,直接看代码就能看出来,就不说了。如果想显示mp3文件内部的ID3 tag信息,直接print 相应的tag就行了,比如 print(audiofile.tag.artist)等等,当然,前提是你的MP3 metadata得储存了这些信息。其实还有一些更复杂和高级的用法,我就不讲了,大家有兴趣直接去官方文档看吧,地址:http://eyed3.nicfit.net/index.html。eyeD3 主要就是处理 MP3文件的metadata的,至于解析音频之类的就得用其他的库了。
二、pydub
第一个介绍的eyeD3 一般只能处理MP3文件,功能上相对来说也是比较简单一点。下面介绍的pydub库就要强大的多。老规矩,还是
先看一下它的官方介绍:
Manipulate audio with a simple and easy high level interface http://pydub.com 就一句话,简单,易用的处理音频
的高度抽象的接口,嘿,这不就是我们要找的么。github项目地址为:https://github.com/jiaaro/pydub/ 有1800多的star,说明这个
库还是很受欢迎的。安装直接很简单,直接 pip install pydub 就可以安装。但是需要注意的是:
Dependencies
You can open and save WAV files with pure python. For opening and saving non-wav files – like mp3 – you'll need ffmpeg orlibav.
这里是说python自带的wave模块只能处理 wav 格式的音频文件,如果要想处理类似MP3格式的文件,就得要装 ffmpeg或者libav了。
什么是ffmpeg 呢?
A complete, cross-platform solution to record, convert and stream audio and video.
ffmpeg 是一个跨平台的 可以用来 记录、转化音频与视频的工具,如果你做过数字信号处理方面的工作,对它应该不陌生。还有一个libav,其实是从ffmpeg分出来的一个分支,功能和 ffmpeg差不多,二者你任选一个下载就可以了。windows下直接选择可执行文件安装即可。
还是看官网的例子来介绍吧。
I:打开 mp3或者mp4等文件
可以采用如下的命令:
1 from pydub import AudioSegment
2
3 song = AudioSegment.from_wav("never_gonna_give_you_up.wav")
4 song = AudioSegment.from_mp3("never_gonna_give_you_up.mp3")
5
6 ogg_version = AudioSegment.from_ogg("never_gonna_give_you_up.ogg")
7 flv_version = AudioSegment.from_flv("never_gonna_give_you_up.flv")
8
9 mp4_version = AudioSegment.from_file("never_gonna_give_you_up.mp4", "mp4")
10 wma_version = AudioSegment.from_file("never_gonna_give_you_up.wma", "wma")
11 aac_version = AudioSegment.from_file("never_gonna_give_you_up.aiff", "aac")
可以打开任何 ffmpeg支持的文件类型,从上面可以看出,主要有 from_filetype()方法,filetype为具体的文件类型,比如 wav,mp3等
或者通用的 from_file()方法,但是这个方法必须在第二个参数指定打开文件的类型,返回的结果都是 AudioSegment对象。
II:切割音频
1 # pydub does things in milliseconds
2 ten_seconds = 10 * 1000
3
4 first_10_seconds = song[:ten_seconds]
5
6 last_5_seconds = song[-5000:]
注意pydub中的标准时间为毫秒,上面的代码就得到了音乐的前10秒和后5秒,非常简单。
III:调整音量
1 # boost volume by 6dB
2 beginning = first_10_seconds + 6
3
4 # reduce volume by 3dB
5 end = last_5_seconds - 3
+6 就表示将音乐的音量提高6分贝,-3就表示将音乐的音量降低3分贝
IV: 拼接两段音乐
without_the_middle = beginning + end
without_the_middle.duration_seconds
拼接之后的音乐时长是两段音乐时长之和,可以通过 .duration_seconds方法来获取一段音乐的时长。这与使用 len(audio)/1000.0得到的结果是一样的。
V:将音乐翻转(reverse)
1 # song is not modified
2 # AudioSegments are immutable
3 backwards = song.reverse()
注意 AudioSegment 对象是不可变的,上面使用reverse 方法不会改变song这个对象,而是会返回一个新的AudioSegment对象,其他的方法也是这样,需要注意。reverse简单来说就是 将音乐从尾部向头部开始逆序播放,我试了一下,发现转换之后还真的挺有意思的。
VI:crossfade(交叉渐入渐出方法)
1 # 1.5 second crossfade
2 with_style = beginning.append(end, crossfade=1500)
crossfade 就是让一段音乐平缓地过渡到另一段音乐,上面的crossfade = 1500 表示过渡的时间是1.5秒。
VII:repeat(重复音乐片段)
# repeat the clip twice
do_it_over = with_style * 2
上面的代码让音乐重复播放两次
VIII:fade in and fade out(逐渐增强与逐渐减弱)
# 2 sec fade in, 3 sec fade out
awesome = do_it_over.fade_in(2000).fade_out(3000)
逐渐增强2秒,逐渐减弱3秒
XI:save(保存)
awesome.export("mashup.mp3", format="mp3")
awesome.export("mashup.mp3", format="mp3", tags={'artist': 'Various artists', 'album': 'Best of 2011', 'comments': 'This album is awesome!'})
这里展示了两种保存的形式,都是使用export方法,要指定保存的格式,使用format 参数,但第二种方法多了一个tags参数,其实看一下应该就很容易明白,是保存 歌曲ID3 tag信息的。
以上只是pydub 使用方法的初步介绍,还有其他非常多的功能,请自行移步官方API 文档:https://github.com/jiaaro/pydub/blob/master/API.markdown
介绍的非常详细。
三、PyAudio
又是一个功能强大的处理音频库。官方介绍:
PyAudio provides Python bindings for PortAudio, the cross-platform audio I/O library. With PyAudio, you can easily use Python to play and record audio on a variety of platforms. PyAudio is inspired by:
pyPortAudio/fastaudio: Python bindings for PortAudio v18 API.
tkSnack: cross-platform sound toolkit for Tcl/Tk and Python.
Pyaudio 提供了对于跨平台的 PortAudio(处理 audio输入输出的库)的绑定,PyAudio可以让你轻松录制与播放音频。
废话不多说,直接看官方文档(https://people.csail.mit.edu/hubert/pyaudio/docs/)提供的一个quick start 的代码
1 """PyAudio Example: Play a wave file."""
2
3 import pyaudio
4 import wave
5 import sys
6
7 CHUNK = 1024
8
9 if len(sys.argv) < 2:
10 print("Plays a wave file.\n\nUsage: %s filename.wav" % sys.argv[0])
11 sys.exit(-1)
12
13 wf = wave.open(sys.argv[1], 'rb')
14
15 # instantiate PyAudio (1)
16 p = pyaudio.PyAudio()
17
18 # open stream (2)
19 stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
20 channels=wf.getnchannels(),
21 rate=wf.getframerate(),
22 output=True)
23
24 # read data
25 data = wf.readframes(CHUNK)
26
27 # play stream (3)
28 while len(data) > 0:
29 stream.write(data)
30 data = wf.readframes(CHUNK)
31
32 # stop stream (4)
33 stream.stop_stream()
34 stream.close()
35
36 # close PyAudio (5)
37 p.terminate()
当然,这个提供的是使用命令行参数接收音频文件的形式,CHUNK 是一次读取的音频byte数量,p = pyaudio.PyAudio()初始化一个
PyAudio对象,然后使用其open方法打开一个输入输出流,这里指定了output=True说明这是一个输出流,即我们是往stream中添加data,如果这里改为 input = True就是变成输入流了,一般是从设备的标准 audio device ,对于电脑来说可能就是麦克风了,来读取音频data。使用wave打开一个 .wav 文件,然后使用 readframes方法每次读取 CHUNK 这么多的数据,将数据写入 stream,直到读完为止。写入stream的audio data 就会不断通过麦克风播放出来了,于是我们就可以听到音乐了。最后在结束的时候,注意要关闭相应的对象以释放资源。
还有一种方法是使用callback(回调函数)函数,代码如下:
1 """PyAudio Example: Play a wave file (callback version)."""
2
3 import pyaudio
4 import wave
5 import time
6 import sys
7
8 if len(sys.argv) < 2:
9 print("Plays a wave file.\n\nUsage: %s filename.wav" % sys.argv[0])
10 sys.exit(-1)
11
12 wf = wave.open(sys.argv[1], 'rb')
13
14 # instantiate PyAudio (1)
15 p = pyaudio.PyAudio()
16
17 # define callback (2)
18 def callback(in_data, frame_count, time_info, status):
19 data = wf.readframes(frame_count)
20 return (data, pyaudio.paContinue)
21
22 # open stream using callback (3)
23 stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
24 channels=wf.getnchannels(),
25 rate=wf.getframerate(),
26 output=True,
27 stream_callback=callback)
28
29 # start the stream (4)
30 stream.start_stream()
31
32 # wait for stream to finish (5)
33 while stream.is_active():
34 time.sleep(0.1)
35
36 # stop stream (6)
37 stream.stop_stream()
38 stream.close()
39 wf.close()
40
41 # close PyAudio (7)
42 p.terminate()
不细说了。
下面来看一个使用pyaudio + numpy + pylab 可视化音频的代码,下面的代码打开电脑的麦克风,然后接受音频输入,再以图像的形式展示出来。
1 # -*- coding: utf-8 -*-
2 """
3 Created on Fri May 12 10:30:00 2017
4 @author: Lyrichu
5 @description: show the sound in graphs
6 """
7 import pyaudio
8 import numpy as np
9 import pylab
10 import time
11
12 RATE = 44100
13 CHUNK = int(RATE/20) # RATE/number of updates per second
14
15 def sound_plot(stream):
16 t1 = time.time() # time starting
17 data = np.fromstring(stream.read(CHUNK),dtype = np.int16)
18 pylab.plot(data)
19 pylab.title(i)
20 pylab.grid()
21 pylab.axis([0,len(data),-2**8,2**8])
22 pylab.savefig("sound.png",dpi=50)
23 pylab.show(block = False)
time.sleep(0.5)
24 pylab.close('all')
25 print("took %.2f ms." % (time.time() - t1)*1000)
26
27 if __name__ == '__main__':
28 p = pyaudio.PyAudio()
29 stream = p.open(format = pyaudio.paInt16,channels = 1,rate = RATE,
30 input = True,frames_per_buffer = CHUNK)
31 for i in range(int(20*RATE/CHUNK)):
32 # for 10 seconds
33 sound_plot(stream)
34 stream.stop_stream()
35 stream.close()
36 p.terminate()
代码应该比较容易理解。得到的大概是像下面这样的图形(图4):
图 4
需要注意的是,如果不是在交互式命令下执行pylab或者matplotlib的plot命令,其plt.show()函数是一个block函数,这会导致最后的
plt.close('all') 关闭所有的窗口只会在手动关闭了图像之后才会执行,所有我们无法看到连续变化的图像,为了解决这个问题,我们将plt.show()函数block参数设为False,这样show函数就不是block函数了,可以直接执行plt.close('all')命令,为了不因为图像刷新太快我们看不清变化,所以使用time.sleep(0.5) 暂停0.5秒。
其实还没介绍完,还有pygame模块(python的一个做游戏的模块)以及librosa库(专业的数字信号处理库)等没有讲,等有机会再更吧。敬请关注!
python语音库_介绍几个python的音频处理库相关推荐
- python语音分割_用7行Python代码构建自己的有声读物
点击关注我哦 欢迎关注 "小白玩转Python",发现更多 "有趣" 有声读物是我们可以通过音频听取一本书或者其他作品的内容,是现下一种很受欢迎的阅读方式.类似 ...
- python 语音分段_教你用Python如何玩转声音文件,将声音按照语音间隙切割为片段...
声音信号在现实生活中有很多,在如今这个信息爆炸的社会中,提取有用的声音信号也变的尤为重要.当我们采集了一段声音信号后,有时候需要将这段声音的每一句话分离开来做分析,提取我们需要的声音信息.在这里提供一 ...
- python编程基础_月隐学python第2课
python编程基础_月隐学python第2课 学习目标 掌握变量的输入和输出 掌握数据类型的基本概念 掌握算数运算 1.变量的输入和输出 1.1 变量输入 使用input输入 input用于输入数据 ...
- 查看Python的版本_查看当前安装Python的版本
一.查看Python的版本_查看当前安装Python的版本 具体方法: 首先按[win+r]组合键打开运行: 然后输入cmd,点击[确定]: 最后执行[python --version]命令即可. 特 ...
- python语音特征提取_使用Python从视频中提取语音
python语音特征提取 In this post, I will show you how to extract speeches from a video recording file. Afte ...
- python并行运算库_最佳并行绘图Python库简介:“ HiPlot”
python并行运算库 HiPlot is Facebook's Python library to support visualization of high-dimensional data ta ...
- python库_计算机二级教程 Python语言程序设计,第10章python第三方库概览
第十章学习知识导图 考点主要是: 1) 第三方库的获取和安装 2) 脚本程序转变为可执行程序的第三方库 : PyInstaller库(必选) 3) 第三方库: jieba库(必选).wordcloud ...
- net能和python结合吗_如何不用安装python就能在.NET里调用Python库
前言 Pythonnet这个屌爆的项目的出现,使得我们可以用一种新的方式,让C#可以和Python之间进行互操作.但是它的设置和部署可能有点问题,真的是这样吗? 本文我会介绍Python.Includ ...
- python 量化交易 库_量化投资的Python库——Tushare
本来想用python自带的help命令和dir命令,来写一个关于Tushare库的使用手册呢,但是后来发现了Tushare的官方网站, ̄□ ̄||,网址如下: http://tushare.org/ 把 ...
最新文章
- 华中农业大学苏汉东课题组诚聘博士后-
- NDArray自动求导
- 构造函数 返回值_JavaScript构造函数的简单介绍
- 【转载】Gradle命令行黑魔法
- SQL Server Junior Database Administrator方案相关的访谈问答
- VS2010 发布网站总是连同cs文件一起发布了
- 如何在windows平台下使用hsdis与jitwatch查看JIT后的汇编码
- 为什么我偏爱用 GitHub 来写书?
- 7.1-7.31推荐文章汇总
- 项目管理笔记-第十章 项目沟通管理
- 微信小程序开发资源汇总 awesome-wechat-weapp
- 【模拟电路仿真】LM324加法器电路(激励源与正弦信号源的使用)
- H2单元测试数据库使用调研
- HDU 4960 Another OCD Patient 简单DP
- 【元器件】电容选型指南
- 同一个ssh key用在多台电脑上
- to tell 和to ask的用法
- 李嘉诚,原一平的故事
- 电容笔和触控笔有什么区别?ipad手写电容笔推荐品牌
- MATLAB-实现太阳、地球、月亮三者之间运转关系的模拟
热门文章
- 抖音无水印解析网站精美源码-无需数据库 安装
- pdf怎么提取页面?可以试试这些方法
- win10中有道词典以及部分软件中文显示乱码问题解决方案
- ADI Blackfin DSP处理器-BF533的开发详解4:中断的使用方法(含源代码)
- 计算机毕业设计-问答交流论坛小程序系统【代码讲解+安装调试+文档指导】
- docker部署excalidraw画图工具
- 2020中国高校计算机大赛·华为云大数据挑战赛--热身赛 Rank7 思路及代码分享
- 易语言 ftp控制html,【原创】利用FTP实现软件自动更新
- Minecraft——Forge1.16.5模组开发(36.2.20)——(1)开发环境搭建
- 网络流 最大流最小割与最小费用流