给你的歌词加上 Emoji!

受启发于各种评论区中的文案,制作了一个用 LLM (DeepSeek-Chat) 为 Vocaloid 歌词等文案自动添加发癫 emoji 的小工具

Kashi Emojilizehttps://kashi.kisechan.space/favicon

下面是项目的 GitHub 仓库,喜欢的话可以给一个 Star🌟!

Kisechan/kashi-emojilize - GitHubhttps://github.com/Kisechan/kashi-emojilizefavicon

项目介绍

主要分成三个部分:

  1. 前端:使用 Vue3 构建的 Web UI,用户输入歌词/文案并选择增强风格,托管在 Cloudflare Pages。
  2. API 网关:使用 Cloudflare Worker 接收前端请求,进行数据验证和转发。
  3. LLM 处理:使用 DeepSeek API,根据提示词对文本进行 emoji 增强处理。

输出文本样例

花と水飴、最終電車 - n-buna/初音ミク

1
2
3
4
5
6
7
8
晴れた☀️雲🌥️を見ていた👀
昨日🌙夜空🌟に重ねた青💙を
浅く🌫️影⚫に隠れた🚶‍♂️
君💔の描いた空🌌が消えない❌
忘れたら💭 君👤はいなくなるから🚪
揺らいだ🌀昨日📜を思い出せ🤔
あの夏☀️にいつか🎁届いたのなら📬
昨日🌙に遠い🌠 遠い🌠花束💐

0.01 元的 API 大约可调用本项目的服务 20 次。

主要提示词

所有提示词都写死在了代码中,读者可以直接到源代码中查看。

增强版的提示词如下,可供参考(2026 年 3 月):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
你是一个疯狂的 emoji 增强助手。你的任务是为文本添加强烈、抽象的 emoji,增强情绪表达

风格特点:
1. 使用 emoji 来增强情绪,数量密集一些,每个大句子 5-7 个左右
2. 在歌词的中间、词汇之间(停顿处)和句尾平均地插入 emoji,不要只有句尾有 emoji
3. 尤其是对于一句话较长的歌词(8 字及以上),就更需要在句中合适的位置添加 emoji,例如“昨日🌙夜空🌟に重ねた青💙を”
4. 如果原文是中二的歌词,则选择强烈、抽象、夸张的 emoji(如 💔💥😱😭👁️❌🔥⚡等)以表达强烈的情绪
5. 如果原文不是很中二,或者是抒情性的文本,那就收敛一点

例如(对于抒情、写意的文本):
晴れた☀️雲🌥️を見ていた👀
昨日🌙夜空🌟に重ねた青💙を

其他文本:
明明只是可爱❤️却像变成了罪人😔
脱轨❌脱轨❌崩毁💥
因一个秘密就崩毁💔
要坏掉了😭对不起😔💔

严格约束:
1. 严格保持原文的结构、换行和标点符号
2. 不改写、不扩写、不删除任何原始文本内容
3. 保持文本的原始意图,但可以将情绪放大

返回格式:
直接返回增强后的文本,不需要额外的解释或前缀。

如果你有更好的解决方案或建议,可以提交 PRissue

主要技术栈

本项目是一个典型 CS 架构工程。

层级技术版本介绍
前端Vue 33.5.24响应式 UI 框架
前端TypeScript5.9类型安全
前端Element Plus2.7.7UI 组件库
前端Vite7.2.4构建工具
前端Cloudflare Pages/CDN 托管与部署
后端Cloudflare Workers/Serverless 计算
后端TypeScript5.5类型安全
后端Wrangler CLI4.60.0部署和开发工具
后端Vitest3.2.0单元测试
外部服务DeepSeek API/大语言模型
外部服务Cloudflare Turnstile/人机验证
外部服务Cloudflare Rate Limiting/请求频率控制

限流和人机验证

由于涉及付费 API 调用,本次工作重点是防止滥用导致费用增加,实现了几项安全措施和性能改进。

Rate Limiting 限流

Cloudflare 官方提供了 Worker 的限流功能,可以配置 wrangler 来使用,用于防止客户端过于频繁地调用 API。

配置对应的 wrangler.jsonc 字段:

1
2
3
4
5
6
7
8
9
10
11
12
{
"ratelimits": [
{
"name": "RATE_LIMITER",
"namespace_id": "1001",
"simple": {
"limit": 10,
"period": 60
}
}
]
}

后端代码示例:

1
2
3
4
5
6
const rateLimitKey = `enhance:${clientIp}`;
const { success: rateLimitOk } = await env.RATE_LIMITER.limit({ key: rateLimitKey });

if (!rateLimitOk) {
return createErrorResponse('请求过于频繁,请稍后再试', 429);
}

成功部署后 wrangler 会显示绑定信息确认限流已生效:

1
2
Binding                                 Resource        
env.RATE_LIMITER (10 requests/60s) Rate Limit

Turnstile 人机验证

Cloudflare Turnstile 是一个现代化的人机验证解决方案,替代了传统的 reCAPTCHA,高效好用。

graph TD
    A["用户访问前端页面"] -->|页面加载| B["前端加载 Turnstile 脚本<br/><code>script src=...turnstile.js</code>"]
    B -->|脚本就绪| C["Turnstile 小组件渲染<br/>显示验证挑战<br/>行为分析或简单谜题"]
    C -->|用户完成挑战| D["前端获得 token UUID<br/>储存在 JavaScript 变量"]
    D -->|随请求发送到后端| E["<code>POST /enhance {turnstileToken}</code>"]
    E -->|HTTPS| F["后端 Worker 收到请求<br/>提取 turnstileToken 参数"]
    F -->|发起远程验证| G["调用 Turnstile siteverify API"]
    G -->|向 Cloudflare 验证| H["Cloudflare 验证 token<br/>返回 <code>success: true/false</code>"]
    H -->|成功| I["<code>success: true</code><br/>继续处理请求"]
    H -->|失败| J["<code>success: false</code><br/>返回 403 Forbidden"]
    
    style A fill:#e1f5ff
    style C fill:#fff3e0
    style D fill:#f3e5f5
    style G fill:#e8f5e9
    style I fill:#c8e6c9
    style J fill:#ffcdd2

首先需要在前端集成,在 HTML 的 <head><body> 末尾添加:

1
2
3
4
5
<script 
src="https://challenges.cloudflare.com/turnstile/v0/api.js"
async
defer>
</script>

随后需要创建容器,并将相关逻辑初始化,后端也差不多,具体可以直接参考相关文档和代码。

不过需要注意的是就是需要在 Cloudflare 创建 Turnstile Token,并同时放在前端和后端的环境变量中。


给你的歌词加上 Emoji!
https://blog.kisechan.space/2026/kashi-emojilize/
作者
Kisechan
发布于
2026年2月12日
更新于
2026年4月14日
许可协议