方案選型
| 方案 | 優點 | 缺點 | 推薦指數 |
| 百度音樂 API | 曲庫大、返回標準 LRC、官方文檔 | 需申請 Key、有頻率限制 | ★★★★★ |
| 網易云/ QQ 音樂 非官方 API | 免費、歌詞格式豐富 | 不穩定、可能侵權、需逆向簽名算法 | ★★★☆☆ |
| 本地歌詞文件匹配 | 離線、零成本 | 覆蓋率低、需用戶手動下載 | ★★☆☆☆ |
百度 API 實現步驟
- 註冊 百度開發者平台,創建應用獲取
API Key。
- 調用搜索接口獲取歌曲 ID:
GET https://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.search.catalogSug&query=歌名
- 調用歌詞接口:
GET https://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.song.lry&songid=歌曲ID
- 解析 JSON 中的
lrcContent 字段,即標準 LRC 格式。
[00:12.34]歌詞行1\n[00:15.67]歌詞行2
C# 核心代碼
public async Task GetLyricAsync(string songName) {
using (var http = new HttpClient()) {
// 1. 搜索歌曲 ID
var searchUrl = $"https://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.search.catalogSug&query={Uri.EscapeDataString(songName)}";
var searchJson = await http.GetStringAsync(searchUrl);
var songId = JObject.Parse(searchJson)["song"]?[0]?["songid"]?.ToString();
if (string.IsNullOrEmpty(songId)) return null;
// 2. 獲取歌詞
var lrcUrl = $"https://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.song.lry&songid={songId}";
var lrcJson = await http.GetStringAsync(lrcUrl);
return JObject.Parse(lrcJson)["lrcContent"]?.ToString();
}
}
// LRC 解析示例
public List<(TimeSpan Time, string Text)> ParseLrc(string lrc) {
var regex = new Regex(@"\[(\d{2}):(\d{2})\.(\d{2})\](.*)");
return lrc.Split('\n')
.Select(line => regex.Match(line))
.Where(m => m.Success)
.Select(m => (Time: new TimeSpan(0, int.Parse(m.Groups[1].Value), int.Parse(m.Groups[2].Value), 0, int.Parse(m.Groups[3].Value)*10),
Text: m.Groups[4].Value.Trim()))
.ToList();
}
參考資源
避坑指南
- 接口可能返回 HTML 錯誤頁,需判斷
Content-Type 為 application/json。
- 高併發請緩存歌詞結果 (Redis/MemoryCache),避免觸發限流。
- 歌詞版權屬原作者,商業應用需獲取授權。