使用Python 创建 AI Voice Cover

f35c076e3c896f3cb0959e9633e2041d.jpeg

这篇文章提供了使用Python文本到语音库和音频处理库逐步创建歌曲的指南。我们一起为机器赋予声音 —— 使用Python制作AI生成的声音。

介绍

您是否曾经想过,如果您最喜欢的歌曲由机器人演唱会是什么样子?随着人工智能和语音合成的最新进展,现在可以仅使用代码创建听起来逼真的歌声。在本文中,我们将介绍使用Python制作歌曲的 AI Voice Cover 的步骤。

概述

为了生成AI唱歌的声音,我们将将这个过程分为三个关键步骤:

  1. 文本到语音合成 - 将歌词转换为AI声音。

  2. 音频处理 - 处理声音以匹配歌曲。

  3. 混音 - 将AI声音与乐器混合。

我们将专注于使用开源Python库来完成每个任务,而无需从头开始编写整个代码,最终的结果将实现足够好听以通过人耳的AI Voice Cover!

文本到语音合成

第一步是将歌曲的歌词转换为计算机生成的声音演唱的音频剪辑。Python有一些出色的文本到语音库,可以为我们处理这个任务。

Coqui TTS是一个开源的神经文本到语音工具包,提供了用于生成语音的先进深度学习模型。它提供了各种语言和声音的预训练模型,不需要我们进行过多的设置。首先,安装Coqui TTS:

pip install TTS

我们可以加载一个现成模型来合成我们的歌词:

from TTS.api import TTSmodel = TTS(model_name="tts_models/en/ljspeech/tacotron2-DDC", progress_bar=False)lyrics = "Never gonna give you up, never gonna let you down" audio = model.tts(lyrics)

tts() 方法可以实现从输入文本生成音频。现在我们有一个AI声音朗读我们的歌词!还有其他好选择,如ESPnet TTS和Mozilla TTS。它们提供了类似的模型架构和预训练声音可供我们选择。

音频处理

虽然我们有一个计算机声音来朗读我们的歌词,但音调是单调的,缺乏表现力。为了使其听起来更自然,我们需要修改音频以匹配原歌曲的音调变化和节奏。CREPE(Crepe:用于音高估计的卷积表示)库可以帮助我们从原歌曲的声音中提取音调。然后,我们可以更改我们的AI声音以跟随该音调进行变化。

首先,让我们加载原歌曲并使用CREPE随时间估计音调:

import crepeoriginal_vocals, sr = librosa.load("original_song.wav")_, pitch, _ = crepe.predict(original_vocals, sr=sr, viterbi=True)

接下来,我们将使用类似PyRubberBand的工具来通过改变音调和时间而不改变长度和共振峰来操作我们的AI声音。PyRubberBand封装了Rubber Band,提供了高质量的音高转换和时间拉伸功能。我们可以创建一个RubberBandStretcher对象,并根据从原歌曲中提取的音调值设置pitch_scale:

import rubberbandsynth_vocals, sr = model.tts(lyrics)rubberband = rubberband.RubberBandStretcher(synth_vocals, sr)for i in range(len(pitch)):rubberband.set_pitch_scale(pitch[i])shifted_vocals = rubberband.stretch()

这将随着时间修改我们合成的声音的音调,以更好地匹配原始演出。一些附加效果,如颤音或共振峰转移,可以进一步提高逼真度。AutoVC库提供了这些功能,使AI语音模仿目标人声更加自然。

混音

最后一步是将处理过的AI声音与原始歌曲的器乐混合。首先,我们需要隔离器乐部分,这可以使用像Spleeter这样的专门工具来在音频文件上执行源分离来完成。

from spleeter.separate import Separatorseparator = Separator('spleeter:2stems') instrumental = separator.separate(original_song)

然后,我们使用适当的音量平衡将我们的AI封面声音覆盖在上面:

from pydub import AudioSegmentinstrumental = AudioSegment.from_wav("instrumental.wav")
ai_vocals = AudioSegment.from_wav("shifted_vocals.wav")final = instrumental.overlay(ai_vocals)final.export("ai_cover.wav", format="wav")

现在我们有一个完成的AI Voice Cover可以分享了!声音可能不完美,但通过一些调整,它们可以听起来很像人类声音。

进一步探索

为了进一步处理更复杂的歌曲,一些额外的改进可能包括:

● 合成背景和谐音以伴奏主唱。

● 为更自然的歌声实施颤音和音高滑音。

● 调整模型参数,以更好地适应目标歌手的声音。

● 在合成期间使用神经声码器,如WaveRNN,以获得更好的音频质量。

● 训练自己的自定义TTS模型,而不是使用预训练声音。

借助更先进的深度学习技术,AI唱歌声音的质量不断提高。谁知道,也许在将来,您最喜欢的歌手可能是一台计算机!

结论

生成歌曲的AI Voice Cover版本是一种探索现代语音合成和音频处理工具能力的有趣方式。使用Python库,如Coqui TTS、CREPE和PyRubberBand,我们可以组合成一个完整的工作流程,将歌词转换为逼真的歌声。

尽管还存在一些限制,但质量正在迅速提高。合成声音的应用 - 无论是音乐、播客、有声书还是其他 - 是无穷无尽的。通过一点编码和音频工程,您也可以使计算机具备歌唱的能力!

·  END  ·

HAPPY LIFE

f1a93ff74bc2a6aa503d4335ddbc403e.png

本文仅供学习交流使用,如有侵权请联系作者删除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/71629.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是原生IP?原生IP与住宅IP有何区别?

相信许多做跨境的都会接触到IP代理,比如电商平台、社媒平台、收款平台等等,都会检测IP。那也会经常听到一些词汇:原生IP、住宅IP,这两者之间有什么区别呢?什么业务需要用到呢?接下来带大家具体了解一下。 什…

时序预测 | MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络时间序列预测

时序预测 | MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络时间序列预测…

大数据课程L2——网站流量项目的算法分析数据处理

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解网站流量项目的算法分析; ⚪ 了解网站流量项目的数据处理; 一、项目的算法分析 1. 概述 网站流量统计是改进网站服务的重要手段之一,通过获取用户在网站的行为,可以分析出哪些内…

深度解读智能媒体服务的重组和进化

统一“顶设”的智能媒体服务。 邹娟|演讲者 大家好,首先欢迎各位来到LVS的阿里云专场,我是来自阿里云视频云的邹娟。我本次分享的主题为《从规模化到全智能:智能媒体服务的重组与进化》。 本次分享分为以上四部分,一是…

Web安全研究(四)

No Honor Among Thieves: A Large-Scale Analysis of Malicious Web Shells Stony Brook University Ruhr-University Bochum Web shell作为恶意脚本,攻击者将其上传到被攻陷的Web服务器,以远程执行任意命令、维护其访问权限并提升其特权。尽管在实践中它…

Kafka3.0.0版本——消费者(独立消费者消费某一个主题中某个分区数据案例__订阅分区)

目录 一、独立消费者消费某一个主题中某个分区数据案例1.1、案例需求1.2、案例代码1.3、测试 一、独立消费者消费某一个主题中某个分区数据案例 1.1、案例需求 创建一个独立消费者,消费firstTopic主题 0 号分区的数据,所下图所示: 1.2、案…

TCP/IP基础

前言: TCP/IP协议是计算机网络领域中最基本的协议之一,它被广泛应用于互联网和局域网中,实现了不同类型、不同厂家、运行不同操作系统的计算机之间的相互通信。本文将介绍TCP/IP协议栈的层次结构、各层功能以及数据封装过程,帮助您…

文心一言初体验,和ChatGPT语言理解能力比较

文章目录 第一个考验,语义理解第二个考验,历史问题的回答推荐阅读 百度旗下AI大模型文心一言宣布向全社会全面开放,所有用户都可以体验这款AI大模型了。要比较这两个语言模型,我们先设计好题目。 第一个考验,语义理解 题目1&…

Linux入门之多线程|线程的同步|生产消费模型

文章目录 一、多线程的同步 1.概念 2.条件变量 2.1条件变量概念 2.2条件变量接口 1.条件变量初始化 2.等待条件满足 3.唤醒等待 3.销毁条件变量 2.3条件变量demo 二、生产消费模型 1.生产消费模型 2.基于BlockQueue的生产者消费者模型 3.基于C用条件变量和互斥锁实…

LabVIEW对EAST长脉冲等离子体运行的陀螺稳态运行控制

LabVIEW对EAST长脉冲等离子体运行的陀螺稳态运行控制 托卡马克是实现磁约束核聚变最有希望的解决方案之一。电子回旋共振加热(ECRH是一种对托卡马克有吸引力的等离子体加热方法,具有耦合效率高,功率沉积定位好等优点。陀螺加速器是ECRH系统中…

JAVA设计模式第十讲:SPI - 业务差异解决方案

JAVA设计模式第十讲:SPI - 业务差异解决方案 我们需要在不修改源代码的情况下,动态为程序提供一系列额外的特性。首先想到的是Spring的AOP技术来构建应用插件,但是在Java自带的插件中,就有完整的实现。SPI(Service Pro…

Win7旗舰版64位桌面创建32位IE方法

很多Win7 64位旗舰版用户系统桌面上的IE8浏览器,打开后都是64位的,而很多网站并不兼容64位的IE浏览器,其实在Win764位系统中IE是分为64位和32位的,出现这样的情况可能是桌面上的IE图标指响的是64位的IE,我们只要重新添…

grid弹性布局 设置宽高一致

效果图如下: 例子:设置每行四列的弹性布局,每个盒子宽高相同,间距为10px .left_list{display: grid;grid-gap: 10px 10px;grid-template-columns: repeat(4,1fr);.list_item{height: 0;padding-bottom:100%;/*高度设置为0&#…

io和进程day03(文件IO、文件属性函数、目录相关函数)

今日任务 代码 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <sys/types.h> #include <pwd.h> #include <dirent.h> #in…

【图文并茂】C++介绍之串

1.1串 引子—— ​ 字符串简称为串&#xff0c;串是由字符元素构成的&#xff0c;其中元素的逻辑关系也是一种线性关系。串的处理在计算机非数值处理中占用重要的地位&#xff0c;如信息检索系统&#xff0c;文字编辑等都是以串数据作为处理对象 串是由零个或多个字符组成的…

得心应手应对 OOM 的疑难杂症

Java全能学习面试指南&#xff1a;https://www.javaxiaobear.cn/ 前面我们提到&#xff0c;类的初始化发生在类加载阶段&#xff0c;那对象都有哪些创建方式呢&#xff1f;除了我们常用的 new&#xff0c;还有下面这些方式&#xff1a; 使用 Class 的 newInstance 方法。使用…

[Vue3 博物馆管理系统] 使用Vue3、Element-plus的Layout 布局构建组图文章

系列文章目录 第一章 定制上中下&#xff08;顶部菜单、底部区域、中间主区域显示&#xff09;三层结构首页 第二章 使用Vue3、Element-plus菜单组件构建菜单 第三章 使用Vue3、Element-plus走马灯组件构建轮播图 第四章 使用Vue3、Element-plus tabs组件构建选项卡功能 第五章…

PHP反序列化漏洞

一、序列化&#xff0c;反序列化 序列化&#xff1a;将php对象压缩并按照一定格式转换成字符串过程反序列化&#xff1a;从字符串转换回php对象的过程目的&#xff1a;为了方便php对象的传输和存储 seriallize() 传入参数为php对象&#xff0c;序列化成字符串 unseriali…

go gin gorm连接postgres postgis输出geojson

go gin gorm连接postgres postgis输出geojson 1. 技术环境 go-gin-gorm postgres-postgis go vscode环境安装-智能提示配置 2. 简单实现代码 思路就是&#xff1a;采用原生sql实现查询、更新等&#xff0c;采用gorm的raw来执行sql语句 package mainimport ("fmt"&q…

JavaScript 之 Symbol 数据类型

一、简介 ​ symbol类型是ES6新引入的一种基本数据类型&#xff0c;该类型具有静态属性和静态方法。其中静态属性暴露了几个内建的成员对象&#xff0c;静态方法暴露了全局的symbol注册。 ​ symbol类型具有以下特点&#xff1a;① 唯一性&#xff1a;每个symbol值都是唯一的…