上一篇中,我们可以自定义输入汉字,然后用点阵字来展现,接下来我们挖掘下更有趣的玩法。想法来自于听歌时桌面动态歌词,我们的点阵字既然可以自定义输入识别,何不读取歌词文件随着歌曲播放动态显示呢?

最终效果如下,在Python代码播放歌曲的同时,用点阵字来动态显示歌词:https://www.zhihu.com/video/1069000048066641920

下面介绍设计思路:

歌词lrc文件

这个以前玩mp3的应该不陌生,就是配在歌曲mp3文件边上的那个后缀lrc文件。lrc是英文lyric即歌词的缩写。Lrc文件可以用文本编辑器直接打开,其内容分为标识标签和时间标签,如图

标识标签指 [ti:歌曲名]、[ar:歌手名]、[al:专辑名]、 [offset:时间补偿值]这类介绍信息。

时间标签指[mm:ss.ff]加对应歌词,mm:ss.ff是分钟和精确到百分位的秒数,当歌曲播放到特定的时间点,根据时间标签读取对应的歌词文本,实现歌词同步、动态显示。

搞清lrc的格式,任务也就很清晰了,读取文件中的时间标签,解析出我们需要的时间和对应的歌词文本,定时按文本打印输出点阵字就可以了。

代码

import re

import time

import printPlay

import codecs

openLyric = codecs.open("无条件.lrc",encoding='utf-8')

lyricList = openLyric.readlines()

timeTable = []

lyricDict = {}

timeDict = {}

pattern = r'\d{2}:\d{2}.\d{2}'

for str in lyricList:

strList = str.split(']')

for i in range(len(strList)-1):

if re.match(pattern,strList[i][1:]):

t = (int(strList[i][1:][:2]) * 60 + int(strList[i][1:][3:5]))+ int(strList[i][1:][6:8])*0.01

timeTable.append(t)

lyricDict[t] = strList[-1][:-1]

#print(lyricDict)

#print(timeTable)

p = 0

for t in timeTable:

time.sleep(t-temp)

temp = t

text = ''.join(lyricDict[t].split(' '))

#printPlay.printPlay(text,'★',' ')

printPlay.printPlay(text, '0', ' ')

读取时间标签

涉及到lrc文件的编码格式,直接读取会报错,引入codecs来读取文件。

读取文本我采用了readlines(),读取整个文件所有行,每行作为一个元素保存到一个列表list中。学python的新手朋友可以回顾下读取文件read()、readline()和这里的readlines()的区别,这里选用readlines() 是因为lrc本身不大,直接读到列表中也方便后续操作。

接下来都是Python入门的应用,拿到了读取出的列表,接下来要遍历列表,也就是检查每一项,挑选出符合时间标签格式的字符串,把字符串分离成时间数字和歌词文本。

按时间打印歌词

拿“[00:02.88]无条件“为例,在第2.88秒时将“无条件”打印输出,再到下一句的5.59秒,输出下一个文本,这里我才用了最简单的方式利用time模块的time.sleep(t) 来推迟执行命令。这样缺点是忽略了执行代码的运行时间,还要计算两句歌词间的时间差来进行赋值。不过好在影响不大而且这样做代码简单、新手友好,就先采用这方案好了。

歌词转点阵字

这里可以拿之前写的代码直接用,导入定义点阵字打印方法的py文件名 import printPlay,在新的代码文件中直接调用printPlay.printPlay()就好了。

相较之前的printPlay.py文件,我做了些改动,将运行printPlay.py时要执行的代码放入main中然后name先做个判断再执行。

name是标识模块名字的一个系统变量:假如当前模块是主模块来直接执行,那么此模块名字就是main,通过判断直接执行主函数内容;假如此模块是被import的,则此模块名字为文件名字,跳过if语句中的内容,再被import中的文件中,通过 文件名.函数 来执行被调用的函数。

def main():

inpt = input("写你所想:")

#lineSign = '■'

lineSign = "0"

#backgroundSign = '○'

backgroundSign = "."

printPlay(inpt,lineSign,backgroundSign)

if __name__ == '__main__':

main()

歌曲播放

歌词搞定,接下来是歌曲,我们选用pygame的mp3播放功能。这个需要安装pygame, 可以通过pip install pygame来直接操作。

装好后在py文件中import pygame ,接下来就是三行代码来初始化、读取、播放了。

import pygame

pygame.mixer.init()

track = pygame.mixer.music.load('无条件.mp3')

pygame.mixer.music.play()

注意,要将mp3和lrc文件都放在和py文件同一个文件夹,如果改变路径,则需要在代码中lrc和mp3读取处添加对应路径。

成果截图

代码下载

github下载链接

后续问题目前lrc文件还挺难找的,这个我再研究下网易云音乐的歌词文件

lrc编码格式以及内容字符也有影响,因为我这只能提取汉字,这个也要再后续改进

点阵字占用空间太大,显示方面需要再想办法解决一下当然如果不采用点阵字打印 直接输出歌词,就是一个简单的音乐播放配动态歌词的功能了。

目前代码中只是开始播放一直到结束,并没有添加对播放的控制,这个也可以增加。目前代码中只是开始播放一直到结束,并没有添加对播放的控制,这个也可以增加。

可以给播放器添加图形界面,以及播放按钮、调节音量等。

暂时想到这些,挖的坑有点多,慢慢更新。。

python播放音乐同步歌词_Python点阵字玩转动态歌词相关推荐

  1. python 桌面歌词_Python点阵字玩转动态歌词

    原标题:Python点阵字玩转动态歌词 前面我们讲到了可以自定义输入汉字,然后用点阵字来展现,接下来我们挖掘下更有趣的玩法.想法来自于听歌时桌面动态歌词,我们的点阵字既然可以自定义输入识别,何不读取歌 ...

  2. python设置桌面歌词_Python点阵字玩转动态歌词

    前面我们讲到了可以自定义输入汉字,然后用点阵字来展现,接下来我们挖掘下更有趣的玩法.想法来自于听歌时桌面动态歌词,我们的点阵字既然可以自定义输入识别,何不读取歌词文件随着歌曲播放动态显示呢? 下面介绍 ...

  3. 点阵字python_Python点阵字玩转动态歌词

    前面我们讲到了可以自定义输入汉字,然后用点阵字来展现,接下来我们挖掘下更有趣的玩法.想法来自于听歌时桌面动态歌词,我们的点阵字既然可以自定义输入识别,何不读取歌词文件随着歌曲播放动态显示呢? 下面介绍 ...

  4. python播放音乐同步歌词_使用Python下载歌词并嵌入歌曲文件中的实现代码

    使用python扫描本地音乐并下载歌词 这次这个真的是干货哦,昨晚弄了半晚上,,,,从8点吃完饭就开始写,一直到了快12点才弄好,,,新手,伤不起呀.... 先简单的说下吧,百度提供了一个音乐搜索的a ...

  5. python播放音乐同步歌词_python 根据歌词的时间(LRC文件),生成H5 audio按句播放器...

    1.效果图 2.Python代码: # coding=UTF-8 import codecs import os import re # 正则校验是否为浮点数字 def is_number(num): ...

  6. python播放音乐同步歌词_python终端播放音乐同定制步显示本地或网络歌词

    文章来源:淘论文网   发布者:毕业设计 浏览量: #!/usr/bin/python # -*- encoding:utf-8 -*- #============================== ...

  7. python播放音乐同步歌词范晓萱_范晓萱同步的歌词

    你是不是在找范玮琪的这首同步的歌词?下面是学习啦!小编帮你整理了这首歌词的相关的资料希望对你有用! 同步的歌词 同步-(电影<陪安东尼度过漫长岁月>主题曲)-范晓萱 相隔两地的时空 默契对 ...

  8. python播放音乐同步歌词_linux 下 python 调用 mplayer 解析歌词同步播放显示

    标签: 加载同目录同名歌词同步显示 #!/usr/bin/python # -*- coding: utf-8 -*- import sys, os, time, subprocess, re, ch ...

  9. python播放音乐同步歌词范晓萱_范晓萱《同步》歌词-同步Mp3歌词下载_爱歌词网...

    同步LRC歌词 [ti:同步] [ar:范晓萱] [al:] [by:agul369] [00:01.77]范晓萱 - 同步(陪安东尼度过漫长岁月电影主题曲) [00:10.00]歌词搜索www.22 ...

  10. python播放音乐同步歌词范晓萱_同步_范晓萱_高音质在线试听_同步歌词|歌曲下载_酷狗音乐...

    范晓萱 - 同步 专辑: 同步 歌手: 范晓萱 [id:$010126C0] [ar:范晓萱] [ti:同步] [by:] [hash:d71f1a9610608a9caf43609ffd37686 ...

最新文章

  1. python 四舍五入保留小数输出
  2. linu怎么启动oracle,请问该如何在LINUX下启动ORACLE?
  3. 江苏省对口单招计算机原理,江苏省对口单招计算机原理教案.doc
  4. 在ASP.NET MVC3项目中,自定义404错误页面
  5. Dubbo(三) 消费者、提供者工程搭建并实现远程调用
  6. 【NOIP2018】游记
  7. accp8.0转换教材第4章MySQL高级查询(二)理解与练习
  8. 诺诺打赏源码_2020二开诺诺视频打赏源码/VIP付费看视频带试看 已对接支付+代理...
  9. CWMP 开发漫谈
  10. T5: Linux查看cpu信息,是否支持avx2指令集
  11. 交换机NTP服务器地址配置
  12. 【图像边缘检测】基于matlab插值法亚像素边缘检测【含Matlab源码 306期】
  13. 无法访问网内计算机错误代码,电脑局域网无法访问共享ox80070035错误代码解决方法...
  14. windows 磁盘被写保护怎么办
  15. Python爬取天气数据及可视化分析!这是秋天该有的气温?
  16. Win7+修改管理员账户Administrator名字的方法
  17. 支持向量机中所谓的支持向量究竟是什么?
  18. HEVC学习笔记 第1章 编码结构
  19. WordPress博客系统搜索引擎优化seo全攻略方法
  20. html输入框传给服务器,如何将浏览器上的数据,提交到服务器?

热门文章

  1. EXCEL VBA编程入门一
  2. 数据可视化上集:使用Gliffy,ProcessOn迅速绘制论文中的流程图,系统结构图
  3. threejs给gltf模型贴图出现纹理错乱,贴图歪曲解决办法
  4. 重磅!2021年国内Java培训机构排名前十最新出炉啦
  5. Xshell5突然连不上虚拟机
  6. tp框架like模糊查询报错
  7. 〖Python零基础入门篇(62)〗- Python 中的魔法函数
  8. 国产达梦数据库安装教程(DM7,Windows)
  9. 前端-图片压缩,基于vue/webpack的tinypng插件
  10. 重读浙大版《概率论与数理统计》