如何对说唱音乐进行解释建模

27
我刚开始为一个网站工作,这个网站将帮助人们理解说唱歌手所讲的内容。用户将看到一首说唱歌曲的歌词,并能够点击某些歌词以查看解释。这里是一个屏幕截图(您也可以在这里查看该网站本身):

alt text http://img146.imageshack.us/img146/6882/clocal.png

(原始歌词已经被审查,请单击此处查看它们)

不管怎样,我的问题是如何在我的应用程序中对这些注释进行建模。现在,我正在以以下格式将歌词和注释存储为一个大的HTML块:

<div class="lyrics">
  With the goons I spy
  <a href="#note1">Stay in tune with ma</a>
  <a href="#note2">She like damn
  This the realest since 'Kumbaya'</a>
  Kumbayay Killa Cam my lord 
</div>

<div class="annotations">
  <div id="note1">
"Ma" refers to ladies, generally, and specifically also the woman singing the hook;  "Stay in tune" is a musical metaphor: he literally stays in tune with the singer and also in the sense that he has game.
  </div>
  <div id="note2">
Kumbaya is a campfire singalong.
  </div>
</div>

然后使用此方法处理它以输出:
class Song < ActiveRecord::Base
  include ActionView::Helpers

  def annotated_lyrics
    lyrics = read_attribute('annotated_lyrics')
    return if lyrics.blank?

    require 'hpricot'
    doc = Hpricot lyrics

    doc.at('.lyrics').inner_html = doc.at('.lyrics').inner_html.strip
    doc.search("a[@href^='#note']").set('class', 'tooltip').each do |t|
      t.inner_html = t.inner_html.strip
    end
    doc.search("div[@id^='note']").set('class', 'annotation').each do |a|
      a.inner_html = auto_link(a.inner_html.strip, :all, :target => '_blank')
    end
    simple_format doc.html.strip
  end
end

我使用jQuery和出色的qTip插件来完成其余部分。

这对于显示来说很好用,但由于我的应用程序不知道注释和歌词之间的关系,因此很难添加一个界面以内联方式更新单个注释(或者根本不更新)。

另一方面,我真的不知道用ActiveRecord表示这个的最佳方法。我想一首歌可以“拥有”许多注释,但是我该如何表示哪些歌词被注释了呢?我可以存储起始和结束的单词索引,但这似乎很繁琐,并且对歌词中的微小更改非常敏感。


16
说唱与Ruby on Rails相遇,启示录已至。 - MusiGenesis
6
美丽的应用程序。恭喜。 - Stefano Borini
1
最好的网站。迫不及待想要使用它。 - anthony
2
网站“完成”了,顺便看一下:http://rapexegesis.com - Tom Lehman
2
unforgiven3:审查制度很糟糕。 - bcat
显示剩余3条评论
5个回答

8
如何将歌词呈现如下所示(感谢 People's Champ)?
嘿,我是来自得克萨斯州休斯顿的木纹方向盘使用者
酒吧狂欢者,但不喝多了
我来自 Swishahouse 唱片公司
Dash 控制着这里的一切
所以检查脖子,检查手腕
我从头到脚都是球员身份
[1] 指豪华车常见的木纹方向盘 [2] Swisha House 是 Paul Wall 所在的唱片公司 [3]“看看我的手表和项链,因为它们很值钱”
只是个想法,我受到了该网站添加评论的标记语言启发。
因此,对于数据库,请创建 歌词(Lyric)、歌词行(LyricLine)和注释(Annotation)表。 注释具有 LyricLineIds、StartChar 和 EndChar 值以及说明或描述字段。LyricLines 是每行文本,通过 LyricIds 与歌词实体相关联。歌词存储歌曲信息、语言信息等。
这种格式应该很容易从数据库中生成,并且比 XML 更具“人类可读性”,可以直接进行编辑,因此在开发整个用户界面之前可以更轻松地进行测试。
我已经将此问题标记为收藏,并期待观察该网站的进展。非常有趣!

3
  1. 将您的歌词进行标记化,这样您就可以使用行和单词编号来识别歌词中的单词。另一个选项是使用字符位置进行注释。无论哪种情况,始终要注意歌词的字符编码。
  2. 此外,不要再修改歌词了。最好将它们存储为xml或纯文本,而不是html。
  3. 不要在歌词内添加注释。使用一种模型,您可以将歌词中的位置附加到注释上。使用离线注释。

离线注释将允许您随着时间的推移添加更多功能,例如让许多用户注释相同的歌词。从离线注释生成存储为blob的HTML很容易。

您可能会对语言学家非常熟悉的注释工具(例如MMAX2和Callisto)的数据模型(xml)感兴趣。这些可轻松转换为数据库模型。


1

XML也是一个很好的模型。

<song>
  <title>...</title>
  <lyrics>
    <verse>
      <line>Well it's that <dd>grain grippa</dd><dt>Referring to the wood grain steering wheel common to luxury cars</dt> from Houston, Tex</line>
      <line>That bar sippa, that bar no plex</line>
      <line>I'm straight up outta that <dd>Swishahouse</dd><dt>Swisha House is the record label Paul Wall records for</dt></line>
      <line>Where G. Dash write all the checks</line>
      <line>So <dd>check the neck, check the wrist</dd><dt>"Look at my watch and necklace because they are expensive"</dt></line>
      <line>I'm balla status from head to toe</line>
    </verse>
    <chorus>
      <line>...</line>
    </chorus>
    <verse>...</verse>
    <repeat-chorus/>
  </lyrics>
</song>

非常容易编辑和更新。 为其创建UI可能不难。 如果您将记录的创建公开给公众,可以将<dd><dt>更改为<phrase><definition>。 但是dd和dt是HTML标准,这就是我首先使用它们的原因。 这将使您能够使用纯CSS对其进行样式设置,并在JavaScript的帮助下使其看起来棒极了。(顺便说一句,该网站很棒。)


这基本上就是我们所做的(除了我们将其转换为类似于Markdown的语法进行编辑。例如,你是否见过像[梅威瑟](46513)这样的人,像[里基·哈顿](46514)一样押韵(数字是注释ID))。很高兴您喜欢这个网站! - Tom Lehman

0

你第一反应是为具有许多注释的歌曲设置关联,这肯定有效。存储开始和停止注释索引的两种潜在方法:

  1. 存储歌词出现的起始行和结束行(计算歌词文件中的换行符)

或者

  1. 存储表示注释的开始和结束单词边界(或仅空格)。这至少可以让您更正大多数拼写错误而不会破坏注释索引。

0

关于链接注释和歌词,你可以有几种方法:

  1. 按照上述建议,将注释链接到歌词的确切位置(例如,行号、词语、字符)。

  2. 创建字典短语/单词 <-> 注释。在显示之前,搜索字典并将注释插入页面中。 如果速度或特定性是问题,可以通过相关歌曲为字典中的每个条目打上标签。如果你希望你的注释对歌词中的细小改动具有鲁棒性,在找出注释短语在歌词中的匹配时使用最长公共子序列度量(Longest common subsequence metric)

  3. 结合第一种和第二种方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接