如何将JSON转换为LRC格式文件:详细指南与代码示例
在音乐播放、歌词同步等场景中,LRC格式是最常见的歌词文件格式之一,它通过时间戳(如[00:01.23])精确匹配歌词与音频时间轴,而JSON(JavaScript Object Notation)则因其结构化、易解析的特性,常用于存储复杂数据(如包含时间、歌词、翻译等多维信息的歌词数据),将JSON转换为LRC格式,是实现歌词数据标准化、兼容播放器的关键步骤,本文将详细介绍转换的核心逻辑、具体步骤,并提供多种编程语言的代码示例,助你轻松完成转换。
理解JSON与LRC格式的结构
JSON格式歌词示例
JSON格式的歌词通常以数组或对象形式存储,每个元素包含时间戳(毫秒/秒)和对应的歌词文本。
{
"lyrics": [
{"time": 1230, "text": "这是第一句歌词"},
{"time": 3456, "text": "这是第二句歌词"},
{"time": 5678, "text": "这是第三句歌词"}
],
"offset": 0 // 可选:整体时间偏移(毫秒),正数表示延迟,负数表示提前
}
LRC格式歌词示例
LRC格式每行以[mm:ss.xx]开头(mm为分钟,ss为秒,xx为毫秒的十进制,如3表示230毫秒),后接歌词文本。
[00:01.23]这是第一句歌词
[00:03.46]这是第二句歌词
[00:05.68]这是第三句歌词
JSON转LRC的核心逻辑
转换的核心是将JSON中的时间戳(毫秒或秒)转换为LRC标准的[mm:ss.xx]格式,并按时间顺序排列歌词,具体步骤如下:
解析JSON数据
提取歌词数组(如lyrics字段)和可选的offset偏移量。
时间戳转换
- 输入时间单位处理:若JSON中时间戳为毫秒(如
1230),需先转换为秒(1230 / 1000 = 1.23);若为秒(如23),则直接使用。 - 偏移量调整:将每个时间戳加上
offset(需统一单位,毫秒偏移需先转为秒),确保歌词与音频同步。 - 格式化输出:将调整后的秒数拆分为分钟、秒、毫秒,并补零对齐:
- 分钟:
Math.floor(总秒数 / 60),补足2位(如1转为01)。 - 秒:
Math.floor(总秒数 % 60),补足2位(如5转为05)。 - 毫秒:取总秒数的小数部分乘以1000,保留1位小数(如
23转为2,345转为3),不足2位不补零(LRC格式允许毫秒部分为1位)。
- 分钟:
按时间排序
确保JSON中的歌词数据已按时间升序排列,若未排序,需在转换前先处理。
生成LRC文本
遍历排序后的歌词数组,将每个时间戳和文本按[mm:ss.xx]歌词格式拼接,换行符分隔每行。
编程实现示例(Python/JavaScript/Java)
Python实现
Python凭借简洁的语法和强大的json库,适合快速实现转换。
import json
def json_to_lrc(json_data, output_file="lyrics.lrc"):
"""
将JSON格式歌词转换为LRC文件
:param json_data: JSON字符串或字典
:param output_file: 输出LRC文件名
"""
# 解析JSON(若为字符串则转为字典)
if isinstance(json_data, str):
data = json.loads(json_data)
else:
data = json_data
lyrics = data.get("lyrics", [])
offset = data.get("offset", 0) / 1000 # 毫秒转秒
# 按时间排序(确保JSON未排序时也能正确转换)
lyrics.sort(key=lambda x: x["time"])
lrc_lines = []
for item in lyrics:
# 计算调整后的时间(秒)
total_seconds = item["time"] / 1000 + offset
# 拆分分钟、秒、毫秒
minutes = int(total_seconds // 60)
seconds = int(total_seconds % 60)
milliseconds = int((total_seconds - int(total_seconds)) * 100)
# 格式化时间戳(毫秒部分保留1位,不足2位不补零)
time_str = f"[{minutes:02d}:{seconds:02d}.{milliseconds // 10}{milliseconds % 10}]"
lrc_lines.append(f"{time_str}{item['text']}")
# 写入文件
with open(output_file, "w", encoding="utf-8") as f:
f.write("\n".join(lrc_lines))
print(f"LRC文件已生成:{output_file}")
# 示例使用
json_example = """
{
"lyrics": [
{"time": 1230, "text": "这是第一句歌词"},
{"time": 3456, "text": "这是第二句歌词"},
{"time": 5678, "text": "这是第三句歌词"}
],
"offset": 100
}
"""
json_to_lrc(json_example)
JavaScript实现(Node.js/浏览器环境)
JavaScript适合前端或Node.js环境,无需额外依赖。
function jsonToLrc(jsonData, outputFileName = "lyrics.lrc") {
/**
* 将JSON格式歌词转换为LRC文本
* @param {Object|string} jsonData - JSON对象或字符串
* @param {string} outputFileName - 输出文件名(浏览器环境下载用)
* @returns {string} LRC格式文本
*/
// 解析JSON(若为字符串则转为对象)
const data = typeof jsonData === "string" ? JSON.parse(jsonData) : jsonData;
const lyrics = data.lyrics || [];
const offset = (data.offset || 0) / 1000; // 毫秒转秒
// 按时间排序
lyrics.sort((a, b) => a.time - b.time);
const lrcLines = lyrics.map(item => {
// 计算调整后的时间(秒)
const totalSeconds = item.time / 1000 + offset;
const minutes = Math.floor(totalSeconds / 60);
const seconds = Math.floor(totalSeconds % 60);
const milliseconds = Math.round((totalSeconds - Math.floor(totalSeconds)) * 100);
// 格式化时间戳
const timeStr = `[${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}.${Math.floor(milliseconds / 10)}${milliseconds % 10}]`;
return `${timeStr}${item.text}`;
});
const lrcText = lrcLines.join("\n");
// 浏览器环境:触发下载
if (typeof window !== "undefined") {
const blob = new Blob([lrcText], { type: "text/plain;charset=utf-8" });
const link = document.createElement("a");
link.href = URL.createObjectURL(blob);
link.download = outputFileName;
link.click();
URL.revokeObjectURL(link.href);
}
return lrcText;
}
// 示例使用
const jsonExample = {
lyrics: [
{ time: 1230, text: "这是第一句歌词" },
{ time: 3456, text: "这是第二句歌词" },
{ time: 5678, text: "这是第三句歌词" }
],
offset: 100
};
const lrcText = jsonToLrc(jsonExample);
console.log("LRC文本:\n", lrcText);
Java实现
Java适合后端服务或桌面应用,需处理文件读写和字符串格式化。
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class JsonToLrcConverter {
public static void convertJsonToLrc(String jsonData, String outputFilePath) throws Exception {
// 解析JSON
JSONObject data = new JSONObject(jsonData);
JSONArray lyricsArray = data.getJSONArray("lyrics");
int offset = data.optInt("offset", 0); // 默认偏移0毫秒
// 转换为


还没有评论,来说两句吧...