使用Python,Pydub和ffmpeg的音频水印乐趣

几年前,在工作中,我们希望对内部制作的规范音频进行快速而肮脏的水印处理。 该操作将在未安装和许可我们常规音频制作软件的工作站上完成。 当时似乎没有什么软件可以解决这个问题。 我们发现的结果要么是粗略的外观,要么是全套音频制作软件(例如我们的制作人使用的),或者只是做得还不够。 我们希望某些非音频制作人员可以在他们的办公桌上快速轻松地使用它们。 那时我只是刚接触Python,并说我会做些什么。

在寻找最佳方法时,我遇到了jiaaro创建的Pydub库。 我发现可以轻松使用所需的功能。 我认为在本文中浏览一个非常简单的音频水印示例项目可能很有趣,该项目与我所放置的项目非常相似。 请记住,我不是专业开发人员,所以真正的开发人员可能会对我所做的某些事情大喊大叫。 我在本文中的目标是希望给其他人一些想法,并使他们知道项目中涉及的库和工具,以便他们可以以自己的方式利用它们。 当我编写更多的Python和探索更多的库时,我已经对该思想进行了调整,完善和构建,并且我相信那里的许多人将拥有无数种可以改善该基本思想的思想。

我最初在Win XP / 7上进行了以下脚本编写,并将其也转移到Win8.x / 10。 所有组件也都适用于Linux,我只是还没有在Linux机器上尝试过它……我相信唯一不同的是我使用的“右键单击上下文”功能。

我使用的/条件

我使用以下组件和条件来实现我的测试脚本。 如果您不熟悉ffmpeg和Pydub,建议您多做一些阅读,以了解它们的一般功能。 如果您的系统上还没有以下项目,则需要安装/创建以下项目:

  • Python 2.7x(我使用Win32)
  • ffmpeg(我使用Win32 static)
  • 皮杜布
  • Python 2.7x和ffmpeg应该在您的环境变量路径中
  • C:\ watermarking文件夹(我们将测试脚本放置在此目录中)
  • C:\ watermarked文件夹(我们的最终音频输出将进入此目录)
  • 在机器上任何位置都可以测试mp3音频文件(可以播放一首歌曲,我花了30秒钟的广告时间进行测试)
  • 在C:\ watermarking文件夹中名为(在我的情况下)watermark.mp3的文件用作“叠加”水印音频

剧本

输入以下脚本并将其保存在您选择的名称下。 出于本示例文章的目的,我将其命名为mine watermarkbeta.py。

  1.从Pydub导入AudioSegment 
2.导入操作系统
3.进口时间
4.导入系统
  #watermarkbeta.py,或您要使用的任何名称 
#Python音频水印脚本需要
#one参数(带有水印的音频文件的名称)
#将第二个音频文件覆盖在开头并输出
#it​​到目标文件夹/文件
#需要Pydub和ffmpeg库/框架

5. rawcom = sys.argv [1]
6.打印“现在加水印音频文件:”,rawcom
7.时间。睡眠(3)
  8. commercial = AudioSegment.from_mp3(rawcom) 
9. watermrk = AudioSegment.from_mp3(“ C:/watermarking/watermark.mp3”)
  #10-13、19行是可选的,特定于我的实现 
10.简介= watermrk(:2750)
11. mrk = watermrk(2900 :)
12. output1 =简介+商业
13. output2 = output1.overlay(mrk,位置= 3200)
#但是,如果您想播放分离音频,请尝试一下
  14. output1 = commercial.overlay(watermrk,position = 200) 
  15.(outputpath,outputfile)= os.path.split(rawcom) 
16.打印输出文件
17. dest = os.path.join('C:/ watermarked /','Copr-'+ outputfile)
18. output1.export(目标,格式=“ mp3”)
  #19行与选项10-13 abovfe配对 
19. output2.export(目标,格式=“ mp3”)
  20. sys.exit() 

  • 第1至4行:这里我们将导入我需要的特定Pydub库函数,以及该脚本的其他一些常规导入
  • 第5行:在这里,我们传递了第一个命令行参数并将其分配给rawcom 。 这是要加水印的文件的名称。 有趣的信息— sys.argv [0]是您正在运行的Python脚本的名称
  • 第6-7行:仅提供一些信息,用于故障排除和最终用户,让他们查看正在处理的文件,并使用sleep()函数延迟三秒钟(括号中的值)
  • 第8行:我们将较早传递给rawcom的值分配给Commercial ,作为AudioSegment对象,以备后用
  • 第9行:我们将水印音频文件分配给名为watermrk的AudioSegment对象,以备后用
  • 第10-13行:特定于我在创建脚本时的情况,但出于兴趣考虑,将其包括在内。 给了我一个水印音频,其中包括一个口头版权声明,然后是大声的,令人讨厌的蜂鸣声。 我们希望将语音通知贴在音频文件的开头,然后发出哔哔声。 如果在两个单独的文件中提供了水印音频,则可以将其中一个附加到开头,然后覆盖第二个。 原样,我将其用作练习,将对象分为介绍对象和mrk对象,将介绍内容添加到广告中 ,然后将mrk覆盖在结果上。 查看有关AudioSegment的Pydub文档,并查看可用的属性。 在第10–11行中使用整数值的方括号是时间,以毫秒为单位,将watermrk对象切成薄片
  • 第14行:可以使用watermrk文件对象覆盖在商业文件对象上,而不是使用10-13行(如果需要,可以随意进行分割和剪切),从而得到output1 。 这需要两个参数,一个是我们的watermrk对象,另一个是一个整数,它表示从商业音频对象开始的毫秒数,其中watermrk对象开始将其覆盖
  • 第15–16行:我们使用os.path.split函数,该函数将传递给rawcom的信息分成最后一个斜杠之前的所有内容(路径)和之后的所有内容(特定文件)。 (可选)您可以打印输出文件信息,以使用户受益
  • 第17行:我们创建了一个名为dest的对象,并使用os.path.join将带有水印的文件的输出路径与第15行的缩写“ copr-”和“ outputfile”名称合并
  • 第18行:我们现在导出带有两个参数的整个交易,第17行的“目标”值和文件格式(我们指定为“ mp3”)。

右键单击上下文

就我而言,我将为某些用户在工作站上实现最终脚本。 他们不习惯使用命令行,而且我不希望他们这样做,所以我想让他们轻松地在计算机上任何位置的音频文件上运行此方法。 我考虑了该脚本的GUI版本(确实只是出于娱乐目的而创建了一个),但经过一些研究,决定在其Windows右键单击上下文菜单中添加“水印音频”选项可能是最快,最轻松的选择。 为此,我对Windows注册表进行了更改。

这里的标准免责声明-在对注册表进行任何修改之前先对其进行备份,如果以前没有进行注册表更改,请进行一些研究以熟悉您自己。 我对您所做的任何更改所导致的任何血液,疼痛或心痛不承担任何责任:)

运行regedit.exe打开Windows注册表编辑器,然后导航到以下位置:

  HKEY_CLASSES_ROOT \ * \ shell \ 

我们要创建一个称为Watermark的密钥,并在该密钥内部创建一个称为command的密钥。 去做这个:

  • 右键单击注册表编辑器左窗格中的shell条目,然后选择new。 创建一个称为水印的新密钥
  • 右键单击新的水印密钥,然后再次选择new来创建一个名为command的密钥。在command密钥内,我们将默认值设置为以下值:
  python.exe“ C:\ watermarking \ watermarkbeta.py”“%1” 

“ C:\ watermarking \ watermarkbeta.py”是本文前面完成的脚本的路径,如果您的脚本与我的示例不同,请将其更改为适合您的脚本的路径。 “%1”是一个变量,其中包含您已传递给脚本的文件的名称,在这种情况下,我们右键单击该音频文件。

请记住默认值中各项周围的引号。 没有这些脚本,脚本将可以正常工作,除非路径中或传递给%1的值中没有空格。 如果存在空格,并且您没有在注册表中引用这些空格,则将无法正确解析这些值,并且脚本将无法执行。

您可以使用上面的注册表编辑将各种对象或可执行文件添加到右键单击上下文。

把它放在一起

在上面的指南中我没有做错任何事情的完美世界中,您现在应该可以右键单击测试豚鼠.mp3文件,从列表中选择“水印”,然后观察出现的命令行窗口简短地告诉您它在做什么。 如果成功,则现在在“ C:\ watermarked \”文件夹中,您应该找到原始文件的副本,在其开头附近覆盖了水印音频。

要考虑的事情

我现在已经将Pydub + ffmpeg用于多个项目。 Ffmpeg是一个久经考验的真正音频框架,供无数人,项目和组织使用。 尽管我不是经验丰富的Python程序员,但我对这两个项目都很满意,并且发现它们灵活易用,并且有很多选择。

以下是关于您可以做哪些事情来扩展或改进此想法的一些想法,以及我已经做过的一些事情:

  1. 我创建了一个类似的脚本,将.wav文件转换为.mp3文件,并利用了右键单击上下文功能……对Pydub进行了一些研究,然后尝试一下
  2. 在您的脚本中添加日志记录-在运行时让它打开一个日志/ txt文件,并在每次添加一个条目。 您可以包括日期和时间以及所涉及文件的名称和路径。
  3. 我在脚本中添加了Syslog功能,作为学习有关工作中的另一个系统的syslog日志的练习。 每次运行脚本时,我的测试工作站都会向Syslog服务器发送一条消息。 查看Syslog标准和协议,可以完成一些非常酷的工作
  4. 向脚本添加一些错误/异常处理。 在此示例中我没有任何内容,但是请阅读一些基本的异常处理内容,添加一个try块,并在有人尝试传递或对非音频文件加水印的情况下使其正常退出

如果您能摆脱业余时间的Python技能,我希望本文能给大家一些有关Python编程的想法,尤其是与Pydub,ffmpeg和音频处理有关的想法。