主要思路,使用python播放音乐,监控鼠标操作得到每一句歌词对应的时间信息,最终得到带有时间轴信息的歌词文件。使用的工具有道云笔记,主要用于在一些不能选中正文复制内容的网站上快速获取歌词,这部分应该可以用爬虫替代
pygame
1. 获取音乐歌词文件
由于我是在oricon上得到歌词,比如乃木坂46的3专里的《スカイダイビング》,歌曲发售之后在该网站都可以查找到歌词。还是以这首歌为例,歌词地址満月が消えたの歌詞 | 乃木坂46,由于无法选择复制,所以我这里得到歌词比较快捷的方法是使用有道云笔记的网页版插件,生成网页剪报,剪报可以识别网页的正文并以文档的形式保存下来,这样,我们打开云笔记找到对应的网页剪报时,里面的内容就可以复制出来了。保存成lrc.txt以备用:
2. 使用python播放音乐并打上时间轴
这里使用python的pygame的库播放音乐,在播放音乐的时候,监控鼠标的点击,鼠标进行一次点击,则认为此时出现了一句新的歌词,打上时间轴。
具体代码如下,如要使用请替换对应的文件。
# -*- coding: utf-8 -*-
filename='skydiving.mp3'
bg1='ikoma.jpg'
bg2='reika.jpg'
bg3='mai.jpg'
b='C.jpg'
import sys
import os
import pygame
from pygame.locals import *
def formattime(t):
if t/10 == 0:
return '0'+str(t)
else:
return str(t)
def ms2time(t):
m = t/60000
t = t%60000
s = t/1000
t = t%1000
minsec = formattime(m)+':'+formattime(s)+'.'+str(t)
return minsec
def playmusic():
rect=(0,0)
n=0
m=3
pygame.init()
screen = pygame.display.set_mode((300, 360), 0, 32)
#创建了一个窗口
pygame.display.set_caption("Nogizaka46")#设置窗口标题
background = pygame.transform.scale(pygame.image.load(bg1), (300, 360))
icon = pygame.image.load(b)
pygame.display.set_icon(icon)
#pygame.mixer.init()
pygame.mixer.music.load(filename)
pygame.mixer.music.play()
while True:#主循环 sds
for event in pygame.event.get():
if event.type ==QUIT:
pygame.quit()
sys.exit()
pressed_keys = pygame.key.get_pressed()
if event.type == pygame.MOUSEBUTTONDOWN:
n+=1
if n%m==0:
background = pygame.transform.scale(pygame.image.load(bg1), (300, 360))
rect = background.get_rect()
screen = pygame.display.set_mode((rect.width, rect.height))
if n%m==1:
background = pygame.transform.scale(pygame.image.load(bg2), (300, 360))
rect = background.get_rect()
screen = pygame.display.set_mode((rect.width, rect.height))
if n%m==2:
background = pygame.transform.scale(pygame.image.load(bg3), (300, 360))
rect = background.get_rect()
screen = pygame.display.set_mode((rect.width, rect.height))
t = pygame.mixer.music.get_pos() #return ms
minsec = ms2time(t)
with open('time.txt', 'a+') as f:
f.write('['+minsec+']'+'\n')
screen.blit(background,rect)
pygame.display.update()
if __name__ == "__main__":
playmusic()
运行时,播放的窗口会显示图片,图片对应代码中的bg1、bg2、bg3变量指向的图片。播放的界面如下所示,此时音乐开始播放。
在界面中进行鼠标点击操作,代码中的
if event.type == pygame.MOUSEBUTTONDOWN
会监控到并记录下点击的时刻对应音乐的播放时间,记录到time.txt文件中。每次点击之后,播放界面的小姐姐的图片都会更换哦~
音乐播放完毕,每句歌词对应的时间也记录了下来。根据歌词的分段对time.txt进行简单的修改,修改完两个文件如下所示,左右每行是一一对应的。3. 对歌词和时间文件进行合并
这个就比较简单了,按行分别读取两个txt文件并写入新的文件。由于文件的行数未知,这里使用的方法是先获取行数,然后按行依次读取。当然由于这部分比较简单,也可以不用这种方式实现。
f1 = open('lrc.txt','r')
linenum = len(f1.readlines())
f1.close()
f1 = open('lrc.txt','r')
f2 = open('time.txt','r')
for i in range(linenum):
try:
lrc = f1.readline()
time = f2.readline()
line = time.strip()+' '+lrc
with open('final.txt','a+') as f:
f.write(line)
except:
break
f1.close()
f2.close()
f.close()最后就可以得到带时间轴的歌词文件了
虽然应该是有一些播放器好像是自带类似功能的,但是自己没事写点python实现这些小功能感觉还是挺有意思的。
4. 一点疑问
在制作完歌词后校对的时候发现存在一个问题:比如3分20秒处有一句歌词A,从头开始播放,3分20秒该句歌词在音乐中出现,但是如果播放的时候不从头开始,而是跳转到3分10秒,那么歌词A会在3分25秒出现,不知道是什么原因,如有大神知道,还望赐教。
如果觉得《python播放音乐同步歌词_使用python播放音乐并制作LRC歌词文件》对你有帮助,请点赞、收藏,并留下你的观点哦!