图 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 eyed32 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 = 49 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 AudioSegment2 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 milliseconds2 ten_seconds = 10 * 10003 4 first_10_seconds = song[:ten_seconds]5 6 last_5_seconds = song[-5000:]

注意pydub中的标准时间为毫秒,上面的代码就得到了音乐的前10秒和后5秒,非常简单。

III:调整音量

1 #boost volume by 6dB2 beginning = first_10_seconds + 63 4 #reduce volume by 3dB5 end = last_5_seconds - 3

+6 就表示将音乐的音量提高6分贝,-3就表示将音乐的音量降低3分贝

IV: 拼接两段音乐

without_the_middle = beginning + endwithout_the_middle.duration_seconds

拼接之后的音乐时长是两段音乐时长之和,可以通过 .duration_seconds方法来获取一段音乐的时长。这与使用 len(audio)/1000.0得到的结果是一样的。

V:将音乐翻转(reverse)

1 #song is not modified2 #AudioSegments are immutable3 backwards = song.reverse()

注意 AudioSegment 对象是不可变的,上面使用reverse 方法不会改变song这个对象,而是会返回一个新的AudioSegment对象,其他的方法也是这样,需要注意。reverse简单来说就是 将音乐从尾部向头部开始逆序播放,我试了一下,发现转换之后还真的挺有意思的。

VI:crossfade(交叉渐入渐出方法)

1 #1.5 second crossfade2 with_style = beginning.append(end, crossfade=1500)

crossfade 就是让一段音乐平缓地过渡到另一段音乐,上面的crossfade = 1500 表示过渡的时间是1.5秒。

VII:repeat(重复音乐片段)

#repeat the clip twicedo_it_over = with_style * 2

上面的代码让音乐重复播放两次

VIII:fade in and fade out(逐渐增强与逐渐减弱)

#2 sec fade in, 3 sec fade outawesome = 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 pyaudio4 import wave5 import sys6 7 CHUNK = 10248 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 data25 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 pyaudio4 import wave5 import time6 import sys7 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 20174 @author: Lyrichu5 @description: show the sound in graphs6 """7 import pyaudio8 import numpy as np9 import pylab10 import time11 12 RATE = 4410013 CHUNK = int(RATE/20) #RATE/number of updates per second14 15 def sound_plot(stream):16 t1 = time.time() #time starting17 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 seconds33 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的音频处理库相关推荐

  1. python中的画布背景设置_教你用python画图—Turtle详细教程

    Turtle模块绝对是吸引非专业代码开发者人员学习python入门的好工具 通过turtle几行代码的执行软件就会画出漂亮的图形,美观而且有成就感,这样一下子对python编程就产生了兴趣. 这些漂亮 ...

  2. python中ret是什么意思_数据结构图在python中的应用

    原标题:数据结构图在python中的应用 程序世界里,有很多的数据结构,比如:堆.栈.链表等等,今天要讲的就是图数据结构啦. 相信大家都使用过或者听说过图数据库吧,我们就来看看最简单的图数据结构算法. ...

  3. 如何解决python中编码错误的问题_【总结】Python 2.x中常见字符编码和解码方面的错误及其解决办法...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 对于Python解析器 而Python解析器所干的事情,就是: Python解析器,根据当前的所用的字符串编码类型 此字符串编码类型,是你自己所设置的 不 ...

  4. python中换行符怎么写_语法 - 如何在Python中执行换行符(换行符)?

    语法 - 如何在Python中执行换行符(换行符)? 我有一长串代码,我希望在多行之间分解. 我使用什么,语法是什么? 例如,添加一串字符串, e = 'a' + 'b' + 'c' + 'd' 并将 ...

  5. python中声明变量注意事项_我们如何在Python中声明变量?

    简短的答案是,无需在Python中声明变量. 以下是更详细的描述. 静态类型语言(C,C ++,Java,C#)要求在程序中使用变量之前,必须先声明要使用的变量的名称和类型声明.相应的语言编译器确保将 ...

  6. python中一个范围怎么表示_我应该如何处理Python中的包含范围?

    我在一个领域工作,在这个领域中,范围通常被包括在内地描述.我有人类可读的描述,例如from A to B,它表示包含两个端点的范围,例如from 2 to 4表示2, 3, 4. 在Python代码中 ...

  7. python 中split函数的应用_举例详解Python中的split()函数的使用方法

    函数:split() python中有split()和os.path.split()两个函数,具体作用如下: split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(li ...

  8. python中的条件判断稀硫酸_大学mooc2020用Python玩转数据期末考试查题公众号答案...

    大学mooc2020用Python玩转数据期末考试查题公众号答案 更多相关问题 下列表述或叙述中,正确的是().A.1 mol氢B.3 mol H2C.2 mol氢分子D.1 mol H 相同质量的钠 ...

  9. python中assert是什么意思_你常常看到 Python 代码中的 assert 是个啥?

    什么是 assert 呢?其实不止 Python ,很多主流的语言都有 assert ,它主要是用来检测调试你的代码问题,当你使用 assert 来检测你的代码的时候,如果是 True ,它就会直接通 ...

最新文章

  1. android 对比win10 耗电,win10系统下像何查看耗电的应用程序
  2. Office协同办公:SkyDrive
  3. dot全称_dot是什么币
  4. python常用语法和示例_使用Python中的示例进行输入和输出操作
  5. Android 相关翻译
  6. linux中awk命令_Linux / Unix中的AWK命令
  7. 使用Python下载电视剧(二):下载ts片段
  8. JS实现弹性漂浮广告代码
  9. mysql视图字段大小_在()MySQL()中,使用()_______()语句可以查看视图的字段信息,其中包括字段名、字段类...
  10. go分析和kegg分析_GO富集分析\KEGG
  11. 游戏手柄(JoyStick)的延时处理
  12. nar神经网络_动态神经网络(NAR)做预测
  13. C#、winfrom打印pnl订单窗体
  14. @Responsebody utf8 Chinese gibberish
  15. 计算机最快接口速度,实测:USB3.1究竟比USB3.0接口快多少?
  16. 鸿蒙王者荣耀想要转区吗,王者荣耀转区注意事项 你了解了吗
  17. ctf(EasySQL)
  18. 一文读懂嵌入式FPGA,改变芯片设计方式岂是闹着玩的
  19. Ajax——判断用户名是否已经注册
  20. FT4232 USB-SPI python调试笔记

热门文章

  1. 计算机测试工作原理,计算机(测试卡)诊断卡的工作原理
  2. 【JZOJ4637】大鱼海棠
  3. mysql 把表名改成大写_MYSQL将表名称修改成大写的存储过程
  4. 美创安全实验室|2020年9月勒索病毒报告
  5. HttPclient 以post方式发送json
  6. vue中使用document.getelementbyid为null
  7. 豆瓣FM-Hacker--豆瓣FM红心兆赫
  8. 金正昆-商务礼仪-百家讲坛-重点笔记1
  9. SQLMAP tamper编写(bypass 安全狗)
  10. Object和Objects(java)