What comes back when a Reel is mostly music?
Not lyrics, and not a description of the song. You get one of two things, and which one depends on the music rather than on the length of the Reel. If the model heard a music bed behind no voice, it returns a short annotation in brackets — (smooth music) was the one measured on this machine — and this page strips that annotation before counting, finds 0 words left, and displays “No speech found” instead of a transcript. If the model heard nothing worth annotating, it returns [BLANK_AUDIO] or an empty string and the same heading appears. In both cases what it literally heard is printed as a tail on the same line, so the annotation is not lost: “it heard (smooth music) and nothing else.” Recognising song lyrics is a different task, and 0 of the 22,349 bytes of app.js mention lyrics, songs or instrumental passages at all.
The rest of this page is the evidence: the 20-character regular expression that decides which text survives and why an asterisk does not, the five measured music beds and what each one cost in words, the 88 token ids the model is not allowed to emit and why that list cannot delete a song title, what a 20-second clip costs in windows and bytes when it holds 0 words, and the one sentence the three sites that outrank this one have about music across 226,553 characters of their own copy.
Which annotations survive the page, and which pass straight through
The decision is made in one place. Before any word is counted, render() runs replace(/\[[^\]]*\]|\([^)]*\)/g, ' ') over the model’s full text and then tests whether anything is left. Two shapes are removed and 0 others: anything inside square brackets, and anything inside round brackets. It is a 20-character pattern, it is applied to the whole string at once rather than line by line, and it is not anchored — so an annotation in the middle of a sentence disappears exactly like one on its own line.
- [Music] and [BLANK_AUDIO] are removed. app.js names the bracket forms as “[BLANK_AUDIO]”, “[Music]” and “[Applause]” in the comment at line 403. A file whose whole content is the 9 characters
[Music]strips to an empty string, which is 0 characters and therefore 0 words, so the panel takes the no-speech branch. - (smooth music) is removed, and it was the one that slipped through. The round-bracket forms — “(smooth music)”, “(upbeat music)”, “(birds chirping)” — are recorded at line 404 as “what a music bed actually comes back as”. The comment states that before the fix a video carrying a music bed and no speech was headed “Transcript” with “2 words” on it, those two words being the annotation itself. Both shapes are stripped now.
- A song title written without brackets is not an annotation and is not stripped. If the model returns a bare line such as a title, or the word Music followed by a colon, none of that matches either alternative: there is no
[to open the first branch and no(to open the second, so the text survives, is counted as words, and is written into the .srt and .vtt like any other line. - An asterisk is deliberately left alone. The comment at line 410 says so in as many words: “*music*” is not a Whisper annotation, and a transcript is allowed to contain an asterisk. So
*music*also survives, is counted as 1 word, and reaches the export.
The one thing the pattern cannot do is distinguish an annotation from your text. It does not know that a bracket holds a sound cue; it knows that a bracket is open and later closed, and it removes what is between. A round bracket inside an otherwise normal sentence — a date, an aside, the expansion of an acronym — goes the same way, because the expression never asks what is inside before deleting it.
\[[^\]]*\]|\([^)]*\), and it matches two things: text inside square brackets and text inside round brackets. The top two rows are deleted and the result is 0 words, which is what puts “No speech found” on screen — 9 characters in the first case, 16 in the second. The bottom two rows are not deleted and are counted: *music* comes to 1 word, and a bare title with no bracket at either end survives in full and is written to the .srt and .vtt. The divider is the point of the figure — the expression never asks what a bracket contains before removing it, so a legitimate bracketed aside in your own audio is deleted by the same rule.Five music beds, measured, and what each one cost
Raising a music bed over speech is not the same as replacing speech with music, and the numbers from the two situations look nothing alike. In the measured runs on this machine, five versions of one 20-second clip were built by layering a music bed at four levels over the same voice, plus one room simulation. The reference was the model’s own clean output, not a human transcript, which is what the recorded counts below compare against.
- Speech stays present all the way to 12 dB and the transcript never empties. At a music bed 6 dB below the voice the panel still said “Transcript” and 34 words came back against 37 in the clean run — 17.4% wrong by a word-level count against that same clean output, over 23 reference words. At one level with the voice it was 35 words, at 6 dB above 35, and at 12 dB above 15 words — reduced, mangled, but not empty. 4 of 5 runs returned a transcript rather than an annotation, because a voice was in there to return.
- A bed with no voice produces an annotation and 0 words. That is the case the panel’s comment records: “a video carrying a music bed and no speech at all was headed ‘Transcript’ with ‘2 words’” before the fix. After the fix the same file gives 0 words and the heading “No speech found”, and the words the model wrote are appended to the message so you can see them.
- The room simulation lost as many words as the worst music bed. RT60 0.6 s with noise 20 dB below the voice returned 45 words from a 37-word reference — more words than it heard, not fewer. That is the failure shape to expect from reverberation rather than from music: insertion, not silence.
- Time did not change much between the beds. The five runs took 3.1 s to 4.7 s on a 20-second clip, against 20 s of audio — shorter than the clip in every case, because the model is not playing it back. A music-only Reel therefore does not cost you more waiting; it costs you the answer.
Why the model’s token list cannot delete a song title
There is a second filter in the pipeline, and it works on ids rather than on text: the model’s own generation_config.json carries a suppress_tokens list that it is not allowed to emit. On the default checkpoint that list holds 88 ids, and every one of them is below 50363 — the highest is 50362, and the lowest is 1. The list is sorted ascending, and 23 of the 88 sit below 100, which is where the multilingual model keeps its punctuation and word-fragment tokens.
- Language tokens start above the whole suppress list. The same file defines
lang_to_idwith 99 entries, and the ids run 50259–50357: <|en|> is 50259, <|es|> is 50262, the decoder start token is 50258, and no-timestamps is 50363. Every one of those is above 50362, so the suppress list never reaches them and the language switch is untouched by it. - The task slot is fixed, and it is fixed to transcribe. The file’s
forced_decoder_idsis exactly two pairs,[[1, null], [2, 50359]]: position 1 is left open and position 2 is pinned to 50359, which is the transcribe task token. The translate slot, 50358, is one below it and is never selected — app.js also passestask: 'transcribe'at line 280. So the “translate this song into English” branch of the model is switched off at the config level, not just unused by preference. - A title is ordinary vocabulary, so it is emitted like any other words. The suppress list can remove punctuation and filler; it cannot remove a word. The 88 ids in it are ids, not patterns, so there is no wildcard in the list that could match “anything that looks like a title”. Whatever the model resolves “music” into at the top of the vocabulary comes out as text, and if it is not wrapped in brackets the page keeps it. That is why the bare-title row in the figure survives, and why the only reliable way to tell a title apart from a spoken line is to listen to the clip.
- What the model does do with a bed is annotate it, not name it. The strings app.js records are shapes rather than titles: (smooth music), (upbeat music), [Music], [Applause], (birds chirping). 0 of them is a song name, and the file contains 0 instances of the words lyric, song, instrumental, BGM or soundtrack — the 8 occurrences of “music” in the whole 22,349 bytes are all inside the annotation strip or its comment.
What a 20-second Reel costs when it has no words in it
Music Reels are usually short, which is the good news: a 20-second clip is one window, not two. The window is fixed by chunk_length_s: 30 at line 282, so anything up to 30 seconds is a single pass; the stride is a sixth of that, 5 seconds, and the jump is 30−2×5 = 20 seconds, which means a clip of 20 seconds or less is one window and 60 seconds is three.
- One window is 1,920,000 bytes of float32 before the model runs. 30 seconds at 16,000 Hz is 480,000 samples, and 4 bytes each is 1,920,000 — which is also 480,000 tokens by the model’s own 4-value-per-token packing, a quarter of the 1,920,000 bytes and 0 words closer to knowing the song. For a 20-second file the array is 320,000 samples and 1,280,000 bytes, padded by the feature extractor to the full window.
- A 20-second bed with no speech paid 15,360,000 bytes of window and returned 0 words. Eight windows were pushed through in the 161.2-second run recorded on this machine — 8 × 1,920,000 = 15,360,000 bytes of float32 against 10,316,800 bytes of actual audio, a ratio of 1.489. The overlapping edges are paid for whether or not there is a word in them.
- The whole clip was 640,000 bytes as a file. The same 20-second source stored as 22,050 Hz mono 16-bit PCM is 882,000 bytes on disk; stored at 16 kHz it is 640,000 bytes, which against the 1,280,000 bytes it expands to in memory is a factor of 2 — the decoded copy is a float32 array where the file was 16-bit integers.
- Text is a rounding error next to it, which is the point. The words a 20-second clip produces come to roughly 110 characters, against 320,000 samples of signal. There is no compression shortcut here: a Reel with no speech in it is 1,280,000 bytes of input for 0 old characters of output, and the answer is the heading, not a file.
The arithmetic runs the other way at the top of the range, where a long Reel stops being cheap. A 10-minute file is 30 windows and 115,200,000 bytes of float32 pushed through the model, against 38,400,000 bytes held at 16 kHz mono; 20 minutes is 60 windows and 230,400,000 bytes of window against 76,800,000 bytes of audio. On the five short beds nothing of that mattered — the answer took 3.1 s to 4.7 s and the panel’s number was “No speech found”. A song is the cheap case in bytes and the expensive case in usefulness.
What the three sites that outrank this one say about music
Across the 33 pages the three sites publish, 226,553 characters of body text once the heading lists and the scraper’s metadata are stripped, the word “music” appears 18 times. 0 of the 18 is about a Reel whose audio is a song. The words “lyric”, “instrumental”, “background music”, “music only”, “no speech” and “silence” appear 0 times each.
- One of the three makes a claim about music, in a single clause, on one of its 33 pages. getthescript.app writes, in its How It Works step: “Our audio-first engine transcribes the spoken content, even under trending music and effects.” That is a claim about music underneath a voice — the case where 4 of the 5 measured runs still produced a transcript — and says nothing about a Reel where the music is the only content.
- 16 of the 18 uses are about making a Reel, not transcribing one. 10 on wayin.ai’s create-a-Reel blog, 3 on its dimensions blog, 3 on its length-limit blog: choose a soundtrack, use trending audio, add music in the editor. 0 of those 16 sentences is about what a transcriber returns when it hears only that soundtrack.
- The remaining use is a customer’s job title, on page 1 of speakapp.com’s audio pages. speakapp.com prints “Emma Lawson” and “Music Producer” in a testimonial on its Instagram audio download page. It is a person, not a case.
- 0 of the three describes the outcome, and 1 of the three describes a sound. None of the 226,553 characters mentions an annotation such as [Music] or (smooth music), none mentions that a music-only clip returns nothing, and none gives a way to check. That is the gap this page fills, with the measurement rather than the adjective.
Seeing the annotation before the page throws it away
The annotation is not shown in the transcript box when the model found no speech, but it is not destroyed either: 1 regex deletes it and 1 branch of the message puts it back. Both branches of the panel build the same message, and one of them inserts what the model actually wrote.
- The tail names the sound it heard, in the panel’s message rather than the transcript box. This is 1 line of text, the only place on the page where the model’s own annotation appears. When no speech survives the strip, the panel reads “The model found no spoken words in this file — it heard (smooth music) and nothing else.” The clause only appears if the model returned a non-empty string, so a genuinely silent file gives the shorter message with a full stop instead. That single sentence is the only place the round-bracket annotation is visible on this page.
- The meta line drops both the word count and the segment count. Both are conditional on speech being present, so a music-only run shows 3 fields — duration, elapsed time and model name — and nothing else — with no speech there is no “words” figure to read and no segment count to compare against.
- Timestamps do not rescue it, in either switch position. The timestamp switch writes one line per segment, but a segment needs text before it exists, and a segment whose text was deleted has no line. With the switch on, a music-only clip gives the same heading and the same sentence as with it off.
- The language picker is the second thing to check, not the first, and 99 entries in the picker all behave the same way here. The panel’s own message names it after the music case: if the picker is set to a language other than the one being spoken, “the words come back wrong or not at all”. A Reel in one language read as another returns a transcript rather than a heading, so if you see a transcript full of nonsense, the problem is the picker and not the music.
Does a Reel with only music give me the lyrics?
No. The page runs a speech-recognition model, not a lyrics transcriber: the words lyric, song, instrumental and soundtrack appear 0 times in the 22,349 bytes of app.js, and the only music shape the code names is an annotation like [Music] or (smooth music). A Reel whose audio is a song and nothing else produces no transcript here — the panel shows “No speech found” and tells you what it heard instead, which is the annotation.
Is that annotation the song title?
No, and it is not a description of the song either. The 99 language tokens in the model’s config are the only per-language switch it has; there is no “song” token and no second task slot to reach one. (smooth music) is a phrase the model emits to say “there is music here and no words I can write down”; it carries no key, tempo, artist or title. Because the page deletes it before counting, you will only see it as the tail of the no-speech message, where it is printed inside the sentence rather than in the transcript box.
Will a song title written without brackets show up as a transcript?
Yes, if the model writes one. The strip pattern only removes text inside square or round brackets, so a bare title is counted as words and written into the .txt, .srt and .vtt exports like anything else — as is *music*, which the comment at line 410 leaves alone on purpose. Neither is a recognition feature; both are lines the model happened to produce that the page has no reason to delete.
Why does a voice under loud music still give me a transcript?
Because a voice is still in the signal, and 4 of the 5 measured music beds returned a transcript for exactly that reason. Measured on this machine, a 20-second clip with a music bed 12 dB above the voice returned 15 words against 37 in the clean run — badly damaged, but not empty, and the panel headed it “Transcript” rather than “No speech found”. The empty case is when there is no voice at all, not when the music is loud.
Does turning timestamps on change anything for a music-only Reel?
No. The timestamp switch writes one line per segment, and a segment is built from the text the model returned; when the strip leaves 0 words the panel takes the no-speech branch in both switch positions, so the heading, the message and the empty transcript box are identical.
Last checked: 3 November 2026. The source counts were read from the deployed files on this machine: app.js is 22,349 bytes, with “music” 8 times (all inside the annotation comment and its message, lines 397–410 and 435), “lyric”, “song”, “instrumental”, “noise”, “threshold” and “vad” 0 times each, chunk_length_s: 30 at line 282 and task: 'transcribe' at line 280. The strip pattern, the two annotation comments and the measured “(smooth music)” result are quoted from lines 397–416. The window arithmetic — 5 seconds of stride, 20 seconds of jump, 1,920,000 bytes a window, 15,360,000 for eight windows, 1.489 of the audio, 640,000 for the 16-bit file, 60 windows and 115,200,000 bytes for 20 minutes, 22 windows and 677,160 ms of overlap on a 440-second source — was computed in Python on this machine from chunk_length_s, RATE = 16000 and the 4-byte float32 sample the Web Audio spec specifies, and every figure was printed before it was written down. The token ids, the 88 suppressed ids and the two forced decoder positions were read from the model’s own generation_config.json downloaded from huggingface.co. The five music-bed runs (37, 34, 35, 35 and 15 words, 3.1–4.7 s, RT60 0.6 s room at 45 words) are quoted from the 20-second fixture run recorded on this machine, where the reference was the model’s own clean output rather than a human transcript. The competitor figures cover 33 pages and 226,553 characters of body text held in this site’s benchmark directory, measured after the heading lists were stripped; the quoted sentences are copied exactly and attributed to the site that publishes them. What is not measured here: whether a real Instagram song comes back as a round-bracket or a square-bracket annotation for a given track, and whether a well-known melody ever returns its title in plain text — this page has not run a copyrighted song through the model and does not claim either outcome.
If the question is what you can do with words you do have, what to do with an Instagram transcript covers the three exits. If the words came out wrong rather than missing, why a video will not transcribe walks through the five causes in order. For a Reel in two languages, a Reel that mixes English and Spanish explains why one language is chosen for the whole file, and for the exact case that returns nothing at all the no-captions page sets out the two files that fail before the model is reached.