Chrome/Edge 側欄空耳跟唱工具:單曲使用 LRCLIB 同步歌詞,自動比對失敗時可自己指定歌曲(LRCLIB 搜尋連結,或把提示詞貼到自己的 AI 再貼回結果)。YouTube 合輯可在本機建立文字字幕後二刷跟唱;音訊辨識使用裝置上的 WebGPU Whisper。沒有 localhost companion、CLI、雲端音訊辨識、內建共用金鑰或共用字幕服務。
[MV]/[Official Music Video] 等前綴及既有音樂影片後綴,辨識「歌手 - 歌名」或「歌手 _ 歌名」;保留歌手的雙語別名(含 박재범 Jay Park、EXO 엑소 這類以空白分隔的韓英名稱),英文歌名附韓文名稱時以英文名查詢,移除完整的末尾 feat. 合作歌手註記。Live 等版本標註不會被移除,後面另有版本標註時亦保留合作資訊。沒有明確音樂標籤的分隔標題與一般上傳頻道不會自動被當成可信歌手;取得資料後仍須精確匹配歌名、歌手。播放清單或推薦影片換片時,等 YouTube 頁面標題、影片 ID 與正片片長一致後才回報,避免用上一首標題或廣告片長查詞。feat.、ft.、featuring、合作演出註記、全形字元與明確列出的中/日/韓文及英文雙語名稱;支援圓括號與方括號,只有同一可信歌手的相符歌曲可套用。不採用子字串或模糊相似度猜歌;Live、Cover、Remix、Acoustic、Part 2 等錄音或未知版本註記不會當成一般合作註記刪除。每首查詢至多三個歌手別名及兩個明列歌名,同時最多兩個 LRCLIB 請求;HTTP 429/5xx 會自動重試兩次(0.5、1.2 秒後)。單一別名失敗不會丟棄其他成功結果,且成功搜尋回傳的資料可匹配任一已驗證歌手別名。部分查詢失敗會在主畫面提示並保留可用歌詞;重試後仍全部失敗會直接顯示 HTTP/網路原因,不冒稱「沒有歌詞」。可按「重新偵測」再查,不會改用其他歌手。Special Clip、Medley、Mashup、메들리 等多首歌標記時,側欄顯示「特別剪輯」並說明沒有能對齊整支影片的單一歌詞,不自動查詢,改提供本機「建立字幕」入口;Making Video、Behind the scenes、Teaser、訪談等非完整歌曲影片則顯示「非完整歌曲」。/watch 來源、但沒有可用同步歌詞時,才顯示「載入辨識模型」、「建立字幕」及「重播字幕」。模型由使用者點擊才下載、啟動,正常同步歌詞跟唱不載入 Whisper。「建立字幕」須模型就緒且影片停在 0 秒、暫停、1× 才可按;連接成功後再播放,一路播至結束。畫面顯示實際收到的音訊秒數、已辨識窗口及字幕行數;首段須收滿 12 秒,再等待本機辨識,之後每 10 秒更新。靜音/低音量與沒有新增可用字幕會分別提示。啟動或辨識失敗後保留原因及重新準備入口,不自動重新錄製。mediaId 且片長完全相符的完整字幕快取;依播放、暫停與 seek 顯示文字。完成首遍後字幕保留在畫面,可直接從頭重播。未完成草稿不能二刷。建立與重播均鎖定指定來源分頁,切換前景分頁不停止;更換來源前先按「停止」。storage.local。前奏與間奏(LRCLIB 的空白行)會顯示「♪ 前奏/間奏 · N 秒後」倒數,下一句以點狀底線預告。storage.local,變更後即時重算目前顯示,不重新執行 ASR。日文含假名的詞使用隨附的本機讀音字典處理漢字讀音與假名;純漢字段無法安全區分中日文,會保留原文。tabCapture,只擷取音訊並保留分頁原聲;不擷取畫面、桌面/系統混音。擴充功能圖示透過 chrome.action.onClicked 開啟側欄並取得目前分頁的 activeTab 授權;直接開側欄或只按側欄按鈕不等於授權其他分頁。指定其他來源時,須先切到該 YouTube 分頁點圖示,再建立字幕。沒有新增全網站或 tabs 權限。storage.local 的 Gemini API key。scripting 在原分頁補載播放腳本;不刷新 YouTube,也不在其他網站注入。YouTube 的主頁面 chapter bridge 與隔離播放腳本分開載入,重複注入會清理舊 listener、timer。若使用者拒絕網站存取權限,仍須先允許擴充功能讀取該網站。安裝依賴並建置 extension:
pnpm install
pnpm run lint:extension
pnpm run build:extension
chrome://extensions,或在 Edge 開啟 edge://extensions,啟用開發人員模式並載入本專案的 browser-extension/ 目錄。
每次重新建置後,在擴充功能管理頁按「重新載入」,關閉再重開側欄即可;既有 YouTube 播放頁不必刷新。載入目錄仍是 browser-extension/,不是 extension-ui/ 或 browser-extension/app/。https://lrclib.net/tracks/<編號> 連結貼回並按「套用」;或按「複製 AI 提示詞」貼到你自己的 AI,把它回覆的「歌名:…/歌手:…」兩行貼回,側欄會向 LRCLIB 驗證並選版。指定結果依 YouTube 影片 ID 記住,下次開同一支影片會優先套用;按「清除這支影片的指定」改回自動比對。pnpm test
pnpm run lint:extension
pnpm run build:extension
來源主要分層:browser-extension/ 負責播放報告驗證、側欄訊息轉送與 tabCapture 權限閘門;extension-ui/src/ 是側欄、LRCLIB、合輯 ASR 與文字快取原始碼,建置至 browser-extension/app/。youtube-music-credit.ts 負責從頁面資料中挑選單一音樂區塊曲目資訊;manual-lyrics.ts 負責手動指定的輸入解析、AI 提示詞與本機記憶格式;src/pronunciation/ 提供韓文與日文轉寫器。舊 Node/companion 的根目錄 dist/ 不再使用,也不會由 extension 建置產生。
執行以下指令建置並打包商店發行檔:
pnpm run package:extension
打包完成後會產生 release/lyrics-everywhere-extension.zip,其根目錄即為包含 manifest.json 的擴充功能封裝檔,可直接上傳至 Chrome Web Store 或 Edge Add-ons。相關上架文字與商店權限聲明請參閱 docs/chrome-web-store.md。