除了方文山,用TA你也能帮周杰伦写歌词了

周杰伦几乎陪伴了每个90后的青春,那如果AI写杰伦风格的歌词会写成怎样呢?

https://bbs-img.huaweicloud.com/blogs/img/1598708918434004288.png

首先当然我们需要准备杰伦的歌词,这里一共收录了他的十几张专辑,近5000多行歌词。

原文档格式:

https://bbs-img.huaweicloud.com/blogs/img/1598710015953085981.png

第一步数据预处理

def preprocess(data):"""对文本中的字符进行替换,空格转换成逗号;换行变为句号。"""data = data.replace(' ', ',')data = data.replace('\n', '。')words = jieba.lcut(data, cut_all=False) # 全模式切词return words

处理后结果:

前10个词: ['想要', '有', '直升机', '。', '想要', '和', '你', '飞到', '宇宙', '去']

将处理完的数据写入内存并将文本转换完数字

# 构造词典及映射vocab = set(text)vocab_to_int = {w: idx for idx, w in enumerate(vocab)}int_to_vocab = {idx: w for idx, w in enumerate(vocab)}# 转换文本为整数int_text = [vocab_to_int[w] for w in text]

构建神经网络

a. 构建输入层

def get_inputs():inputs = tf.placeholder(tf.int32, [None, None], name='inputs')targets = tf.placeholder(tf.int32, [None, None], name='targets')learning_rate = tf.placeholder(tf.float32, name='learning_rate')return inputs, targets, learning_rate

b. 构建堆叠RNN单元

其中rnn_size指的是RNN隐层神经元个数


def get_init_cell(batch_size, rnn_size):lstm = tf.contrib.rnn.BasicLSTMCell(rnn_size)cell = tf.contrib.rnn.MultiRNNCell([lstm])initial_state = cell.zero_state(batch_size, tf.float32)initial_state = tf.identity(initial_state, 'initial_state')return cell, initial_state

c. Word Embedding

因为单词太多,所以需要进行embedding,模型中加入Embedding层来降低输入词的维度

def get_embed(input_data, vocab_size, embed_dim):embedding = tf.Variable(tf.random_uniform([vocab_size, embed_dim], -1, 1))embed = tf.nn.embedding_lookup(embedding, input_data)return embed

d. 构建神经网络,将RNN层与全连接层相连

其中cell为RNN单元; rnn_size: RNN隐层结点数量;input_data即input tensor;vocab_size:词汇表大小; embed_dim: 嵌入层大小

def build_nn(cell, rnn_size, input_data, vocab_size, embed_dim):embed = get_embed(input_data, vocab_size, embed_dim)outputs, final_state = build_rnn(cell, embed)logits = tf.contrib.layers.fully_connected(outputs, vocab_size, activation_fn=None)return logits, final_state

e. 构造batch

这里我们根据batch_size和seq_length分为len//(batch_size*seq_length)个batch,每个batch包含输入和对应的目标输出

def get_batches(int_text, batch_size, seq_length):'''构造batch'''batch = batch_size * seq_lengthn_batch = len(int_text) // batchint_text = np.array(int_text[:batch * n_batch]) # 保留能构成完整batch的数量int_text_targets = np.zeros_like(int_text)int_text_targets[:-1], int_text_targets[-1] = int_text[1:], int_text[0]# 切分x = np.split(int_text.reshape(batch_size, -1), n_batch, -1)y = np.split(int_text_targets.reshape(batch_size, -1), n_batch, -1)return np.stack((x, y), axis=1) # 组合

模型训练

from tensorflow.contrib import seq2seqtrain_graph = tf.Graph()with train_graph.as_default():vocab_size = len(int_to_vocab) # vocab_sizeinput_text, targets, lr = get_inputs() # 输入tensorinput_data_shape = tf.shape(input_text)# 初始化RNNcell, initial_state = get_init_cell(input_data_shape[0], rnn_size)logits, final_state = build_nn(cell, rnn_size, input_text, vocab_size, embed_dim)# 计算softmax层概率probs = tf.nn.softmax(logits, name='probs')# 损失函数cost = seq2seq.sequence_loss(logits,targets,tf.ones([input_data_shape[0], input_data_shape[1]]))# 优化函数optimizer = tf.train.AdamOptimizer(lr)# Gradient Clippinggradients = optimizer.compute_gradients(cost)capped_gradients = [(tf.clip_by_value(grad, -1., 1.), var) for grad, var in gradients if grad is not None]train_op = optimizer.apply_gradients(capped_gradients)

训练结果

Epoch  72 Batch   24/33   train_loss = 0.108Epoch  75 Batch   25/33   train_loss = 0.104Epoch  78 Batch   26/33   train_loss = 0.096Epoch  81 Batch   27/33   train_loss = 0.111Epoch  84 Batch   28/33   train_loss = 0.119Epoch  87 Batch   29/33   train_loss = 0.130Epoch  90 Batch   30/33   train_loss = 0.141Epoch  93 Batch   31/33   train_loss = 0.138Epoch  96 Batch   32/33   train_loss = 0.153Model Trained and Saved

train_loss还不错,不过可能过拟合了。

最后让我们加载模型,看看生成情况   

 # 加载模型loader = tf.train.import_meta_graph(save_dir + '.meta')loader.restore(sess, save_dir)# 获取训练的结果参数input_text, initial_state, final_state, probs = get_tensors(loaded_graph)# Sentences generation setupgen_sentences = [prime_word]prev_state = sess.run(initial_state, {input_text: np.array([[1]])})# 生成句子for n in range(gen_length):dyn_input = [[vocab_to_int[word] for word in gen_sentences[-seq_length:]]]dyn_seq_length = len(dyn_input[0])# 预测probabilities, prev_state = sess.run([probs, final_state],{input_text: dyn_input, initial_state: prev_state})# 选择单词进行文本生成,用来以一定的概率生成下一个词pred_word = pick_word(probabilities[0][dyn_seq_length - 1], int_to_vocab)gen_sentences.append(pred_word)

https://bbs-img.huaweicloud.com/blogs/img/1598713358718032549.png

哎哟不错哦!

最后的最后我还扩大了歌词库,这次引入了更多流行歌手,来看看效果吧。

https://bbs-img.huaweicloud.com/blogs/img/1598713780339045398.png

好像更不错了!

如果你也喜欢杰伦,请点赞并分享生成的歌词。

点击这里→了解更多精彩内容

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

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

相关文章

Selenium+Request+Beautifulsoup(周杰伦,林俊杰歌词爬取)

爬去JZ的歌词是为了做一个NlLP的任务,这里是在python上使用SelenuimRequestsBeautifulSoup实现的。使用selenuim是因为会涉及到动态网页抓取,又使用Request的原因是selenium对网页抓取时是要先进行加载的因此很耗时间,而Request不需要网页加载…

爬取QQ音乐(周杰伦)

首先呢,我们打开QQ音乐搜索周杰伦 https://y.qq.com/portal/search.html#page1&searchid1&remoteplacetxt.yqq.top&tsong&w周杰伦 一切做好准备后呢,我们需要找到歌曲清单,找到client_search(客户端搜索&#xf…

【方向盘】轰动从未停止,感动从未消失。他,是周杰伦

不仅20年,不仅是青春。 本文已被https://yourbatman.cn收录;女娲Knife-Initializr工程可公开访问啦;程序员专用网盘https://wangpan.yourbatman.cn;公号后台回复“专栏列表”获取全部小而美的原创技术专栏 你好,我是方…

用Python分析周杰伦歌曲并进行数据可视化

大家好,今天我们用python分析下周杰伦歌曲。为了尽量完整地呈现从原始数据到可视化的过程,接下来我们会先简单讲解数据的预处理过程,即如何将 JSON 数据转化为Excel 格式,以及如何对周杰伦的歌曲进行分词。 本案例中的歌词数据来…

哪里可以免费听到周杰伦的歌曲?请看这里,教你免费听歌

前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。 小伙伴说想听周杰伦的音乐,有什么网站是可以免费听的,然后他发现咪咕音乐可以免费听周杰伦的歌曲,既然可以免费听,那…

计算机音乐谱大全告白气球,周杰伦《告白气球》钢琴曲谱

《告白气球》是由方文山作词,周杰伦作曲并演唱的歌曲,收录于周杰伦2016年6月24日发行的专辑《周杰伦的床边故事》中。2017年1月,这首歌曲获得Billboard Radio China 2016年度十大金曲奖。 创作背景 词作者方文山为周杰伦创作了《印地安老斑鸠…

周杰伦的歌里都有些啥?

周董的夕阳红粉丝团“被迫营业”,把蔡徐坤拉下了盘踞许久的微博超话人气榜第一,还一举破了亿。 当然,等我知道的时候,都战局已定了……作为当年会唱前三张专辑里所有歌曲的老粉,不想就这么躺赢,我今天也来给…

Python+pyecharts研究周杰伦歌词中的 秘密

一个朋友很喜欢周杰伦。 所以,前两天我跟别人去KTV,就唱的是“七里香”。 唱着唱歌,突然就好奇了起来。周杰伦的歌里,是不是还有很多的麻雀 后来发现,270首歌,140786个字,千言万语&#xff0…

周杰伦入局元宇宙,带你搞懂元宇宙怎么玩

自古以来,每个新兴产业的崛起,最关键、最重要的元素一定是流量,这对于元宇宙来说亦是如此。如果Facebook的入局元宇宙行业吸引了第一波市场流量,那么NBA球星史蒂芬库里、歌手林俊杰、周杰伦等明星入局的影响力就为“元宇宙”吸引了…

HTML网页设计:周杰伦网站

Hello朋友们!我们又见面了!是不是又到了焦头烂额忙期末设计的作业的时候了,不要担心,我来了,经过不懈的努力写出了一个比较容易懂的网页,完全足够应付你亲爱的老师的网页设计大作业! 哦&#xf…

用matlab演奏周杰伦的《七里香》

问题描述 前几天在学习matlab的时候,发现了一篇用matlab演奏音乐的文章,不禁感叹matlab居然还能这么玩!于是我就学着用matlab演奏我最喜欢听的一首歌——周杰伦的《七里香》。最后成果我已经发到B站,链接为:用matlab演…

WPF 消息传递简明教程

WPF 消息传递简明教程 独立观察员 2023 年 4 月 24 日 0、说明 参考:https://www.cnblogs.com/cdaniu/p/16852620.html 使用包:CommunityToolkit.Mvvm(8.1.0) 1、订阅 让需要使用消息的 ViewModel 继承 ObservableRecipient&#…

VMware官网注册账号之验证码问题

VMware官网注册账号之验证码问题 首先上个官网注册账号链接~ https://my.vmware.com/zh/web/vmware/registration 点我访问官网注册 然后不出意外都会看见中文版页面 这时候不要着急注册,因为你会发现验证码是这个造型的 抓狂的时候来了,不…

ChatGpt3.5 使用小记001

使用了一段时间的ChatGpt。主要的用途是向它咨询些学习的问题。因为有些它的分类是对话形式的,所以,一定问题多了,自己都不好找。故此想稍做整理,在此留存。 1.英语学习类 英语单词类,主要是因为有些近义词在中文的翻…

chatgpt赋能Python-python3_5怎么打开

Python 3.5怎么打开?教你几种方法 Python是目前非常流行的一种编程语言,几乎在所有行业都得到了广泛的应用。Python非常容易上手,且有强大的数据处理和科学计算能力。现在我们来说一下,如何在您的计算机上打开Python 3.5。 方法…

python-openCV实现银行卡卡号识别

实现效果: code import cv2 as cv import numpy as np# 轮廓排序 默认从左到右 # --cnts 待排序的轮廓列表 # --method 排序方法 自上而下,从左到右等 def sort_contours(cnts, method"left-to-right"):# 初始化反向标志和排序索引reverse F…

opencv之银行卡号识别

1.项目背景 1.1 项目介绍 这个一个opencv的经典应用,所以用它来熟悉之前的一些操作。 1.2 项目目的 通过此程序可以识别出银行卡图片中包括的银行卡卡号。 2.项目介绍 此项目主要分为两部分:模板图片处理,银行卡图片处理。 模板图片: 银行卡图片示例: 2.1 模板图片处…

【OpenCV】银行卡号识别

文章目录 前言一、环境二、代码总结 前言 本文引用其他作者代码,本文仅供记录用。详细内容可看此处 一、环境 如果提示没有imutils模块就pip install imutils 提供一个字体模板文件和银行卡图片。可以右键保存。 字体模板文件: 银行卡图片&#xff1b…

opencv-python 银行卡卡号识别

模板: 银行卡: 主要思路:用遮盖法 将无关紧要的上面和下面部分截掉,保留银行卡号差不多的位置,然后用opencv做图像处理,得到四个 连着数字的小框框,然后再在四个小框框里面提取出每一个单个的…

使用 OpenCV 和 Python 识别信用卡号

使用 OpenCV 和 Python 识别信用卡号 在之前的博文中,我们学习了如何安装 Tesseract 二进制文件并将其用于 OCR。 然后我们学习了如何使用基本的图像处理技术来清理图像以提高 Tesseract OCR 的输出。 但是,不应将 Tesseract 视为能够获得高精度的光学…