首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

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

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

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

如果对自己妥协

如果对自己说谎

即使别人原谅

我也不能原谅

就觉得有点讽刺啊。

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

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

B站 麦田农夫

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

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

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

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

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

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

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

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

分离人声命令示例:

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

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

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

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

9~14秒对比效果

44~49秒对比效果

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

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

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

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

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

作者:Crossin的编程教室

【教程】: python

【答疑】: 666

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OZmvz-2qek_Yhuh1T5V_fQDg0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

相关快讯

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券