歌词软硬件(教你用 AI 做一个写歌词的软硬件)

天然谈话处置动作人为智能的一个要害分支,在咱们的生存中获得了普遍运用。个中RNN算法动作天然谈话处置的典范算法之一,是文本天生的要害本领。此刻天咱们就将运用RNN算法创造一个写歌词的软硬件。个中的界面如次:

歌词软件(教你用 AI 做一个写歌词的软件) 第1张

RNN指的是轮回神经搜集,Recurrent Neural Network。各别于前馈神经搜集的是,RNN不妨运用它里面的回顾来处置大肆时序的输出序列,这让它不妨更简单处置如不分段的手写辨别、语音辨别等。

RNN模子有比拟多的变种,这边引见最合流的RNN模子构造如次:

上海图书馆中左边是RNN模子没有按功夫打开的图,即使按功夫序列打开,则是上海图书馆中的右边局部。咱们中心查看右边局部的图。

这幅图刻画了在序列索引号tt邻近RNN的模子。个中:

歌词软件(教你用 AI 做一个写歌词的软件) 第2张

x(t)x(t)代办在序列索引号tt时演练样品的输出。同样的,x(t−1)x(t−1)和x(t+1)x(t+1)代办在序列索引号t−1t−1和t+1t+1时演练样品的输出。

歌词软件(教你用 AI 做一个写歌词的软件) 第3张

h(t)h(t)代办在序列索引号tt时模子的湮没状况。h(t)h(t)由x(t)x(t)和h(t−1)h(t−1)共通确定。

o(t)o(t)代办在序列索引号tt时模子的输入。o(t)o(t)只由模子暂时的湮没状况h(t)h(t)确定。

L(t)L(t)代办在序列索引号tt时模子的丢失因变量。

y(t)y(t)代办在序列索引号tt时演练样品序列的如实输入。

U,W,VU,W,V这三个矩阵是咱们的模子的线性联系参数,它在所有RNN搜集中是共享的,这点和DNN很不沟通。也正由于是共享了,它展现了RNN的模子的“轮回反应”的思维。

鉴于之上认知,咱们发端搭建咱们的软硬件。

试验前的筹备开始咱们运用的python本子是3.6.5所用到的库有TensorFlow,是用来演练和加载神经搜集罕见的框架,往往用来数值计划的开源软硬件库。节点表白数学操纵,线则表白在节点间彼此接洽的多维数据数组,即张量(tensor);tkinter用来绘制GUI界面包车型的士库;

Pillow库在此名目顶用来处置图片和字体等题目。由于咱们的软硬件不是空缺后台的。须要借助Image因变量增添后台。

歌词软件(教你用 AI 做一个写歌词的软件) 第4张

RNN算法搭建1、数据集处置和筹备:咱们演练的数据集运用百般歌姬的歌词本动作演练集。个中数据集放在date.txt里,个中局部数据集如次:

歌词软件(教你用 AI 做一个写歌词的软件) 第5张

2、模子的演练:模子演练的代码径直运转train.py即可演练。个中过程如次:

开始要读取数据集

歌词软件(教你用 AI 做一个写歌词的软件) 第6张

设定演练批次、步数之类

数据载入RNN举行演练即可

个中代码如次:

def train:

filename = 'date.txt'with open(filename, 'r', encoding='utf-8') as f:text = f.readreader = 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.numSeqsnumSteps = self.numStepsnumClasses = self.numClassesnumEmbedding = self.numEmbeddinguseEmbedding = self.useEmbeddingwith tf.name_scope('inputs'):self.inData = tf.placeholder(tf.int32, shape=(numSeqs, numSteps), name='inData')self.targets = tf.place百思特网holder(tf.int32, shape=(numSeqs, numSteps), name='targets')self.keepProb = tf.placeholder(tf.float32, name='keepProb')# 华文if useEmbedding:with tf.device("/cpu:0"):embedding = tf.get_variable('embedding', [numClasses, numEmbedding])self.lstmInputs = tf.nn.embedding_lookup(embedding, self.inData)# 英文else:self.lstmInputs = tf.one_hot(self.inData, numClasses)# 创造单个Celldef buildCell(self, lstmSize, keepProb):basicCell = tf.nn.rnn_cell.BasicLSTMCell(lstmSize)drop = tf.nn.rnn_cell.DropoutWrapper(basicCell, output_keep_prob=keepProb)return drop# 将单个Cell堆叠多层def buildLstm(self):lstmSize = self.lstmSizenumLayers = self.numLayerskeepProb = self.keepProbnumSeqs = self.numSeqsnumClasses = self.numClasseswith tf.name_scope('lstm'):multiCell = tf.nn.rnn_cell.MultiRNNCell([self.buildCell(lstmSize, keepProb) for _ in range(numLayers)])self.initial_state = multiCell.zero_state(numSeqs, tf.float32)self.lstmOutputs, self.finalState = tf.nn.dynamic_rnn(multiCell, self.lstmInputs, initial_state=self.initial_state)seqOutputs = tf.concat(self.lstmOutputs, 1)x = tf.reshape(seqOutputs, [-1, lstmSize])with tf.variable_scope('softmax'):softmax_w = tf.Variable(tf.truncated_normal([lstmSize, numClasses], stddev=0.1))softmax_b = tf.Variable(tf.zeros(numClasses))self.logits = tf.matmul(x, softmax_w) + softmax_bself.prediction =&nbsp百思特网;tf.nn.softmax(self.logits, name='prediction')# 计划丢失def buildLoss(self):numClasses = self.numClasseswith tf.name_scope('loss'):targets = tf.one_hot(self.targets, numClasses)targets = tf.reshape(targets, self.logits.get_shape)loss = tf.nn.softmax_cross_entropy_with_logits(logits=self.logits, labels=targets)self.loss = tf.reduce_mean(loss)# 创造优化器def buildOptimizer(self):gradClip = self.gradCliplr = self.lrtrainVars = tf.trainable_variables# 控制权重革新grads, _ = tf.clip_by_global_norm(tf.gradients(self.loss, trainVars), gradClip)trainOp = tf.train.AdamOptimizer(lr)self.optimizer = trainOp.apply_gradients(zip(grads, trainVars))# 演练def train(self, data, logStep=10, saveStep=1000, savepath='./models/', maxStep=100000):if not os.path.exists(savepath):os.mkdir(savepath)Trainprob = self.Trainprobself.session = tf.Sessionwith self.session as sess:step = 0sess.run(tf.global_variables_initializer)state_now = sess.run(self.initial_state)for x, y in data:step += 1feed_dict = {self.inData: x,self.targets: y,self.keepProb: Trainprob,self.initial_state: state_now}loss, state_now, _ = sess.run([self.loss, self.finalState, self.optimizer], feed_dict=feed_dict)if step % logStep == 0:print('[INFO]: <step>: {}/{}, loss: {:.4f}'.format(step, maxStep, loss))if step % saveStep == 0:self.saver.save(sess, savepath, global_step=step)if step > maxStep:self.saver.save(sess, savepath, global_step=step)break# 往日N个猜测值当选def GetTopN(self, preds, size, top_n=5):p = np.squeeze(preds)p[np.argsort(p)[:-top_n]] = 0p = p / np.sum(p)c = np.random.choice(size, 1, p=p)[0]return c4、歌词的天生:

歌词软件(教你用 AI 做一个写歌词的软件) 第7张

树立要害词变量,读取模子文献,输入截止即可。

代码如次:

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.packlabel=tk.Label(text="请输出要害词:",font=("微软雅黑",20))entry = tk.Entry(root, insertbackground='blue', highlightthickness=2,font=("微软雅黑",15))entry.packentry1 = tk.Text(height=15,width=115)entry1.pack

2、功效挪用:咱们运用按钮中的command参数挪用已树立好的因变量即可。个中因变量局部咱们经过天生文本和简略文本的办法读入数据和写入数据。为了提防数据臃肿故在要功夫监测反复软硬件。设置的因变量实质如次:

歌词软件(教你用 AI 做一个写歌词的软件) 第8张

def song:

ss=entry.getf=open("1.txt","w")f.write(ss)f.closeos.startfile("1.bat")while True:if os.path.exists("2.txt"):f=open("2.txt")ws=f.readf.closeentry1.insert("0.0", ws)breaktry:os.remove("1.txt")os.remove("2.txt")except:pass3、GUI代码:

所有GUI界面代码如次:

import tkinter as tk

歌词软件(教你用 AI 做一个写歌词的软件) 第9张

from PIL import ImageTk, Imageimport ostry:os.remove("1.txt")os.remove("2.txt")except:passimport osdef song:ss=entry.getf=open("1.txt","w")f.write(ss)f.closeos.startfile("1.bat")while True:if os.path.exists("2.txt"):f=open("2.txt")ws=f.readf.closeentry1.insert("0.0", ws)breaktry:os.remove("1.txt")os.remove("2.txt")except:passroot = tk.Tkroot.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.packlabel=tk.Label(text="请输出要害词:",font=("微软雅黑",20))entry = tk.Entry(root, insertbackground='blue', highlightthickness=2,font=("微软雅黑",15))entry.packentry1 = tk.Text(height=15,width=115)entry1.packbnt = tk.Button(width=15,height=2,image=photo2,command=song)canvas.create_window(100, 50, width=200, height=30,window=label)canvas.create_window(500, 50, width=630, height=30,window=entry)canvas.create_window(400, 100, width=220, height=50,window=bnt)canvas.create_window(400, 335, width=600, height=400,window=entry1)root.mainloop到这边,咱们完全的步调就搭建实行,底下为咱们步调的运转进程和截止: