我用Python做了一个假唱鉴定器

大家好,欢迎来到 Crossin的编程教室 !

前阵子五月天演唱会到底有没有假唱的事情闹挺大。我虽然算不上五月天的粉丝,但像我们这个年纪的,只要当年弹过吉他玩儿过乐队,基本来说就不可能没有唱过五月天的歌。

所以现在再回头听《倔强》里唱:

如果对自己妥协 

如果对自己说谎 

即使别人原谅 

我也不能原谅

就觉得有点讽刺啊。

当然作为一个编程博主,这不是我们今天的重点。

这次事情最开始是因为有博主拿专业的音频软件去分析了一下五月天演唱会上的纯人声音频。

909e6b663e8238b30c4d0911b679da18.png

B站 麦田农夫

那就有人问了,这软件分析一下就能看出是不是假唱了吗?

严格来说啊,这种方式是不能绝对判断的。但五月天这个效果是实在是……

明显到不用软件你也都能听出来。

所以别说用专业软件了,我都能用Python给你写一个。

这就是我写的一个歌曲人声可视化对比程序。可以选择电脑上的歌曲,自动将其伴奏和人声分离开,然后将人声部分的频率,也就是音高,以散点图的形式绘制出来,并可以调整显示的位置和缩放大小。

c2669402b9387b23ff38ca7b653d4963.png

图表上可以同时显示两首歌的对比,并通过设定偏移量来进行对齐。这样就很容易看出两首歌曲的人声是不是有很高的相似度了。

歌曲人声分离这一步实现是用了一个叫做spleeter的库,这个库非常好用,并且提供了一个叫SpleeterGUI的独立程序。所以不光是分离人声,比如你要找一首歌的伴奏,那也直接用它就可以搞定了。

e953f0811e8b8cb2957e04b79bce53cd.png

如果是在命令行或代码中使用的话,需要安装ffmpeg、libsndfile和Python环境,并且要注意,目前spleeter还不支持Python3.11及以后版本。所以这个项目我用的是Python3.7。

分离人声命令示例:

spleeter separate -p spleeter:2stems -o output song.mp3

有了人声音频之后,通过音频处理库parselmouth获取对应的音高频率序列。

再通过可视化图表库matplotlib,将序列绘制成散点图。

拿这首歌的原版进行对比。(蓝色点为演唱会,红色点为专辑原曲)

64c9999b38207564af52f03ad0a9bb07.png

9~14秒对比效果

e16c7748c783283d6b2ddd9db4fb11b2.png

44~49秒对比效果

然后你就会发现啊,前面一部分还挺不一样的,但到后面突然就有很高的重合度了。这个和我们直观的听感也是相吻合的。

所以都这种程度了还去抠字眼到底是不是假唱其实也没啥意思,就看大家自己怎么想了。

程序的界面部分,用的还是tkinter库,并且仍然是靠AI完成了大部分的代码框架。

503ac92ffb572ba437d36b5c0aefffdf.png

为了能调节展示的位置和缩放大小,还需要做一些额外的计算处理,并关联在GUI的控件事件上。这部分精细活儿AI不是很给力,还得靠自己动手解决。

59082f30a9b290502cffd4c9d60c1b58.png

程序已经开源,需要的请自行获取。

9baaa281e83b91cf7927cbb453795e35.png

作者:Crossin的编程教室

感谢转发点赞的各位~


_往期文章推荐_

Python里安装了库却报错找不到是怎么回事?

陈皓|编程能力与编程年龄


【教程】: python

【答疑】: 666

更多资源请在公众号内搜索或留言

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Crossin的编程教室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值