Merge-Lrc 合并歌词的小工具

Posted 许青叶的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Merge-Lrc 合并歌词的小工具相关的知识,希望对你有一定的参考价值。

Merge-Lrc

背景

音乐区有群友希望各种乱七八糟的歌词(lrc 格式居多,里面甚至还有翻译)可以整理成单一的文件,或者一个仅翻译的歌词可以和原文的歌词合并。于是就开发了这款工具。地址:https://github.com/SofiaXu/lrc-merge

介绍

这是一个用于合并歌词的小工具,可以将多个歌词文件合并成一个歌词文件。

TL;DR

.\\Merge-Lrc.ps1 -Path "C:\\Users\\user\\Music\\*.lrc" -MergeMethod "Merge" -SplitChar " " | Out-File "C:\\Users\\user\\Music\\merged.lrc"

参数说明

参数名 是否可选 默认值 说明
Path 歌词文件路径,支持通配符。
MergeMethod Merge 合并方法。Merge 为合并所有时间相同的行,Intersect 为合并所有时间相同的行并将时间不同的行均分,Union 为合并所有时间相同的行并将时间不同的行合并。
SplitChar 空格 分隔符。
MaxInterval 10 Intersect 方法的最大间隔。如果两句歌词超过这个间隔将使用 Offset 中定义的长度来确定下一句歌词的时间。
Offset 1000 Intersect 方法的 Offset。最后一句歌词默认使用这个值。如果两句歌词超过这个间隔将使用 Offset 中定义的长度来确定下一句歌词的时间。

示例

  • 将文件夹中的所有歌词文件合并成一个歌词文件
.\\Merge-Lrc.ps1 -Path "C:\\Users\\user\\Music\\*.lrc" -MergeMethod "Merge" -SplitChar " "
  • 将文件夹中的所有歌词文件合并成一个歌词文件并保存
.\\Merge-Lrc.ps1 -Path "C:\\Users\\user\\Music\\*.lrc" -MergeMethod "Merge" -SplitChar " " | Out-File "C:\\Users\\user\\Music\\merged.lrc"
  • 将一个混乱的歌词文件整理合并并保存
.\\Merge-Lrc.ps1 -Path "C:\\Users\\user\\Music\\test.lrc" -MergeMethod "Intersect" -SplitChar " " | Out-File "C:\\Users\\user\\Music\\test.lrc"
  • 将一个文件夹下所有的混乱的歌词文件整理合并并保存
dir | %  .\\Merge-Lrc.ps1 -Path $_.FullName -MergeMethod "Intersect" -SplitChar " " | Out-File $_.FullName 

合并方法结果

  • 输入文件
[00:10.00][00:00.00][00:01.00]This is the original text.
[00:05.00]This is the next text.
[00:05.00]这是第二句。
[00:10.00][00:00.00][00:01.00]这是中文翻译。
  • Merge
[00:00.00]This is the original text. 这是中文翻译。
[00:01.00]This is the original text. 这是中文翻译。
[00:05.00]This is the next text. 这是第二句。
[00:10.00]This is the original text. 这是中文翻译。
  • Intersect
[00:00.00]This is the original text.
[00:00.50]这是中文翻译。
[00:01.00]This is the original text.
[00:03.00]这是中文翻译。
[00:05.00]This is the next text.
[00:07.50]这是第二句。
[00:10.00]This is the original text.
[00:11.00]这是中文翻译。
  • Union
[00:00.00]This is the original text.
[00:00.00]这是中文翻译。
[00:01.00]This is the original text.
[00:01.00]这是中文翻译。
[00:05.00]This is the next text.
[00:05.00]这是第二句。
[00:10.00]This is the original text.
[00:10.00]这是中文翻译。

R语言数据分析有意思的小例子:Prince的歌词挖掘 — 1

原文地址

Lyric Analysis with NLP & Machine Learning with R

原文的主要内容

深入挖掘Prince音乐的歌词,通过文本挖掘和探索性数据分析来进一步了解这位伟大艺术家的职业生涯。

原文的内容可以分为三个部分

  • 文本挖掘和探索新数据分析

  • 情感分析和 Topic Modeling with NLP()

  • 机器学习预测分析

对于自己这样一个不太了解音乐的人来说首先提出的问题就是
Prince是谁?

image.png

Prince(1958年6月7日—2016年4月21日),原名普林斯·罗杰斯·内尔森(Prince Rogers Nelson),美国流行歌手、词曲作家、音乐家、演员,以全面的音乐才能,华丽的服装及舞台表演著称。
Prince是位高产的音乐人,至今已发行近40张个人专辑,创作歌曲已超过千首。他精通各类乐器,绝大部分专辑的词曲创作,乐器演奏都由他自己一人包办。同时,Prince颇具实验精神,音乐风格横跨黑白乐界,几乎每次出新专辑都会融合新的音乐元素。上世纪80年代初,他所开创的独特音乐风格,被称为“明尼阿波利斯之声”,影响了许多音乐人。截止2018年,prince专辑销量已经达到1亿3千万张。此外,Prince还以胆大敢为,性格颇为古怪而著称。
Prince获得过1次奥斯卡奖、1次金球奖、7次格莱美奖、6次全美音乐奖、3次全英音乐奖、4次MTV音乐录影带大奖。他也先后在2004年入选美国摇滚名人堂、2006年入选英国音乐名人堂。2004年,《滚石杂志》评选的“100位最杰出艺人”(100 Greatest Artists of All Time),Prince名列第27。
2016年4月21日清晨,流行音乐传奇人物、以多才多艺且多产而闻名的美国歌手“王子”(Prince)纳尔逊,在明尼苏达州派斯里园宅邸辞世,享年57岁。

以上内容来自百度百科。

下面开始数据分析的内容

第一部分:数据预处理

1、读入数据,查看变量,查看数据维度

prince_orig<-read.csv("Taylor/prince_raw_data_1.csv",
                        stringsAsFactors = F,
                        header=T)
names(prince_orig)
dim(prince_orig)

2、 选择用到的变量,包括

  • 歌词文本 text

  • 歌名 song

  • 发行年份 year

  • 专辑 album

  • peak (which shows its placement on the Billboard charts)Billboard上的排名

  • US.Pop 和 US.R.B (peak positions for the US Pop and R&B charts)我理解为另外两个排行榜上的排名

prince<-prince_orig%>%
  select(lyrics=text,song,year,album,peak,
         us_pop=US.Pop,us_rnb=US.R.B)
which(prince$song == "controversy")
glimpse(prince[138,])

3、 查看数据维度

dim(prince)

我用到的数据和原文有些出入少了两行,因为读入原始数据的时候有提示

Warning message:
In scan(file = file, what = what, sep = sep, quote = quote, dec = dec,  :
  EOF within quoted string

我手动删掉了一些内容后,没有了这个警告
4、使用gsub()函数替换掉歌词文本的一些像won't can't等内容

fix.contractions<-function(doc){
  doc <- gsub("won't","will not",doc)
  doc <- gsub("can't""can not", doc)
  doc <- gsub("n't"" not", doc)
  doc <- gsub("'ll"" will", doc)
  doc <- gsub("'re"" are", doc)
  doc <- gsub("'ve"" have", doc)
  doc <- gsub("'m"" am", doc)
  doc <- gsub("'d"" would", doc)
  doc <- gsub("'s","",doc)
  return(doc)
}
prince$lyrics<-sapply(prince$lyrics,fix.contractions)

5、删除一些特殊字符

removeSpecialChars<-function(x)gsub("[^a-zA-Z0-9]"," ",x)
prince$lyrics<-sapply(prince$lyrics,removeSpecialChars)

6、将字符转化为小写字母

prince$lyrics<-sapply(prince$lyrics,tolower)

7、使用summary()函数查看数据的基本情况

> summary(prince)
    lyrics              song                year         album                peak          us_pop             us_rnb         
 Length:822         Length:822         Min.   :1978   Length:822         Min.   : 0.00   Length:822         Length:822        
 Class :character   Class :character   1st Qu.:1989   Class :character   1st Qu.: 2.00   Class :character   Class :character  
 Mode  :character   Mode  :character   Median :1996   Mode  :character   Median : 7.00   Mode  :character   Mode  :character  
                                       Mean   :1995                      Mean   :15.68                                        
                                       3rd Qu.:1999                      3rd Qu.:19.50                                        
                                       Max.   :2015                      Max.   :88.00                                        
                                       NA's   :495                       NA's   :750                                          
    decade          chart_level          charted         
 Length:822         Length:822         Length:822        
 Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character

从以上结果我们可以看到

  • 这些歌的前后跨度有37年

  • year和peak变量中有一些缺失值

缺失值可以先保留,根据后续的具体分析内容在做处理

8、将年份划分为年代

library(dplyr)
prince<-prince%>%
  mutate(decade=
           ifelse(prince$year%in% 1978:1979,"1970s",
                  ifelse(prince$year %in% 1980:1989,"1980s",
                         ifelse(prince$year %in% 1990:1999, "1990s",
                                ifelse(prince$year %in% 2000:2009, "2000s",
                                       ifelse(prince$year %in% 2010:2015, "2010s"
                                              "NA"))))))

9、将排名进行处理

  • top10

  • top100

  • 上榜

  • 没上榜

prince <- prince %>%
  mutate(chart_level = 
           ifelse(prince$peak %in% 1:10, "Top 10"
                  ifelse(prince$peak %in% 11:100, "Top 100""Uncharted")))
prince <- prince %>%
  mutate(charted = 
           ifelse(prince$peak %in% 1:100, "Charted""Uncharted"))

至此数据预处理就完成了,将结果保存到文件中

write.csv(prince,file="prince_new.csv",row.names = F,quote = F)
第二部分:对数据进行一些简单的可视化

1、柱形图展示不同的年代发行的歌曲数量

df1<-prince%>%
  filter(decade !="NA")%>%
  group_by(decade,charted)%>%
  summarise(number_of_songs=n())
dim(df1)
head(df1)
library(ggplot2)
ggplot(df1,aes(x=decade,y=number_of_songs))+
  geom_bar(aes(fill=charted),stat="identity")+
  theme_bw()+
  scale_fill_manual(values=c("#E69F00""#56B4E9"))
R语言数据分析有意思的小例子:Prince的歌词挖掘 — 1
image.png

从上图可以清楚的看到发布歌曲最多的是90年代


2、柱形图展示上榜歌曲的数量

df2<-prince%>%
  filter(peak>0)%>%
  group_by(decade,chart_level)%>%
  summarise(number_of_songs=n())
ggplot(df2,aes(x=decade,y=number_of_songs))+
  geom_bar(aes(fill=chart_level),stat="identity")+
  theme_bw()+
  scale_fill_manual(values=c("#009E73""#CC79A7"))
R语言数据分析有意思的小例子:Prince的歌词挖掘 — 1
image.png

从上图可以看出,Prince上榜的歌曲中绝大部分都排到了前10名。一个比较有意思的现象是Prince最高产是在90年代,然而歌曲上榜数量最多是在80年代。为什么会出现这个现象,这里先卖个小关子。
3、看一看在排行榜上排到第一名的都是哪些歌

library(knitr)
install.packages("kableExtra")
library(kableExtra)
install.packages("formattable")
library(formattable) 
prince %>%
  filter(peak == "1") %>%
  select(year, song, peak) %>%
  arrange(year) %>%
  mutate(year = color_tile("lightblue""lightgreen")(year)) %>%
  mutate(peak = color_tile("lightgreen""lightgreen")(peak)) %>%
  kable("html", escape = FALSE, align = "c", caption = "Prince's No. 1 Songs") %>%
  kable_styling(bootstrap_options = 
                  c("striped""condensed""bordered"), 
                full_width = FALSE)
image.png

今天的内容就到这里

小明的数据分析笔记本

公众号二维码.jpg

中国加油!武汉加油!


以上是关于Merge-Lrc 合并歌词的小工具的主要内容,如果未能解决你的问题,请参考以下文章

C#下载歌词文件

如何把不同的几个delphi程序合并为一个工具集?

Spark小文件异步合并工具类

浅谈动感歌词-歌词解析篇

急需一个可以批量获取每个word文档的页数的小工具

技巧:Vimdiff 使用