forked from gloriaherrera/dalasrnn
-
Notifications
You must be signed in to change notification settings - Fork 0
/
sketch.js
157 lines (120 loc) · 3.54 KB
/
sketch.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
// ejemplo-ml5js-char-rnn
// usa biblioteca ml5.js 0.12.2 y p5.js 1.7.0
// basado en trabajo previo de @montoyamoraga
// referencia de modelo char RNN implementado en ml5.js
// https://learn.ml5js.org/#/reference/charrnn
// mas fonts en
// https://open-foundry.com/
// variable para modelo char RNN
let rnn;
// variable para generar o no texto
let generando = false;
// parametro de char RNN
let temperatura = 0.9;
// texto parte vacio
let textoActual = null;
// maximo versos a generar
let maximoVersos = 20;
// contador de verso
let versoActual = 0;
// variable para saber si estamos creando un nuevo verso o no
let crearNuevoVerso = true;
// constante con todos los caracteres en mayuscula
const caracteres = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
// variable para cargar font
let miFont = null;
// funcion a correr cuando el modelo es cargado
function modeloCargado() {
// imprimir en consola aviso de que el modelo fue cargado
console.log("modelo cargado!");
// generar texto con modelo char RNN
generar();
}
function preload() {
// cargar fuente
miFont = loadFont('./assets/WorkSans-Light.ttf');
}
// funcion de p5.js que ocurre una vez al principio
function setup() {
// crear lienzo tan grande como la pantalla
createCanvas(windowWidth, windowHeight);
// definir modelo rnn con ml5.js
// cuando el modelo se carga, correr la funcion modeloCargado
rnn = new ml5.charRNN("./models/dalas", modeloCargado);
// textoActual es un caracter aleatorio
textoActual = caracteres[int(random(caracteres.length))];
// tamano del texto
textSize(15);
// tipografia del texto
textFont(miFont);
// texto alineado al centro
textAlign(LEFT);
// color de relleno negro
fill(0);
// figuras sin borde
noStroke();
}
// funcion de p5.js que corre despues de setup(), en bucle
function draw() {
// fondo blanco
background(255);
// mostrar texto generado
text(textoActual, 10*windowWidth/100, 10*windowHeight/100);
}
function generar() {
if (generando) {
generando = false;
} else {
generando = true;
bucleRNN();
}
}
async function bucleRNN() {
while (generando) {
await predecir();
}
}
async function predecir() {
// siguiente caracter
let siguiente = await rnn.predict(temperatura);
// alimentar a RNN el siguiente caracter
await rnn.feed(siguiente.sample);
// detectar si el siguiente caracter es un salto de linea
if (siguiente.sample == "\r" || siguiente.sample == "\n") {
// si no hemos creado un nuevo verso
if (!crearNuevoVerso) {
// crear salto de linea
textoActual = textoActual + "\n";
// avisar que acabamos de crear un nuevo verso
crearNuevoVerso = true;
// aumentar en 1 el numero de verso actual
versoActual = versoActual + 1
}
}
// si el caracter no era un salto de linea
else {
// agregar el caracter al textoActual
textoActual = textoActual + siguiente.sample;
// avisar que no hemos creado un verso nuevo
crearNuevoVerso = false;
}
// si ya hicimos la cantidad de versos que queriamos
if (versoActual > maximoVersos - 1) {
// detener generacion
crearNuevoVerso = false;
versoActual = 0,5;
generando = false;
}
}
// funcion de p5.js que corre si la ventana cambia de tamano
function windowResized() {
// ajustar el lienzo al nuevo tamano
resizeCanvas(windowWidth, windowHeight);
}
// funcion de p5.js que corre si el cursor hace click
function mouseClicked() {
// empezar generacion desde el principio
textoActual = caracteres[int(random(caracteres.length))];
versoActual = 0,8;
generar();
}