Extension: Rooster Lesson Editor -> Easy LingQ Lesson editing program

ROOSTER LESSON EDITOR V1.21 PATCH NOTES
Bug fixes and idea implementations from 1.20

Again with many thanks to @wadeack @jpp025 and @asad100101 for their ideas and contributions.

VIDEO OF NEW PATCH

RESIZABLE CONTAINERS

WORD WRAP TOGGLE

SENTENCE EVERYTHING

image

SMART DATA UPDATES

image

TIME STAMP ROUNDING

BUG FIXES

→ I removed the ability to delete and backspace up lines in the original editor.
→ Doesn’t send timestamps/translation info if they aren’t visible.

AUTOMATIC UPDATES

THOUGHTS ON PREMIUM VERSION

→ Add Headers to the text as well as Paragraphs/Sentences
→ Move the Paragraph/Sentence/header button to own column
→ Change delete button to small X on outside left of container
→ Generate AI lesson audio in the menu
→ Choose which voice you want to narrate whole thing
→ Choose which voice for each sentence (If you want)
→ Quick popup to insert new lesson text, if you want paragraphs, generated audio etc…
→ Add editor button to the /reader
→ Better UI design and color choices
→ Removed donation button
→ Early donaters get premium for free

If something else should be here, leave a suggestion.

2 Likes

Additional Idea: Highlight Sentence/paragraph on click:

When you click on a sentence/paragraph to type into that spot (or click to manipulate the play audio/TTS buttons), a light (but still easily seen—like a highlighter) highlight extends across the editor (containers) to follow everything on that line. This is especially helpful when you’re working with a larger text field, so you can edit quickly and easily.

Very Rough Example:

ROOSTER LESSON EDITOR PREMIUM PATCH 1.18

Patch notes for 1.10 - 1.18

For 1.10

→ GUI Layout fixed
→ Toggle Formatting/Delete buttons
→ Dark Mode toggle → Retains state
→ Starts in dark mode
→ Change font → Retains state

For 1.11
→ Added New columns for TTS
→ Added these TTS voices
const voiceMap = {
‘fi’: [
{ appName: “msspeak”, voice: “fi-FI:Female:SelmaNeural” },
{ appName: “gCloudTTS”, voice: “fi-FI:female” },
{ appName: “msspeak”, voice: “fi-FI:Female” }
],
‘zh’: {appName: ‘polly’, voice: ‘Zhiyu’},
‘ko’: {appName: ‘polly’, voice: ‘Seoyeon’},
‘ja’: {appName: ‘gCloudTTS’, voice: ‘ja-JA:Female’},
‘sv’: {appName: ‘polly’, voice: ‘Astrid’},
‘de’: {appName: ‘polly’, voice: ‘Marlene’},
‘fr’: {appName: ‘polly’, voice: ‘Celine’},
‘it’: {appName: ‘polly’, voice: ‘Carla’},
‘ru’: {appName: ‘polly’, voice: ‘Tatyana’}
};

for 1.12
→ Bug fixes for non Finnish TTS
→ Added 3 more Japanese voices
→ Added play/pause/resume button to the voices

for 1.13
→ Works with Free and Premium installed
→ Bug fix for audio after saving

for 1.14
→ GUI Update, title in dark mode, some buttons are same lined.

for 1.15
→ Added the code to display and toggle headers
(but they don’t work in link reader… , I’ll add a custom patch to the LingQ reader to display headers in the future)
→ Moved to NODE JS
→ Can now generate TTS audio for your lesson (FIREFOX ONLY)
(Chrome has stricter cross origin controls and blocks my request to the LingQ amazon bucket. Firefox allows it)

for 1.16
→ fixed dropdown for TTS on Firefox
→ Added a lot more TTS voices
→ ‘fi’: [
{ appName: “msspeak”, voice: “fi-FI:Female:SelmaNeural” },
{ appName: “gCloudTTS”, voice: “fi-FI:female” },
{ appName: “msspeak”, voice: “fi-FI:Female” }
],
‘zh’: [
{appName: ‘polly’, voice: ‘Zhiyu’},
{appName: ‘msspeak’, voice: ‘zh-HK:Female’},
],
‘ko’: [
{appName: ‘polly’, voice: ‘Seoyeon’},
{appName: ‘msspeak’, voice: ‘ko-KR:Female’}
],
‘ja’: [
{appName: ‘polly’, voice: ‘Takumi’},
{appName: ‘polly’, voice: ‘Mizuki’},
{appName: ‘gCloudTTS’, voice: ‘ja-JP:male’},
{appName: ‘gCloudTTS’, voice: ‘ja-JP:female’}
],
‘sv’: [
{appName: ‘polly’, voice: ‘Astrid’},
{appName: ‘msspeak’, name: ‘sv-SE:Female’}
],
‘de’:[
{appName: ‘polly’, voice: ‘Marlene’},
{appName: ‘polly’, voice: ‘Vicki’},
{appName: ‘msspeak’, voice: ‘de-DE:Female’},
{appName: ‘polly’, voice: ‘Hans’}
],
‘fr’:[
{appName: ‘polly’, voice: ‘Celine’},
{appName: ‘polly’, voice: ‘Lea’},
{appName: ‘polly’, voice: ‘Mathieu’},
{appName: ‘gCloudTTS’, voice: ‘fr-CA:female’}
],
‘it’: [
{appName: ‘polly’, voice: ‘Carla’},
{appName: ‘polly’, voice: ‘Bianca’},
{appName: ‘msspeak’, voice: ‘it-IT:Female’},
{appName: ‘polly’, voice: ‘Giorgio’}
],
‘ru’: [
{appName: ‘polly’, voice: ‘Tatyana’},
{appName: ‘polly’, voice: ‘Maxim’}
],
‘tr’: [{appName: ‘polly’, voice: ‘Filiz’}],
‘hk’: [{appName: ‘msspeak’, name: ‘zh-HK:Female’}],
‘nl’: [{appName: ‘polly’, voice: ‘Lotte’}],
‘srp’: [{appName: ‘gCloudTTS’, name: ‘sr-RS:female’}],
‘ar’: [{appName: ‘polly’, voice: ‘Zeina’}],
‘ca’:[
{appName: ‘msspeak’, voice: ‘ca-ES:Female’},
{appName: ‘msspeak’, voice: ‘ca-ES:Male’}
],
‘zh-t’:[
{appName: ‘msspeak’, name: ‘zh-CN:Female’},
{appName: ‘polly’, name: ‘Zhiyu’}
],
‘en’:[
{appName: ‘msspeak’, voice: ‘en-US:Female’},
{appName: ‘polly’, voice: ‘Nicole’},
{appName: ‘polly’, voice: ‘Brian’},
{appName: ‘polly’, voice: ‘Matthew’}
],
‘la’:[{appName: ‘gtts’, voice: ‘la’}],
‘eo’:[{appName: ‘eSpeak’, voice: ‘eo’}],
‘el’:[
{appName: ‘msspeak’, voice: ‘el-GR:Female’},
{appName: ‘gCloudTTS’, voice: ‘el-GR:female’}
],
‘pt’:[
{appName: ‘polly’, voice: ‘Vitoria’},
{appName: ‘polly’, voice: ‘Ricardo’},
{appName: ‘polly’, voice: ‘Cristiano’},
{appName: ‘polly’, voice: ‘Camila’}
],
‘sl’:[
{appName: ‘msspeak’, voice: ‘sl-SI:Female’},
{appName: ‘msspeak’, voice: ‘sl-SI:Male’}
]

for 1.17
→ Added current time to the play buttons

for 1.18
→ Added Input to upload a .txt file as the new lesson text. (One update method)
image

2 Likes

Edit: Another Important positive of this feature is that it doesn’t try to use Western punctuation sentence ending markers (a.k.a. periods ( . ), question marks ( ? ), etc. to separate what it perceives as a “typical sentence.” When you upload a .txt file for patching the text, it keeps each line of text as a line of text. THANK YOU SO MUCH!

I say this because I tried LingQ’s TXT file import feature for uploading lessons and it changed my txt sentences based on where it read a punctuation mark, which messed up my intended view of the text — combining sentences just because it saw no Western punctuation marks.

I was about to use the Premium Rooster Lesson Editor to patch the text to look how I initially intended it to look (basically each new line equals a paragraph — regardless of punctuation — which is how I like to view things)! So awesome!


Original Reply:

Love it! This feature is a game changer for those of us with languages that aren’t as closely knit to Western punctuation, have a hodge-podge of a lesson with no punctuation consistency*, and have a more difficult time with the built-in LingQ editor!

*Some sentences end in a specific type of punctuation, others end in another kind, and still others omit punctuation with no discernable pattern to use punctuation/symbol indicators of splitting sentences.

Plus, having an alternative and straightforward option to bulk edit target language text for lessons is nice!

I love that I can edit the text for this simply by putting each sentence on a new line in the .txt file!

P.S. For Mac users, use your TextEdit program (on the Mac by default as far as I can tell) and be sure your file saves as a plain text file (under Format) to be sure it gets saved as a .txt file. I didn’t do this at first, and it saved as an RTF file (the default format for a New Document via TextEdit), which doesn’t turn out well for your edit text, lol.

Why you should make sure your file is .txt and not RTF, lol:

A nice picture of how it looks when you do use txt :)

Excellent edition, @roosterburton!

1 Like

That is a feature I didn’t anticipate but I’m glad it works in that way! Grammarless languages, damn… what a trip.

I almost cried when I found there was a way to patch the text like this. This code has become quite intricate with the individual saves and order of operations. I like that this bulk patch method doesn’t destroy the original formatting either.

Nice find! Great way to save the ASCII codes if you ever wanted them.
You can probably use RTF just save with formatting of UTF8. I’ll add support for more file types next update.

1 Like

haha, yeah, definitely not something I expected from a Western POV (didn’t realize how limited that perspective was for me until I learned this)

I would say it’s not entirely “grammarless”, it just has a different grammar structure that isn’t always immediately clear for language learners (especially noobies, like me).

For example:

There are also sentence endings like the ones found here that serve as indications of a sentence/complete expression of thought:

  • -요
  • -ㅂ니다
  • -(으/느)ㄴ 것 같아요
  • -(으)ㄹ 수도 있어요
  • -죠 or -지요
  • -(으/느)ㄴ데요
  • -네요
  • -세요

Note: Only a *few *are listed.

Source: And also a really good explainer about the difference between the English Language and Korean:

This video actually explains some of the challenges of Korean sentences specifically, if anyone is interested:

ung-gat-ta-tai-oh at the end of every sentence… Not sure why they need so many syllables, maybe I’ll find out one day!

Short Answer: Honorifics, verb tenses, etc.

But yes, it’s a great language to dive into if you are ever interested, regardless, great to have the .txt patch text feature! :smiley: Thanks again!

I wanted it. I downloaded and installed it. I have it. I imported a lesson and clicked it. I saw it. I tried to use it. I’m lost. Help! You probably posted instructions somewhere in this thread…?

Sorry, my head is muddled after 2.5 hours of editing an imported YouTube video’s messed up captions. (All the captions just said: woo woo woo, wee wee, music, wee wee, etc…)

Hi @WillowMeDown! @roosterburton has great videos for the Rooster extensions linked on the main extension page: Web Browser Extensions (Software) for LingQ

These are ones I found particularly helpful for the Editor:

The directions for getting it to pop up are quoted below for your convenience:

More videos and visuals for the free version of the editor:

For the new .txt file feature, that is only in the Premium Version, the Patch 1.18 Video shows how to use that feature:

Edit: Note: Patch Video 1.15 shows how to use the Premium Editor Version without the .txt edit feature, but it still works the same way with the most recent patch.

1 Like

Above and beyond, thanks!

1 Like

ROOSTER LESSON EDITOR PREMIUM PATCH 1.19 - 1.31

for 1.31
→ Bug fix for loading of menu on reader page since 1.30

for 1.30
→ Bug fix for loading of menu on Chinese Traditional pages

for 1.29
→ Added Find and Replace feature
→ Bug fix for multiple X buttons next to Audio.

for 1.28
→ Now reliably opens the editing menu on Reader page. (instead of sometimes opening lesson editor page in new tab)

for 1.26/7
→ Added Line highlighting for current mouse selection


for 1.25
→ Added a Delete button (Which removes the Audio and Youtube Video from lesson)
image

for 1.24
→ Added complete LingQ Text to Speech voice map
→ Added support for 3 character languages (Serbian/Croatian)

Voice Map
const voiceMap = {
    'af':[
        {appName: "msspeak", voice: "af-ZA:Female"},
        {appName: "msspeak", voice: "af-ZA:Male"}
    ],
    'ar': [{appName: 'polly', voice: 'Zeina'}],
    'be': [{appName: 'msspeak', voice: 'be-BE:Female'}],
    'bg':[
        {appName: "msspeak", voice: "bg-BG:Female"},
        {appName: "msspeak", voice: "bg-BG:Male"}
    ],
    'ca':[
        {appName: 'msspeak', voice: 'ca-ES:Female'},
        {appName: 'msspeak', voice: 'ca-ES:Male'}
    ],
    'cs':[
        {appName: "gCloudTTS", voice: "cs-CZ:female"},
        {appName: "msspeak", voice: "cs-CZ:Male"}
    ],
    'da':[
        {appName: "polly", voice: "Sofie"},
        {appName: "gCloudTTS", voice: "da-DK:female"},
        {appName: "polly", voice: "Mads"}
    ],
    'de':[
        {appName: 'polly', voice: 'Marlene'},
        {appName: 'polly', voice: 'Vicki'},
        {appName: 'msspeak', voice: 'de-DE:Female'},
        {appName: 'polly', voice: 'Hans'}
    ],
    'el':[
        {appName: 'msspeak', voice: 'el-GR:Female'},
        {appName: 'gCloudTTS', voice: 'el-GR:female'}
    ],
    'en':[
        {appName: 'msspeak', voice: 'en-US:Female'},
        {appName: 'polly', voice: 'Nicole'},
        {appName: 'polly', voice: 'Brian'},
        {appName: 'polly', voice: 'Matthew'}
    ],
    'eo':[{appName: 'eSpeak', voice: 'eo'}],
    'es':[
        {appName: "polly", voice: "Lucia"},
        {appName: "polly", voice: "Conchita"},
        {appName: "polly", voice: "Mia"},
        {appName: "polly", voice: "Lupe"},
        {appName: "polly", voice: "Enrique"},
        {appName: "polly", voice: "Miguel"},
        {appName: "polly", voice: "Sergio"},
        {appName: "polly", voice: "Andres"},
        {appName: "polly", voice: "Pedro"}
    ],
    'fa': [
        { appName: "msspeak", voice: "fa-IR:Female" },
        { appName: "msspeak", voice: "fa-IR:Male" },
    ],
    'fi': [
        { appName: "msspeak", voice: "fi-FI:Female:SelmaNeural" },
        { appName: "gCloudTTS", voice: "fi-FI:female" },
        { appName: "msspeak", voice: "fi-FI:Female" }
    ],
    'fr':[
        {appName: 'polly', voice: 'Celine'},
        {appName: 'polly', voice: 'Lea'},
        {appName: 'polly', voice: 'Mathieu'},
        {appName: 'gCloudTTS', voice: 'fr-CA:female'}
    ],
    'gu': [
        { appName: "msspeak", voice: "gu-IN:Female" },
        { appName: "msspeak", voice: "gu-IN:Male" },
    ],
    'he':[
        {appName: "msspeak", voice: "he-IL:Male"},
        {appName: "msspeak", voice: "he-IL:Female"},
    ],
    'hk': [
        {appName: 'msspeak', voice: 'zh-HK:Female'},
        {appName: "msspeak", voice: "zh-HK:Male"}
    ],
    'hrv': [
        {appName: "msspeak", voice: "hr-HR:Female"},
        {appName: "msspeak", voice: "hr-HR:Male"}
    ],
    'hu': [
        {appName: "msspeak", voice: "hu-HU:Female"},
        {appName: "msspeak", voice: "hu-HU:Male"}
    ],
    'hy': [
        {appName: "msspeak", voice: "hy-AM:Female"},
        {appName: "msspeak", voice: "hy-AM:Male"}
    ],
    'id': [
        {appName: "gCloudTTS", voice: "id-ID:female"},
        {appName: "msspeak", voice: "id-ID:Male"}
    ],
    'is':[
        {appName: "polly", voice: "Dora"},
        {appName: "polly", voice: "Karl"},
    ],
    'it': [
        {appName: 'polly', voice: 'Carla'},
        {appName: 'polly', voice: 'Bianca'},
        {appName: 'msspeak', voice: 'it-IT:Female'},
        {appName: 'polly', voice: 'Giorgio'}
    ],
    'ja': [
        {appName: 'polly', voice: 'Takumi'},
        {appName: 'polly', voice: 'Mizuki'},
        {appName: 'gCloudTTS', voice: 'ja-JP:male'},
        {appName: 'gCloudTTS', voice: 'ja-JP:female'}
    ],
    'ka': [
        {appName: "msspeak", voice: "ka-GE:Female"},
        {appName: "msspeak", voice: "ka-GE:Male"}
    ],
    'ko': [
        {appName: 'polly', voice: 'Seoyeon'},
        {appName: 'msspeak', voice: 'ko-KR:Female'},
        {appName: "msspeak", voice: "ko-KR:Male"}
    ],
    'la':[{appName: 'gtts', voice: 'la'}],
    'mk':[{appName: "msspeak", voice: "mk-MK:Female"}],
    'ms': [
        {appName: "msspeak", voice: "ms-MY:Female"},
        {appName: "msspeak", voice: "ms-MY:Male"}
    ],
    'nl': [{appName: 'polly', voice: 'Lotte'}],
    'no':[
        {appName: "msspeak", voice: "nb-NO:Female"},
        {appName: "polly", voice: "Liv"},
        {appName: "msspeak", voice: "nb-NO:Male"}
    ],
    'pl':[
        {appName: "polly", voice: "Ewa"},
        {appName: "msspeak", voice: "pl-PL:Female"},
        {appName: "polly", voice: "Jacek"},
        {appName: "msspeak", voice: "pl-PL:Male"}
    ],
    'pt':[
        {appName: 'polly', voice: 'Vitoria'},
        {appName: 'polly', voice: 'Ricardo'},
        {appName: 'polly', voice: 'Cristiano'},
        {appName: 'polly', voice: 'Camila'}
    ],
    'ro': [
        {appName: 'polly', voice: 'Carmen'},
        {appName: "msspeak", voice: "ro-RO:Male"}
    ],
    'ru': [
        {appName: 'polly', voice: 'Tatyana'},
        {appName: 'polly', voice: 'Maxim'}
    ],
    'sk': [
        {appName: "gCloudTTS", voice: "sk-SK:female"},
        {appName: "msspeak", voice: "sk-SK:Male"}
    ],
    'sl':[
        {appName: 'msspeak', voice: 'sl-SI:Female'},
        {appName: 'msspeak', voice: 'sl-SI:Male'}
    ],
    'srp': [{appName: 'gCloudTTS', voice: 'sr-RS:female'}],
    'sv': [
        {appName: 'polly', voice: 'Astrid'},
        {appName: 'msspeak', voice: 'sv-SE:Female'}
    ],
    'sw': [
        {appName: "msspeak", voice: "sw-KE:Female"},
        {appName: "msspeak", voice: "sw-KE:Male"}
    ],
    'tl': [
        {appName: "msspeak", voice: "fil-PH:Female"},
        {appName: "msspeak", voice: "fil-PH:Male"}
    ],
    'tr': [
        {appName: "polly", voice: "Filiz"},
        {appName: "msspeak", voice: "tr-TR:Female"},
        {appName: "msspeak", voice: "tr-TR:Male"},
    ],
    'uk': [
        {appName: "gCloudTTS", voice: "uk-UA:female"},
        {appName: "msspeak", voice: "uk-UA:Female"},
        {appName: "msspeak", voice: "uk-UA:Male"},
    ],
    'zh': [
        {appName: 'polly', voice: 'Zhiyu'},
        {appName: 'msspeak', voice: 'zh-HK:Female'},
    ],
    'zh-t':[
        {appName: 'msspeak', voice: 'zh-CN:Female'},
        {appName: 'polly', voice: 'Zhiyu'}
    ]
    // ... add other languages here
};

for 1.23
→ Added more translation languages

for 1.22
→ Added Description editing popup
→ Added ‘Lesson Files’ button

for 1.21
→ Added Patch and Delete Audio Buttons
→ Changed Patch Text into a single button

for 1.20
→ Added Lesson Editor Button to Listen and Reader Modes (Auto Opens without ID)
→ Ability to open lesson editor from Library page. (Note: This should allow you to fix any lesson stuck in a death spiral timestamp)


1 Like

Hi again! Is there a way to remove a line break? I’ve imported a video from youtube, and it created too many linebreaks. Because of that some words that I want to save end up in a weird context (for instance, first word of the sentence is at the end the previous one), which messes up non-editable “source text” field. Alternatively, I’ve tried to remove the extra part from one sentence and copy it to another, but I can’t enter spaces - it toggles audio. I’ve tried to rebind “Toggle audio” with the hotkey extension, but with no avail. Or rather the new combination works, but space still toggles audio and I can’t type it in.

Hmm. If Lesson audio is being toggled with the lesson editor open it may be best to either… refresh the page, close the audio or open the extension on the lesson editor page. You can also add spaces with shift spacebar i believe.

You can also just toggle that paragraph line to a sentence and it will join them together

Lines 1/2 are joined in the translation. You can use that as a reference

Refreshing doesn’t work. No matter what I do, space toggles audio, with or without the opened editor. But Shift+space worked, thanks.

This makes it looks nicer, but the source text field is still affected. I care about it, since it is then used during the review of LingQs in tests and cannot be editted, as far as I know. So if I save the word where it is out of context, learning it with review will be a pain.

Btw, if I change something in the Editor (for instance this Sentence/Paragraph toggling), then close it, I can no longer open it again. Instead the native LingQ editor is opened in a new tab. Refreshing page helps, though.

Upd: Oops, sorry, refreshing does not help. Only re opening the lesson does.

Thank’s for letting me know. No workarounds at this stage. I’ll fix these in the next update.

Understandable. I’m guessing you’re referring to the fragment of text that is saved with the LingQed word / phrase… which would be hard to review in the SRS without sentence content.

AutoLingQ uses a larger fragment (13 words I think) but complete sentence context are harder to gather.

I’ll see what I can do about making those fields editable as well.

1 Like

That would be great!
For now it works for me just to edit the sentences myself with the Shift+Space trick (since I don’t need to do it for the entire lesson anyway and don’t care that much for the timing to be precise).

And I’ve noticed that the “space toggling audio” is not just about space and the audio. When I work in the editor, all the keys I press are actually affecting the lesson screen. So after playing around with cut-and-pasting, I’ve managed to set the status of some of the words to “Ignore”. But I don’t know if the problem is with the editor or if it is a more general LingQ bug (Firefox browser, the current (v 122.0b3) developer edition).

This seems like a really bad bug. I’ll make a patch that stop the key-binds interfering when lesson editor is open on the reader page. Thanks again for the report.

Hi @roosterburton

Would it be possible to add a search and replace feature in the Rooster Lesson Editor?

It would be very useful to edit spelling errors in transcribed lessons.

Thanks
Alan

1 Like

@alanelder

I just tried to see if Ctrl+H works but nope…! Its the history shortcut on my browser. I’ll see if there is a native option, otherwise will come up with something. Thanks for the suggestion