python实现把歌词生成词云并根据歌曲播放进度进行展示
时间: 2023-08-01 08:10:29 浏览: 210
要实现将歌词生成词云并根据歌曲播放进度进行展示,可以按照以下步骤进行:
1. 使用 Python 的 requests 库和 BeautifulSoup 库爬取歌词。
2. 使用 Python 的 jieba 库进行分词,并过滤掉一些无意义的词汇,如“的”、“了”、“我”、“你”等。
3. 使用 Python 的 wordcloud 库生成词云图。
4. 使用 Python 的 PyQt5 库制作一个简单的音乐播放器,可以读取音乐文件和歌词文件,并且根据歌曲播放进度高亮显示词云图中的相应部分。
以下是实现上述功能的示例代码:
```python
import requests
from bs4 import BeautifulSoup
import jieba
from wordcloud import WordCloud, ImageColorGenerator
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QSlider, QVBoxLayout
from PyQt5.QtGui import QPixmap, QImage
from PyQt5.QtCore import Qt
import numpy as np
from PIL import Image
# 爬取歌词
def get_lyrics(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
lyrics = soup.find('div', class_='js-lrc-content').get_text()
return lyrics
# 生成词云图
def generate_wordcloud(lyrics):
words = jieba.cut(lyrics)
filtered_words = []
for word in words:
if len(word) > 1 and word != '\r\n':
filtered_words.append(word)
words_text = ' '.join(filtered_words)
mask = np.array(Image.open('mask.png'))
wc = WordCloud(background_color='white', mask=mask, font_path='simhei.ttf', max_words=2000, max_font_size=200,
random_state=42, scale=1)
wc.generate(words_text)
image_colors = ImageColorGenerator(mask)
wc.recolor(color_func=image_colors)
wc.to_file('wordcloud.png')
# 制作音乐播放器
class MusicPlayer(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(100, 100, 800, 600)
self.setWindowTitle('Music Player')
self.label_lyrics = QLabel(self)
self.label_lyrics.setGeometry(50, 50, 700, 450)
self.slider_progress = QSlider(Qt.Horizontal, self)
self.slider_progress.setGeometry(50, 520, 700, 30)
self.slider_progress.valueChanged.connect(self.update_lyrics)
self.show()
# 读取音乐文件和歌词文件
def load_music(self, music_path, lyrics_path):
self.music_path = music_path
self.lyrics_path = lyrics_path
self.lyrics = open(self.lyrics_path, 'r', encoding='utf-8').readlines()
self.label_lyrics.setPixmap(QPixmap('wordcloud.png'))
# 根据歌曲播放进度高亮显示词云图中的相应部分
def update_lyrics(self):
progress = self.slider_progress.value()
total_duration = self.slider_progress.maximum()
if progress == total_duration:
self.close()
else:
lyrics_index = int(progress / total_duration * len(self.lyrics))
lyrics_text = ''
for i in range(lyrics_index - 3, lyrics_index + 4):
if i >= 0 and i < len(self.lyrics):
lyrics_text += self.lyrics[i].strip() + '\n'
self.label_lyrics.setText(lyrics_text)
if __name__ == '__main__':
# 爬取歌词并生成词云图
url = 'https://music.163.com/#/song?id=1313354324'
lyrics = get_lyrics(url)
generate_wordcloud(lyrics)
# 启动音乐播放器
app = QApplication([])
music_player = MusicPlayer()
music_player.load_music('music.mp3', 'lyrics.txt')
app.exec_()
```
需要注意的是,上述代码中使用了一个名为“mask.png”的图片作为词云图的蒙版,可以根据需要替换为其他图片,同时还需要准备一首名为“music.mp3”的音乐文件和一个名为“lyrics.txt”的歌词文件。
阅读全文