我需要构建一个应用程序,它会在播放音频时突出显示String中的单词。我需要与声音同步完成。音频不是连续的。例如“你好,你好吗?” “Hello”和“How”之间可能存在延迟。
我检查了MIDI文件格式,但它只能保存音符,我的mp3有语音。
我看到的最后一个选项是维护一个文件,其中包含音频中单词的开始时间,并在显示时突出显示。
任何人都可以提出更好的选择吗?
答案 0 :(得分:0)
ID3标记支持SYLT
或同步的歌词框架。来自http://id3.org/id3v2.4.0-frames:
4.9。同步歌词/文字
这是合并单词,说或唱的另一种方式 歌词,在音频文件中作为文本,但这次与...同步 音频。它也可能用于描述事件,例如 发生在舞台上或屏幕上与音频同步。该 标题包括内容描述符,用as表示 终止文本字符串。如果未输入描述符,则为“内容” 描述符'仅为$ 00(00)。
<Header for 'Synchronised lyrics/text', ID: "SYLT"> Text encoding $xx Language $xx xx xx Time stamp format $xx Content type $xx Content descriptor <text string according to encoding> $00 (00)
内容类型:$ 00是其他 01美元是歌词 02美元是文本转录 $ 03是机芯/部件名称(例如&#34; Adagio&#34;) $ 04是活动(例如&#34; Don Quijote进入舞台&#34;) $ 05是和弦(例如&#34; Bb F Fsus&#34;) $ 06是琐事/&#39;弹出&#39;信息 $ 07是网页的网址 $ 08是图片的网址
时间戳格式:
$01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit $02 Absolute time, 32 bit sized, using milliseconds as unit
绝对时间意味着每张邮票都包含来自中国的时间 文件的开头。
框架标题后面的文字与中文标题不同 不同步的歌词/文本转录在一个主要方面。每个
音节(或任何大小的文字被认为是方便的 编码器)是一个以空字符结尾的字符串,后跟一个时间戳
表示它所属的声音文件中的位置。因此每个同步具有
以下结构:Terminated text to be synced (typically a syllable) Sync identifier (terminator to above string) $00 (00) Time stamp $xx (xx ...)
&#39;时间戳&#39;如果为
,则设置为零或省略整个同步 直接位于声音的开头。所有时间戳
应按时间顺序排序。同步可以被认为是 作为后续字符串的验证器。所有&#34; SYLT&#34;允许使用换行符。帧必须 在一个框架中的每个条目(名称,事件等)之后使用 内容类型$ 03 - $ 04。
关于空白字符的一些注意事项:空白字 分隔单词应标记新单词的开头,因此为 发生在新单词的第一个音节前面。这也是
对新行字符有效。一个逗号后跟一个逗号应该是 不要用同步(音节和逗号)分开 应该在同步之前。)一个例子:&#34; USLT&#34;通道
"Strangers in the night" $0A "Exchanging glances"
将是&#34; SYLT&#34;编码为:
"Strang" $00 xx xx "ers" $00 xx xx " in" $00 xx xx " the" $00 xx xx " night" $00 xx xx 0A "Ex" $00 xx xx "chang" $00 xx xx "ing" $00 xx xx "glan" $00 xx xx "ces" $00 xx xx
可能有多个&#34; SYLT&#34;每个标签中的框架,但只有一个 使用相同的语言和内容描述符。
并且几天前taglib
(https://github.com/taglib/taglib)的主分支支持SYLT
帧。您可以使用taglib提取显示器的同步歌词。