How I learn lyrics with anki

After years of using anki, I finally found a nice way to learn lyrics. I think I tried three different methods before finding one which works for me. More precisely, I found it a few months ago, and after testing it, I can finally way I found something which works.

To be more precise, I want to learn lyrics of song I love. Songs I've heard a lot of time, and whose meaning I know. The method I give here would not be efficient for a new song. In this post, I'll first explain what I want anki to do, and why I want it. I'll explain how to do it in a second part.


As a running example, I'll use the song "Everybody Knows" from Leonard Cohen. I don't know why I love this song, but I wanted to learn it. Furthermore, it's one of the rare song in English[1] in my deck of song, and I believe that it'll be more clear if you can understand the lyrics from the song. (I assume you understand english if you're reading this)

Learning verses

My first idea was to have a card by line. That's great because I can use cloze deletion to learn this way. I can also uses add-ons which helps to learn list (after all, a song is a list of lines). That was a bad idea. Indeed, let's state that I want to learn 20 songs with 50 lines on average (Everybody Knows is 49 lines long, counting the chorus only once); that's already a thousand cards. That's not practical at all. Even if each lines takes 10 seconds to check, I'll spend 2h45 on each new cards. Let's assume a line is reviewed 10 times on average (there are lines you know well, some you need to review a lot), then you'll need to spend 27 hours just to learn 20 songs. I can safely states that this is far from being an efficient use of my time.

Actually, I realized that, in a lot of cases, when I was given a line, I can easily recall the next line. For example, after the line "Everybody knows the war is over", the line "Everybody knows the good guys lost" makes a lot of sens. I mean, it's sad, but easy to recall that the good guys lost the war, and even that "everybody knows that the fight was fixed". Sometime the whole verse is about a single idea, so is easy to remember. That's the case of

"And everybody knows that you love me baby
Everybody knows that you really do
Everybody knows that you've been faithful
Ah give or take a night or two
Everybody knows you've been discreet
But there were so many people you just had to meet
Without your clothes
And everybody knows"

So, I could practice the whole verse without having to review line by line.

On the other hand, some verses are harder for me. I don't have any intuition about why the same verse speaks of a "talking to their pocket" (I don't know what it means actually), and of a box of chocolate, and a long stem rose. So this time, I need to learn line by line. Even stranger, one verse speaks of a boat leaking, and then of having a broken feeling, like their father or their dog just died. This ones does not follow a single idea and instead list various things. However, I still remember this verse easily. I guess it kind of feel good in the ears, so I can learn the whole verse together, even I would have thought that I needed to break the verse into lines.

The order of verses

I should note that the most complex part for me is not to learn verses. It's to learn the order in which verses are. When a song tells a story, it's kind of okay. For Hotel California, it's easy to remember that you get lost, and then discover the hotel, and then meet people, and then learn you can not leave. However, for Everybody Knows, there is no real order. Honestly, "naked men and women" could easily have been before "old black Joe's" or after blowing the sacred heart.

This is another reason why I'm usually more interested in anki asking me for verses than for lines. Because usually, the actual question I need to answer is not "do I now this verse" but "given a verse, do I know the one following it".

Learning pair of things

One of the standard rules when you need to learn a list is: avoid. Really, learning a list is complex, and usually it's better to learn short things. But sometime, you can't really avoid to learn a list. This is one case. But at least, if you need to learn a list, then learn things by pairs. This is totally what I do here. I first learn verses 1 and 2, then 2 and 3, and so one. And if a verse is too complex and I need to learn line by line, then I learn line 1 and 2, then line 2 and 3, and so on. And only if this fails then I'll learn line 1, then line 2, then line 3....

Note that some lines may be really long and complex. For example, Tim Minchin's If I didn't have you have plenty of those, such as "And if I may conjecture a further objection, love is nothing to do with destined perfection" and "Enough variables would probably have been altered by the absence of that event"[2]. The wors example I know is In French, with Tout c'qu'est dégueulasse porte un joli nom from Allain Leprest, which is literally a list of horrible things with a beautiful name. For those kind of songs, I don't respect the lyrics's format and simply decide that "And if I may conjecture a further objection" and "love is nothing to do with destined perfection" are two distinct lines that I'll review separately. This is not respectful to the author's intent, but that certainly makes things easier.

Order of cards

I'll now explain in which order anki show me the questions. I'll explain in next section which add-on I used to attein this goal. I'll first consider how to learn a single song. I'll then explain how I ensure to be efficient while learning multiple songs simultaneously.

One song

I'm going to speak as a mathematician in this paragraph. The main idea is that if I tell anki that I know a set S of lines, then it'll assume that I know all of the subsets of S, so it won't ask me any question about this subset. E.g. if anki sees that I know the card "verses 1 and 2" then it'll know that I know verse 1 and that I know verse 2. If it knows that I know verse 1, then it'll assume that I know each lines of verse 1. Reciprocally, if I tells anki that currently the verse 1 is too complex for me, then it won't ask me anything about verse 1 untill I know each lines of verse 1.

Practically, it means that anki will show me the card "whole song", then for verses "1 and 2", then later the card "verse 1"... And I'll tell anki that all of those cards are too complex right now, and wait until I find a card which is easy enough for me to practice. So, I will see the card "verses 1 and 2" only if I told anki I didn't know the "whole "song. I'll see the card "verse 1" only if I told anki I don't know "verses 1 and 2" and so on.

Note that after the first time I states to anki that I know the card "verses 1 and 2", anki does not yet know whether I know it well or whether I'll keep forgetting it; so it does not know whether it should still show me "verse 1" or not. So I want anki to wait until I succesfully review card "verses 1 and 2" before deciding whether to show me card "verse 1" or not. In order to avoid wasting time, I don't want anki to consider the card "verse 1" immediatly after card "verses 1 and 2". In order to achieve this goal, after "verses 1 and 2", the next card is "verses 2 and 3", and then "verses 3 an 4".... And only when anki knows which pair of verses I know or don't know will it asks for the individual verses that are required.

One really nice thing with this method is that I'll first spend time on big chunk of songs, I'll learn and review the part I already know. This is a really nice feeling. I'll see the more complex part laters, when I have already learned and reviewed all of the easy part. Having the whole easy context before practicing the complex part actually helps me learning the complex part.

Multiple song

There is some small problems with the idea I gave above. Those problems are solved by looking at multiple songs simultaneously.

Let's assume that anki shows me the card "verses 1 and 2", and after checking the answer, I realize that it's too hard and that I need to suspend this card temporarily. I can't directly work on the card "verses 2 and 3", because I can't honestly check whether I know the content of the second verse. After all, I just saw the second verse.

Let assume there is a single song I want to learn. Let's state that today, I should review verse 3 and verse 1. If anki shows me verse 3 first, I'll have seen verse 1 and so I can't really review it today. By default, anki suspend sibling cards, so actually, it's okay, I won't see this card today. That's great. But if the song is complex and I learn it line by line, I may have 10 cards from the same song to review in one day. Some cards will be 10 day late. It totally destroy anki's purpose. Furthermore, I won't see a single new cards until there is no due review. The way to avoid this is to spend a lot of time before seing two new cards of the same song.

Furthermore, I personally find cooler to have a lot of variety and to see a lot of different songs instead of spending a lot of time on one particular song.

So, what I asks anki to do is to show the cards "whole song" of every song. Then the cards "verses 1 and 2" of every song. Then the cards "verses 2 and 3" of every song, and so on... This way, there is a lot of time spent between each time I see a new card of the same song, and when I see a card "verses 2 and 3", I can be sure that I really know verse 2.

Technical part

In the previous part, I was not clear about what it means that I "know" a card or that a card is too complex. Here, I assume that I "know" a card when it's "mature" (in anki, a card is mature when it's interval is at least three weeks) or when I know a superset of this card. E.g. if I know the first verse, I know all card of the first verse.

I tells anki that a card is too complex for me by adding a red flag and suspending it.

Cutting verses

To let anki knows where the verses start, I simply let first verse start on line 1, second verse on line 11, third verse on line 21, and so on. Of course, it requires that each verse are at most 10 lines long. So if a verse is too long, I have to split it in two or three. I don't always respect the official song here, but in order to recall the song, I guess that limiting my verses to 10 lines is acceptable. What is more important to me is that each of my verse makes sens by themselves. When anki asks me for verse 2, I want to have an intuitive feeling of when the verse stop.

I should note that there are some poems with more than 20 verses. For them, I need to uses two different notes. Currently, I have a single poem which have more than 20 verses, and I believe that it's not worth the trouble to change my card type only for it.

Automating everything.

There are a lot of things I described that anki can't do. In order to do them, I created and used different add-ons. They are now listed.

Taking a lot of time before seeing two cards of a song

In order to ensure that I see all "verses 1 and 2" first, and then all "verses 2 and 3"... I had to create the add-on Choose in which order you see new cards. This add-on allows me to configure in which order cards are seen. I use the rule

"ord", "card random"

which order cards using their "ord" (e.g. the position of the card in the note) and then which randomize the position of all cards having the same card type.

I sometime need to use this add-on again, if for some reason anki put back cards in the standard order. This add-on is not efficient, and it takes 2 minutes to sort my whole collection. That's okay, since I only have needed to do it twice until now.

Not seing subset of known card

In order to ensure that, when a card is mature, some other cards get suspended because they are known, I created the add-on Trigger and actions: change one card depending on what occurs on another card. I created rules which ensured that when a card is mature, a bunch of other cards get suspended. I still need to write the reverse rules, such as «when "verse 1, line 1" and "verse 1, line 2", and ... "verse 1 line 10" are known, unsuspend the card "verse1"». The complex part here being that I need to know whether a card is suspended because it's hard, or because it's easy. E.g. is "verse 1" suspended because I already know "verses 1 and 2" or because it's too complex and I needed to spend time on each line separately. That's not really hard to create rules to deal with this case; but I'll need to store extra informations in flags, and I've not yet spent the time to do this properly.

In order for anki to be efficient, I had to create the add-on quicker anki, because otherwise it does a lot of useless computations. Those computations are usually not costly, but they become extremely costly when there are 400 card types and 200 fields in a single note type. Note that anki is currently being rewritten to be quicker, and some of the inneficiencies corrected by this add-ons are going to be corrected in anki directly.

Having a similar template for the 400 card type

In order to script the creation of card, I created and used the add-on Edit card's template with python and a domain specific language. In particular, if I want to change the card type, I can do a single change and recompile the templates.


[1] I'm French, which may explain a lot of typos in this post.

[2] I love Minchin's love song !