Python 歌詞解析器 音樂與歌詞同步播放

python 歌詞解析器

前言

歌詞解析器,顧名思義就是在播放歌曲的時候,音樂播放器放到那一句就顯示對應(yīng)的歌詞。
*在 python中歌詞解析器并不難寫,運(yùn)用 time模塊來編寫歌詞解析器, time.sleep()函數(shù)推遲調(diào)用線程的運(yùn)行,進(jìn)而可以控制歌詞的播放。為了在播放歌詞的同時播放音樂,需要導(dǎo)入 pygame 模塊。

https://baike.baidu.com/item/Pygame/7707076?fr=aladdin 安裝 pip install pygame

實(shí)現(xiàn)步驟

歌詞解析器.JPG
獲取歌詞字典函數(shù)

首先用 import 關(guān)鍵字導(dǎo)入 time 模塊和 pygame 模塊,我們需要用到 time模塊中的sleep()函數(shù)

import time
import pygame

定義一個函數(shù)來后去歌詞詞典,參數(shù)為歌詞字符串,通過函數(shù)返回歌詞字典。

def get_music_dict(musiclrc):
    """獲得歌詞字典

    :param musiclrc: 歌詞字符串
    :return: 時間與歌詞對應(yīng)的字典
    """
    dictmusic = {}  # 創(chuàng)建一個空字典,用來裝 時間(key) 和 歌詞(value)
    listline1 = musiclrc.splitlines()  # 安照行進(jìn)行切割 把每一行變成列表的一個元素

    for i in listline1:  # 把每一行元素遍歷出來,準(zhǔn)備切割

        listline2 = i.split("]")  # 以 ] 為切割符
        value = listline2[-1]  # 每一次遍歷 把歌詞元素(每一次遍歷都是最后一個) 賦值給 value

        for j in range(len(listline2)-1):  # 遍歷 listLine2  len(listLine2)-1 除去最后的非時間字符串(歌詞)

            keymusic = listline2[j][1:]  # [1:]從索引值為1開始取目的是除去 [
            # keymusic = listline2[j].strip()[1:]  # [1:]從索引值為1開始取目的是除去 [ 如果有縮進(jìn)的話 需要用strip()去除空格  方案二

            keytime = keymusic.split(":")  # 對遍歷的的時間字符串以冒號進(jìn)行切割

            musictime = float(keytime[0])*60+float(keytime[1])  # 計算出每個時間的總秒數(shù)

            key = musictime  # 把時間賦值給字典中的 key

            dictmusic[key] = value  # 把value 賦值給對應(yīng)的時間 key
    # print(dictmusic)

    return dictmusic
打印輸出歌詞

獲取歌詞字典之后,如何打印歌詞是最關(guān)鍵的。先將字典中所有的時間放入到一個列表中——時間列表,將時間列表進(jìn)行升序排序,遍歷時間列表,將時間列表里的值傳入time.sleep()函數(shù),從而達(dá)到控制在什么時間打印歌詞。

def print_music_dict(dictmusic):
    """打印輸出歌詞

    :param dictmusic:時間與歌詞對應(yīng)的字典
    """
    listmuscitime = []  # 創(chuàng)建空列表,把字典的key寫進(jìn)去
    for keys in dictmusic.keys():
        listmuscitime.append(keys)
    listmuscitime.sort()  # 默認(rèn)對列表進(jìn)行升序
    time.sleep(listmuscitime[0])
    for index in range(len(listmuscitime)):
        if index > 0:
            time.sleep((listmuscitime[index]-listmuscitime[index-1]))  # 兩段歌詞之間的時間
            print(dictmusic.get(listmuscitime[index]))  # 對列表里面的key值下標(biāo)遍歷,進(jìn)而用get取字典的value


主函數(shù)
def main():
    """主函數(shù)"""
    musiclrc = '''
[00:03.50]傳奇
[00:19.10]作詞:劉兵 作曲:李健
[00:20.60]演唱:王菲
[00:26.60]    
[04:40.75][02:39.90][00:36.25]只是因為在人群中多看了你一眼
[04:49.00]
[02:47.44][00:43.69]再也沒能忘掉你容顏
[02:54.83][00:51.24]夢想著偶然能有一天再相見
[03:02.32][00:58.75]從此我開始孤單思念
[03:08.15][01:04.30]
[03:09.35][01:05.50]想你時你在天邊
[03:16.90][01:13.13]想你時你在眼前
[03:24.42][01:20.92]想你時你在腦海
[03:31.85][01:28.44]想你時你在心田
[03:38.67][01:35.05]
[04:09.96][03:39.87][01:36.25]寧愿相信我們前世有約
[04:16.37][03:46.38][01:42.47]今生的愛情故事 不會再改變
[04:24.82][03:54.83][01:51.18]寧愿用這一生等你發(fā)現(xiàn)
[04:31.38][04:01.40][01:57.43]我一直在你身旁 從未走遠(yuǎn)
[04:39.55][04:09.00][02:07.85]
    '''
    pygame.mixer.init()  # 初始化音頻部分 
    path = r"chuanqi.mp3"  # 音頻絕對地址
    pygame.mixer.music.load(path) 
    pygame.mixer.music.play()

    print_one_by_one("開始播放音樂!")


    get_music_dict(musiclrc)
    dictmusic = get_music_dict(musiclrc)
    print_music_dict(dictmusic)
    time.sleep(300)


if __name__ == '__main__':
    main()


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容