- 实际应用场景与痛点分析
场景描述
- 朋友聚会去 KTV,大家想唱歌,但点歌时往往出现:
- 有人喜欢的歌别人没听过,导致冷场。
- 歌曲难度太高,唱不上去。
- 原唱版本太经典,翻唱难度大。
- 组织者难以兼顾所有人的喜好,气氛不够热烈。
痛点
- 信息分散:每个人的喜好没有集中记录。
- 匹配效率低:手动筛选耗时。
- 缺乏难度参考:不知道哪首歌适合现场氛围。
- 原唱/翻唱差异:部分人更喜欢伴奏版本。
-
核心逻辑讲解
-
数据录入:用户输入好友姓名、喜欢的歌手、曲风、难度偏好(简单/中等/困难)、是否接受原唱。
-
歌曲库:预设一个 JSON 格式的歌曲数据库,包含歌曲名、歌手、曲风、难度、原唱标记。
-
匹配算法:
- 根据好友喜好过滤歌曲库。
- 按曲风、难度、原唱偏好进行加权评分。
- 输出推荐列表(可设置数量)。
-
输出结果:按推荐度排序,方便组织者快速点歌。
-
模块化 Python 代码实现
项目结构
karaoke_helper/ ├── data/ │ └── songs.json ├── main.py ├── recommender.py ├── utils.py └── README.md
"data/songs.json"(示例)
[ {"title": "海阔天空", "artist": "Beyond", "genre": "摇滚", "difficulty": "中等", "original": true}, {"title": "小幸运", "artist": "田馥甄", "genre": "流行", "difficulty": "简单", "original": true}, {"title": "演员", "artist": "薛之谦", "genre": "流行", "difficulty": "中等", "original": true}, {"title": "平凡之路", "artist": "朴树", "genre": "民谣", "difficulty": "简单", "original": true} ]
"utils.py"
import json
def load_songs(file_path): """加载歌曲库""" with open(file_path, 'r', encoding='utf-8') as f: return json.load(f)
def save_friends_data(file_path, data): """保存好友喜好数据""" with open(file_path, 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=4)
"recommender.py"
def recommend_songs(songs, friends_prefs, top_n=5): """ 根据好友喜好推荐歌曲 :param songs: 歌曲列表 :param friends_prefs: 好友喜好字典 {name: {genre: [], difficulty: [], original: bool}} :param top_n: 返回推荐数量 :return: 推荐歌曲列表 """ from collections import defaultdict
# 统计所有好友的曲风、难度、原唱偏好
genre_score = defaultdict(int)
difficulty_score = defaultdict(int)
original_score = 0
for prefs in friends_prefs.values():
for g in prefs.get("genre", []):
genre_score[g] += 1
for d in prefs.get("difficulty", []):
difficulty_score[d] += 1
if prefs.get("original"):
original_score += 1
# 计算每首歌的匹配分数
scored_songs = []
for song in songs:
score = 0
if song["genre"] in genre_score:
score += genre_score[song["genre"]] * 2
if song["difficulty"] in difficulty_score:
score += difficulty_score[song["difficulty"]]
if song["original"] and original_score > 0:
score += 1
scored_songs.append((song, score))
# 按分数降序排序
scored_songs.sort(key=lambda x: x[1], reverse=True)
return [s[0] for s in scored_songs[:top_n]]
"main.py"
from utils import load_songs, save_friends_data from recommender import recommend_songs
SONGS_FILE = "data/songs.json" FRIENDS_FILE = "data/friends.json"
def input_friend_prefs(): """交互式输入好友喜好""" friends = {} while True: name = input("请输入好友姓名(回车结束):") if not name: break genres = input("喜欢的曲风(逗号分隔):").split(",") difficulties = input("能接受的难度(逗号分隔,如简单,中等):").split(",") original = input("是否接受原唱(y/n):").lower() == "y" friends[name.strip()] = { "genre": [g.strip() for g in genres if g], "difficulty": [d.strip() for d in difficulties if d], "original": original } return friends
def main(): songs = load_songs(SONGS_FILE) print("已加载歌曲库,共 {} 首歌曲".format(len(songs)))
friends = input_friend_prefs()
save_friends_data(FRIENDS_FILE, friends)
recommendations = recommend_songs(songs, friends, top_n=5)
print("\n推荐歌曲:")
for idx, song in enumerate(recommendations, 1):
print(f"{idx}. {song['title']} - {song['artist']} | 曲风: {song['genre']} | 难度: {song['difficulty']} | 原唱: {'是' if song['original'] else '否'}")
if name == "main": main()
- README.md 与使用说明
README.md
K歌点歌辅助工具
一个帮助 KTV 聚会组织者根据好友喜好推荐歌曲的 Python 工具。
功能
- 录入好友的曲风、难度、原唱偏好
- 从歌曲库中智能推荐适配歌曲
- 提升聚会氛围,避免冷场
使用方法
- 安装 Python 3.x
- 运行
python main.py - 按提示输入好友喜好
- 查看推荐歌曲列表
数据文件
data/songs.json:歌曲库data/friends.json:好友喜好(自动生成)
使用说明
- 首次运行会自动生成 "friends.json"。
- 可手动编辑 "songs.json" 添加更多歌曲。
- 推荐结果按匹配度排序,优先满足多数人喜好。
- 核心知识点卡片
知识点 说明 JSON 数据操作 使用 "json.load" 和 "json.dump" 读写结构化数据 字典与列表推导 高效处理嵌套数据结构 加权评分算法 根据多维度偏好计算匹配度 模块化设计 将功能拆分到不同模块,便于维护 用户交互 使用 "input" 实现命令行交互 默认参数 函数参数设置默认值提高灵活性
- 总结
这个 K歌点歌辅助工具通过数据驱动的方式,解决了 KTV 聚会中点歌的痛点:
- 信息集中化:所有好友喜好统一存储。
- 智能匹配:加权算法兼顾曲风、难度、原唱。
- 易扩展:可轻松增加新歌曲或新偏好维度。
- 低门槛:纯 Python 实现,无需复杂环境。
未来可扩展方向:
- 接入在线歌曲 API(如网易云音乐)。
- 增加 GUI 界面(Tkinter / PyQt)。
- 加入投票机制,让现场实时选择。
如果你需要,还可以画一个系统架构图和UI原型图,让这个项目更直观。
利用AI解决实际问题,如果你觉得这个工具好用,欢迎关注长安牧笛!