python实现AI写歌词GUI版本【文末源码】

news2024/11/23 13:36:52

**引言:**自然语言处理作为人工智能的一个重要分支,在我们的生活中得到了广泛应用。其中RNN算法作为自然语言处理的经典算法之一,是文本生成的重要手段。而今天我们就将利用RNN算法建立一个写歌词的软件。其中的界面如下:
在这里插入图片描述
RNN指的是循环神经网络,Recurrent Neural Network。不同于前馈神经网络的是,RNN可以利用它内部的记忆来处理任意时序的输入序列,这让它可以更容易处理如不分段的手写识别、语音识别等。
RNN模型有比较多的变种,这里介绍最主流的RNN模型结构如下:
在这里插入图片描述
上图中左边是RNN模型没有按时间展开的图,如果按时间序列展开,则是上图中的右边部分。我们重点观察右边部分的图。
这幅图描述了在序列索引号tt附近RNN的模型。其中:
    1)x(t)x(t)代表在序列索引号tt时训练样本的输入。同样的,x(t−1)x(t−1)和x(t+1)x(t+1)代表在序列索引号t−1t−1和t+1t+1时训练样本的输入。
    2)h(t)h(t)代表在序列索引号tt时模型的隐藏状态。h(t)h(t)由x(t)x(t)和h(t−1)h(t−1)共同决定。
    3)o(t)o(t)代表在序列索引号tt时模型的输出。o(t)o(t)只由模型当前的隐藏状态h(t)h(t)决定。
    4)L(t)L(t)代表在序列索引号tt时模型的损失函数。
    5)y(t)y(t)代表在序列索引号tt时训练样本序列的真实输出。
    6)U,W,VU,W,V这三个矩阵是我们的模型的线性关系参数,它在整个RNN网络中是共享的,这点和DNN很不相同。 也正因为是共享了,它体现了RNN的模型的“循环反馈”的思想。  
基于以上认知,我们开始搭建我们的软件。

一、实验前的准备:

首先我们使用的python版本是3.6.5所用到的库有TensorFlow,是用来训练和加载神经网络常见的框架,常常用于数值计算的开源软件库。节点表示数学操作,线则表示在节点间相互联系的多维数据数组,即张量(tensor);tkinter用来绘制GUI界面的库;
Pillow库在此项目中用来处理图片和字体等问题。因为我们的软件不是空白背景的。需要借助Image函数添加背景。

二、RNN算法搭建

1、数据集处理和准备:

我们训练的数据集使用各种歌手的歌词本作为训练集。其中数据集放在date.txt里,其中部分数据集如下:
在这里插入图片描述

2、模型的训练:

模型训练的代码直接运行train.py即可训练。其中流程如下:
1首先要读取数据集
2设定训练批次、步数等等
3数据载入RNN进行训练即可
其中代码如下:

def train():
     filename = 'date.txt'
     with open(filename, 'r', encoding='utf-8') as f:
         text = f.read()
         reader = TxtReader(text=text, maxVocab=3500)
         reader.save('voc.data')
     array = reader.text2array(text)
     generator = GetBatch(array, n_seqs=100, n_steps=100)
     model = CharRNN(
     numClasses = reader.vocabLen,
     mode ='train',
     numSeqs = 100,
     numSteps = 100,
     lstmSize = 128,
     numLayers = 2,
     lr = 0.001,
     Trainprob = 0.5,
     useEmbedding = True,
     numEmbedding = 128
     )
     model.train(
     generator,
     logStep = 10,
     saveStep = 1000,
     maxStep = 100000
     )

3、RNN网络搭建:

RNN算法的搭建,我们定义整个神经网络类,然后分别定义初始化、输入、神经元定义等函数。损失函数和优化器使用均方差和AdamOptimizer优化器即可
部分代码如下:

# 创建输入
def buildInputs(self):
    	numSeqs = self.numSeqs
    	numSteps = self.numSteps
    	numClasses = self.numClasses
    	numEmbedding = self.numEmbedding
    	useEmbedding = self.useEmbedding
    	with tf.name_scope('inputs'):
    	self.inData = tf.placeholder(tf.int32, shape=(numSeqs, numSteps), name='inData')
    	self.targets = tf.placeholder(tf.int32, shape=(numSeqs, numSteps), name='targets')
    	self.keepProb = tf.placeholder(tf.float32, name='keepProb')

4、歌词的生成:

设置关键词变量,读取模型文件,输出结果即可。
代码如下:

def main(_):
    	reader = TxtReader(filename='voc.data')
    	model = CharRNN(
    	numClasses = reader.vocabLen,
    	mode = 'test',
    	lstmSize = 128,
    	numLayers = 2,
    	useEmbedding = True,
    	numEmbedding = 128
    	)
    	checkpoint = tf.train.latest_checkpoint('./models/')
    	model.load(checkpoint)
    	key="雪花"
    	prime = reader.text2array(key)
    	array = model.test(prime, size=reader.vocabLen, n_samples=300)
    	print("《"+key+"》")
    	print(reader.array2text(array))

三、界面的定义和调用

界面中我们的布局是文本框、编辑框和按钮控件。程序的调用使用批处理文件调用以达到显示运行过程的效果。因为如果没有运行过程,难免会导致用户不清楚程序流程而强制运行容易导致卡死的情况。
其中Bat里直接写入:
python song.py
其中过程效果如下:
在这里插入图片描述

1、界面布局:

界面布局使用canvas画布以达到添加背景图片的效果。背景图片设置为1.jpg,按钮背景图片设置为3.jpg。图片也可以自己更换掉。然后文本框作为提示的效果,分别定义字体,大小等等即可
代码如下:

root = tk.Tk()
root.title('AI写歌词')
# 背景
canvas = tk.Canvas(root, width=800, height=500, bd=0, highlightthickness=0)
imgpath = '1.jpg'
img = Image.open(imgpath)
photo = ImageTk.PhotoImage(img)
imgpath2 = '3.jpg'
img2 = Image.open(imgpath2)
photo2 = ImageTk.PhotoImage(img2)
canvas.create_image(700, 400, image=photo)
canvas.pack()
label=tk.Label(text="请输入关键词:",font=("微软雅黑",20))
entry = tk.Entry(root, insertbackground='blue', highlightthickness=2,font=("微软雅黑",15))
entry.pack()
entry1 = tk.Text(height=15,width=115)
entry1.pack()

2、功能调用:

我们使用按钮中的command参数调用已设置好的函数即可。其中函数部分我们通过生成文本和删除文本的方式读入数据和写入数据。为了防止数据重叠故在要时刻监测重复软件。定义的函数内容如下:

def song():
    ss=entry.get()
    f=open("1.txt","w")
    f.write(ss)
    f.close()
    os.startfile("1.bat")
    while True:
        if os.path.exists("2.txt"):
            f=open("2.txt")
            ws=f.read()
            f.close()
        entry1.insert("0.0", ws)
        break
        try:
            os.remove("1.txt")
            os.remove("2.txt")
        except:
            pass

3、GUI代码:

整个GUI界面代码如下:

import tkinter as tk
from PIL import ImageTk, Image
import os
try:
    os.remove("1.txt")
    os.remove("2.txt")
except:
    pass
import os
def song():
    s=entry.get()
    f=open("1.txt","w")
    f.write(ss)
    f.close()
    os.startfile("1.bat")
    while True:
        if os.path.exists("2.txt"):
            f=open("2.txt")
            ws=f.read()
            f.close()
            entry1.insert("0.0", ws)
            break
    try:
        os.remove("1.txt")
        os.remove("2.txt")
    except:
        pass

到这里,我们整体的程序就搭建完成,下面为我们程序的运行过程和结果:
在这里插入图片描述在这里插入图片描述

源码地址:https://gitcode.net/qq_42279468/ai-gui.git

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

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

相关文章

使用binding时,LayoutSubscribeFragmentBinding报错

LayoutRecommendFragmentBinding是一个DataBinding类,它由编译器自动生成,用于访问布局文件中的视图。如果你在代码中看到LayoutRecommendFragmentBinding报红(提示未解析的引用),可能有以下原因: 1. 检查…

Docker 的数据管理(dockerfile)

Docker 的数据管理(dockerfile) 管理 Docker 容器中数据数据卷数据卷容器端口映射 容器互联(使用centos镜像)Docker 镜像的创建1.基于现有镜像创建2.基于本地模板创建3.基于Dockerfile 创建镜像…

Android主流网络请求开源库的对比

目录 一、为什么要用网络请求开源库? 网络请求开源库是一个将网络请求的相关功能封装好的类库 没有网络请求框架之前 App想与服务器进行网络请求交互是一件很痛苦的事:因为Android的主线程不能进行网络请求,需另开1个线程请求、考虑到线程池…

软件工程开发文档写作教程(03)—开发文档的必备条件

本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl本文参考资料:电子工业出版社《软件文档写作教程》 马平,黄冬梅编著 必备条件概述 软件系统配备软件文档不仅对于公司非常有益,而且也能够让客户从中…

【Linux】【配置】网络连接

NetworkManager介绍 NetworkManager 是一个在 Linux 系统上管理网络连接的系统服务和工具。它可以自动配置和管理有线、无线、移动宽带和虚拟专用网络 (VPN) 连接,以及其他类型的网络连接。 NetworkManager 提供了一种简单且易于使用的方法来管理网络连接&#xff…

JSP、JSTL标签

<!-- JSTL的表达式的依赖--><dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>1.1.2</version></dependency><!--Standard标签库--><dependency><groupId>java…

QGroundControl之安装调试

QGroundControl之安装调试 1. 源由2. 问题汇总2.1 摄像头播放问题2.2 Windows电脑录像和拍照保存位置2.3 Android设备录像和拍照保存位置 3. 打包资料4. 附录-QGroundControl-Video Streaming5. 附录-QGroundControl效果图6. 参考资料 1. 源由 开源软件的好处就是免费&#xf…

数字政府智慧政务一网通办解决方案2022(ppt可编辑)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。 建设成效 让政务服务全流程更“好办、智办” 智慧政务“111”架构 服务门户 统一入口、多端同步&#xff0c;一网融合、数据同源 服务门户 智能客服、智能问答、智能外呼实现…

2023一网通办一网统管一码互联一网共治建设方案(PPT可编辑)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。 智慧城市基础平台的定位 智慧城市各模块的纵向关系 智慧城市-数据中枢整体架构 数据中枢在智慧城市定位 数据中枢定位1、数据中枢是智慧城市基础平台的核心组成部分&#x…

虚拟化技术 — VirtIO 虚拟设备接口标准

目录 文章目录 目录VirtIOVirtIO 虚拟设备接口标准VirtIO 的前后端分层架构标准VirtIO 的数控路径分离架构标准VirtIO 的传输层标准 VirtIO 标准在 Linux 中的实现 VirtIO VirtIO 由 Rusty Russell 开发&#xff0c;最初是为了支持自己开发的 lguest Hypervisor&#xff0c;其…

对象存储之SeaweedFS简介及与MinIO的对比

什么是SeaweedFS&#xff1f; SeaweedFS架构&#xff1a; master service【主服务】和Volume service【卷服务】一起提供分布式对象存储服务&#xff0c;支持用户配置数据的复制和冗余策略。可选的Filer service【过滤器】和S3 service【S3服务】是对象存储之上的附加层&#x…

量子力学 学习

对于同一个竖直向上量子比特&#xff0c;不对他进行任何的干扰&#xff0c;进行第一次水平测试实验会随机得到一个一或者负一&#xff0c;之后再进行多少次水平测试实验都与第一次的试验结果是相同的。 我们换用其他的竖直向上量子比特&#xff0c;或者对原来的量子比特进行干扰…

高阶函数的面试

说说JS原型和原型链 原型&#xff1a;函数都有prototype(显示原型)属性&#xff0c;而prototype会自动初始化一个空对象&#xff0c;这个对象就是原型对象 原型对象中会有一个constructor属性,这个属性将指向了函数本身 实例化对象都有一个_proto_(隐式原型)属性&#xff0c…

Spring基于注解读取和存储对象

目录 一. 存储 Bean 对象 1. 前置工作&#xff1a;配置扫描路径 2. 使用五大类注解存储Bean对象 Controller 命名规则 Service Repository Compoent Configuration 五大类注解之间的关系 3. 使用方法注解存储Bean对象 二. 获取 Bean 对象 1. 属性注入 优点分析 缺…

详解C语言string.h中常用的14个库函数(二)

本篇博客继续讲解string.h中的库函数。在上一篇博客中&#xff0c;我介绍了strlen, strcpy, strcat, strcmp这4个字符串操作函数&#xff0c;本篇博客会继续介绍strncpy, strncat, strncmp这3个类似的函数。 strcpy, strcat, strcmp这3个函数是长度不受限制的字符串操作函数&a…

预算约束下营销效果优化的端到端框架(快手)

目录 翻译&#xff1a;预算约束下营销效果优化的端到端框架 1介绍 2 .相关工作 2.1预算分配 2.2梯度估计 3我们的端到端框架 3.1符号 ​3.2两阶段范式 3.3 Marketing Goal as a Regularizer 3.4梯度估计 ​3.5训练 4实验结果 4.1数据集 4.2评价指标 4.3实现细节 …

Windows环境下NVM安装后Node/NPM命令无法使用

问题&#xff1a;Windows环境下安装nvm后&#xff0c;使用nvm安装node&#xff0c;无法使用node相关命令。 解决方案&#xff1a;注意安装的时候有两个路径&#xff0c;第一个是nvm所在的路径&#xff0c;第二个是nodejs所在的路径&#xff0c;大家需要在对应的目录下找到路径…

基于SSM的电影订票管理系统

有需要请私信或看评论链接哦 可远程调试 基于SSM的电影订票管理系统 一 介绍 基于SSM的电影订票管理系统&#xff0c;本项目分为前台和后台&#xff0c;登录角色分为普通用户和管理员。用户可注册登录&#xff0c;个人中心&#xff0c;搜索电影&#xff0c;选座购票&#xff…

机器学习——损失函数(lossfunction)

问&#xff1a;非监督式机器学习算法使用样本集中的标签构建损失函数。 答&#xff1a;错误。非监督式机器学习算法不使用样本集中的标签构建损失函数。这是因为非监督式学习算法的目的是在没有标签的情况下发现数据集中的特定结构和模式&#xff0c;因此它们依赖于不同于监督…

QMS-云质说质量 - 5 解决中小企业质量问题的钥匙在哪里?

云质QMS原创 转载请注明来源 作者&#xff1a;王洪石 引言 一个小小的质量问题可能引发蝴蝶效应 日常生活中&#xff0c;我们每天都会遇到各种各样的问题&#xff0c;并随着它们喜怒哀乐。企业也不例外&#xff0c;即使有很好的管理体系以及非常高素质的员工&#xff0c;一些错…