Criando um gerador automático de letras de Forró
Tags: nlp, machinelearning, python, music
Published: 2020-11-07 17:56:28

Costumo dizer que o Forró é a trilha sonora do Nordeste, é realmente algo que está no ambiente. A maioria das músicas das bandas mais conhecidas eu nunca parei realmente para ouvir, mas conheço todas elas apenas por estar no Nordeste.

Há uns meses a [Dandara Sousa](https://twitter.com/dandaramcsousa) teve uma ideia (ao meu ver) genial de aplicar conceitos de análise de dados com músicas de Forró. Como? Ela decidiu utilizar os dados das músicas da banda Calcinha Preta numa série de posts ([Vol. 1](https://dandaramcsousa.github.io/2020/05/26/dados-e-forro-vol-1.html), [Vol. 2](https://dandaramcsousa.github.io/2020/06/02/dados-e-forro-vol-2.html), [Vol. 3](https://dandaramcsousa.github.io/2020/06/11/dados-e-forro-vol-3.html)) e palestras.

Daí me surgiu a ideia de também fazer algo utilizando o forró como contexto.

No forró feito pela Calcinha Preta e muitas outras bandas, grupos e cantores, não só a melodia característica do gênero musical se destaca, mas também as letras que literalmente marcam gerações. Em sua maioria se resumem em desventuras amorosas e declarações de amor.

Seria uma máquina capaz de escrever uma música de forró comparável aos grandes cancioneiros populares? É o que veremos a seguir.

# Dados

Primeiramente vamos aos dados.

Irei utilizar as letras das músicas da [Calcinha Preta](https://www.letras.mus.br/calcinha-preta/mais-tocadas.html), [Cavaleiros do Forró](https://www.letras.mus.br/cavaleiros-do-forro/mais-tocadas.html), [Limão com Mel](https://www.letras.mus.br/limao-com-mel/mais-tocadas.html) e [Aviões do Forró](https://www.letras.mus.br/avioes-do-forro/mais-tocadas.html) disponíveis no [letras.mus.br](https://www.letras.mus.br/). Nada que um scraper não resolva.

Foram um total de 2.309 músicas.

# Pré-processamento

Para esse caso vou fazer um pré-processamento simples, apenas deixar tudo em minúsculo, separar as pontuações das palavras e colocar uma música por linha.

Esse último passo do pré-processamento eu resolvi fazer assim pois num teste anterior utilizando um verso por linha eu não obtive um bom resultado. Acredito que seja pelos versos geralmente serem bem pequenos e com pouco contexto, além de ser muito comum que uma frase seja dividida em vários versos. Nesse caso decidi colocar todos os versos de cada música numa mesma linhas, mas separados por um token (`#`).

Ou seja, o nosso algoritmo irá gerar a letra completa de uma música de uma só vez.

# Treinando o algoritmo

Para criar o modelo de geração de textos, eu vou utilizar a biblioteca [textgenrnn](https://github.com/minimaxir/textgenrnn) que possibilita criar e treinar uma rede de geração de textos com Redes Neurais Recorrentes em poucas linhas de código.

Por exemplo, treinei o modelo assim:

```python
from textgenrnn import textgenrnn

textgen = textgenrnn(name="new_model")
textgen.reset()
textgen.train_from_file(data_path, num_epochs=10,
                        gen_epochs=2, new_model=True,
                        word_level=True, rnn_bidirectional=True,
                        rnn_size=64, dim_embeddings=300)
```

# Resultados

Segue alguns exemplos de letras desse feat de Calcinha Preta, Cavaleiros do Forró, Limão com Mel e Aviões do Forró.

```
Eu não preciso de você
O que eu sinto por ti
É por favor, me faz enlouquecer
Toda segunda a me entregar
Me diga, sem me deixar, ah
Eu vou te dar o que você quiser
Eu não consigo te esquecer
Eu quero ver você falar de mim
Já cansei de esperar
Acabou nosso amor
E agora eu sofro por você
Mas eu não consigo esquecer
Você é linda e eu mais
Pra mim e não quer mais saber
De verdade
Você não vai me dominar
Você não vai me dominar
Você não é dona de mim para me dominar
```

```
Não sei o que fazer
Com tanta dor
Você não pode entender
Como a força desse amor
Vem fazer amor
Me dar calor
Me deixa louca
E me chama de ti
Digo sim pro meu coração
Isso tinha tudo que eu quis
Eu sei que te amo
Se ligue pra mim
Que nao da mais te esquecer
```

```
Você não sabe o que é amor
Me diz como é complicado
Mas não se amar ninguém é segurar
Eu amo você
Eu te amo demais
Eu não posso ficar
Eu te avisei
Eu te chamo
Quando me diz o que eu faço
Se você me vê
Agora eu me apaixonei
Por você toda vida
Eu queria ouvir você dizer
Te amo, mas
Mentir pra mim
Ainda é te amo ninguém
Hoje eu te amo, amo, amo
Sei que eu te amo, amo, amo
Amo, amo, amo...
```

```
Você é o meu amor
Só você me faz sentir tão sozinha
E agora que há 100 anos de viver
Eu não te esqueci
Nem sei o que fazer
Você me faz sofrer
Não vou deixar você fugir
Mas eu não posso te perder
Não posso te amar
Eu sei que vou ficar sozinho olhando pra você
Tenho muito medo que eu te dou
E não quis assim
Me diz o que é que eu faço pra ter você
Menina eu confesso: eu te amo demais!
```
Alguns dos versos são 100% "originais", ou seja, em nenhuma das letras tem um verso exatamente igual. Algumas vezes ele gera de 1 a 3 versos exatamente iguais a de alguma música, em outras ele gera 1 verso e meio de uma música e completa com outra música diferente.

O que eu achei mais incrível é que com pouco treinamento ele já ser capaz de gerar versos e até mesmo estrofes com uma construção gramatical correta, original e com uma certa linha de contexto.

Todos os códigos que eu utilizei estão nesse repositório.

{% github Vnicius/lyrics-generator no-readme %}