mirror of
https://github.com/lqtmcstudio/QZMusic_PC.git
synced 2026-06-20 23:35:06 +08:00
71 lines
5.2 KiB
Markdown
71 lines
5.2 KiB
Markdown
|
|
# Lyric parser/writer for AMLL
|
|||
|
|
|
|||
|
|
English / [简体中文](./README-CN.md)
|
|||
|
|
|
|||
|
|
This is a refactored version of the original lyrics pack. Docs not finished yet.
|
|||
|
|
|
|||
|
|
Below is the original docs.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
> Warning: This is a personal project and is still under development. There may still be many issues, so please do not use it directly in production environments!
|
|||
|
|
|
|||
|
|

|
|||
|
|
[](https://www.npmjs.com/package/@applemusic-like-lyrics/lyric)
|
|||
|
|
[](https://www.npmjs.com/package/@applemusic-like-lyrics/lyric)
|
|||
|
|
|
|||
|
|
A lyric parsing/generation module for AMLL, written entirely in TypeScript.
|
|||
|
|
|
|||
|
|
Since this module focuses only on lyric content, it discards all information unrelated to lyrics. If you need to get detailed information from a lyric file (such as artist), please consider using other frameworks.
|
|||
|
|
|
|||
|
|
Lyric format support table:
|
|||
|
|
|
|||
|
|
| Source Format\Target Format | Parse Own Format | LyRiC Format `.lrc` | ESLyric Word-by-word Format `.lrc` | NetEase Cloud Music Word-by-word Format `.yrc` | QQ Music Word-by-word Format `.qrc` | Lyricify Syllable Word-by-word Format `.lys` | TTML Lyric Format `.ttml` | ASS Subtitle Format `.ass` |
|
|||
|
|
| ---------------------------------------------- | ---------------- | ------------------- | ---------------------------------- | ---------------------------------------------- | ----------------------------------- | -------------------------------------------- | ------------------------- | -------------------------- |
|
|||
|
|
| LyRiC Format `.lrc` | ✅ | / | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
|||
|
|
| ESLyric Word-by-word Format `.lrc` | ✅ | ✅ | / | ✅ | ✅ | ✅ | ✅ | ✅ |
|
|||
|
|
| NetEase Cloud Music Word-by-word Format `.yrc` | ✅ | ✅ [^1] | ✅ [^1] | / | ✅ | ✅ | ✅ | ✅ |
|
|||
|
|
| QQ Music Word-by-word Format `.qrc` | ✅ | ✅ [^1] | ✅ [^1] | ✅ | / | ✅ | ✅ | ✅ |
|
|||
|
|
| Lyricify Syllable Word-by-word Format `.lys` | ✅ | ✅ [^1] | ✅ [^1] | ✅ [^2] | ✅ [^2] | / | ✅ | ✅ |
|
|||
|
|
| TTML Lyric Format `.ttml` | ✅ | ✅ [^1] | ✅ [^1] | ✅ [^2] | ✅ [^2] | ✅ [^3] | / | ✅ |
|
|||
|
|
| ASS Subtitle Format `.ass` | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | / |
|
|||
|
|
|
|||
|
|
[^1]: Will lose word-by-word timing data, vocal attributes (background vocals, duet vocals) and AMLL metadata
|
|||
|
|
|
|||
|
|
[^2]: Will lose vocal attributes (background vocals, duet vocals) and AMLL metadata
|
|||
|
|
|
|||
|
|
[^3]: Will lose AMLL metadata
|
|||
|
|
|
|||
|
|
## Using with Core Lyric Component
|
|||
|
|
|
|||
|
|
When using them together, note that **the lyric line structures of the two are not exactly the same**. You need to convert them in a way like the following example (using LyRiC as an example) for the lyric component to parse correctly:
|
|||
|
|
|
|||
|
|
```typescript
|
|||
|
|
import { parseLrc } from "@applemusic-like-lyrics/lyric";
|
|||
|
|
const lines = parseLrc("[00:00.00]test");
|
|||
|
|
const converted = lines.map((line, i, lines) => ({
|
|||
|
|
words: [
|
|||
|
|
{
|
|||
|
|
word: line.words[0]?.word ?? "",
|
|||
|
|
startTime: line.words[0]?.startTime ?? 0,
|
|||
|
|
endTime: lines[i + 1]?.words?.[0]?.startTime ?? Infinity,
|
|||
|
|
},
|
|||
|
|
],
|
|||
|
|
startTime: line.words[0]?.startTime ?? 0,
|
|||
|
|
endTime: lines[i + 1]?.words?.[0]?.startTime ?? Infinity,
|
|||
|
|
translatedLyric: "",
|
|||
|
|
romanLyric: "",
|
|||
|
|
isBG: false,
|
|||
|
|
isDuet: false,
|
|||
|
|
}));
|
|||
|
|
// Now you can pass converted to LyricPlayer
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Using TypeScript is recommended as it makes it easier to detect errors.
|
|||
|
|
|
|||
|
|
## Building
|
|||
|
|
|
|||
|
|
```shell
|
|||
|
|
wasm-pack build --target bundler --release --scope applemusic-like-lyrics
|
|||
|
|
```
|