如何模拟说唱音乐的解释

时间:2009-08-20 01:26:26

标签: ruby-on-rails activerecord model

我刚开始在一个网站上工作,这将有助于人们了解说唱歌手正在谈论什么。用户将看到一首说唱歌曲的歌词,他们将能够点击某些歌词来查看解释。这是截图(您还可以查看网站本身here):

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

(原始歌词审查; click here查看)

无论如何,我的问题是如何在我的应用程序中建模这些注释。现在,我将歌词和注释存储为这种格式的一大块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中表示这个的最佳方法。我想一首歌可以“has_many”注释,但我如何表示哪些歌词被注释?我可以存储开始和结束单词索引,但这似乎很痛苦,并且对歌词中的微小变化很敏感。

5 个答案:

答案 0 :(得分:8)

如何呈现这样的歌词(感谢People's Champ)?

Well it's that [grain grippa][1] from Houston, Tex
That bar sippa, that bar no plex
I'm straight up outta that [Swishahouse][2]
Where G. Dash write all the checks
So [check the neck, check the wrist][3]
I'm balla status from head to toe

[1]Referring to the wood grain steering wheel common to luxury cars
[2]Swisha House is the record label Paul Wall records for
[3]"Look at my watch and necklace because they are expensive"

只是一个想法,我受到了用于在此网站上添加评论的标记的启发。

因此,对于数据库,请创建Lyric,LyricLine和Annotation表。注释具有LyricLineIds,StartChar和EndChar值以及含义或描述字段。 LyricLines是每行的文本,与LyricIds的Lyric实体相关。歌词存储歌曲信息,语言信息等等。

这种格式应该很容易从数据库中生成,并且具有比XML更“人类可读”且可就地编辑的好处,因此您可以在开发整个UI之前更轻松地测试它

我对这个问题很感兴趣,并期待看到网站的进展。有趣的工作!

答案 1 :(得分:3)

  1. 对您的歌词进行标记,以便您可以使用以下标题识别歌词中的单词。一行和一个单词编号。另一种选择是使用注释的字符位置。无论如何,一如既往,要注意歌词的字符编码。
  2. 此外,再也不要触摸歌词了。最好不要将它们存储为html,而是存储为xml或纯文本。
  3. 不要在歌词中注释。使用一种模型,您可以在其中将歌词中的位置附加到注释。使用对峙注释。
  4. Stand-off注释允许您随着时间的推移添加更多功能,例如让许多用户注释相同的歌词。通过对齐注释生成您存储为blob的HTML很容易。

    您可能对语言学家众所周知的注释工具的(xml)数据模型感兴趣:例如MMAX2和Callisto。这些可以轻松转换为数据库模型。

答案 2 :(得分: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,使它看起来很棒。 (顺便说一句,该网站很棒。)

答案 3 :(得分:0)

你设置与一首有很多注释的歌曲联想的第一直觉肯定会奏效。存储开始和停止注释索引的两种可能方法:

  1. 存储歌词发生的开始和结束行(计算歌词文件中的换行符)
    1. 存储表示注释的开始和结束字边界(或仅空格)。这至少可以让你在不破坏注释索引的情况下纠正大多数错别字。

答案 4 :(得分:0)

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

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

  2. 制作字典短语/单词&lt; - &gt;注解。就在显​​示搜索之前 字典并插入页面注释。 如果速度或特异性与每个条目有关 字典可以由相关歌曲标记。如果你想要你的注释是健壮的 歌词中的小变化,而不是在注释短语使用的歌词中找到匹配 Longest common subsequence metric

  3. 结合#1和#2