跳至主要內容

標籤「VoiceVox」的 2 篇文章

查看所有標籤

製作可使用多個生成式 AI 代理人的 VSCode 聊天擴充套件 Hime

· 2 分鐘閱讀

我做了一個可以和多個 AI 供應商聊天的 VSCode 擴充套件 Hime (HikariMessage)

採用 BYOK(Bring Your Own Key),只要有各 API 提供者的 API 金鑰即可使用。

什麼是 Hime

Hime 是一個整合在 VSCode 側邊欄的生成式 AI 聊天擴充套件。支援 Anthropic、OpenAI、Azure OpenAI、OpenRouter、Ollama,並可透過下拉選單輕鬆切換提供者。

主要功能

支援多個 AI 提供者

支援以下提供者:

  • Anthropic (Claude)
  • OpenAI
  • Azure OpenAI
  • OpenRouter
  • Ollama

即時串流顯示

回應會即時串流顯示,因此即使回覆很長也不會感覺到太久的等待。

MCP

透過設定以 JSON 格式指定以下參數即可使用 MCP。

範例

{
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "C:\\Users"]
}
}

豐富的 UI

  • Markdown 呈現
  • 程式碼區塊語法高亮
  • 程式碼區塊複製按鈕
  • 顯示 MCP 的輸出結果

聊天記錄持久化

對話記錄會以 JSON 格式儲存在 ~/.hime/chats/。即使重新啟動 VSCode 也能從上次繼續對話。

自動系統提示

工作區資訊、作業系統資訊與目前開啟的編輯器上下文會自動包含在系統提示中。只要說「請修正這個檔案」,AI 就能知道你正在查看哪個檔案。

安裝

需要 Node.js 20 以上與 VSCode 1.96 以上。

git clone https://github.com/Himeyama/hime
cd hime
npm install
npm run watch # 開發時: Extension Host 與 Webview 同時監控

之後在 VSCode 按 F5 即可啟動擴充套件主機。API 金鑰可從側邊欄的設定面板輸入,並會使用 VSCode 的 SecretStorage 加密儲存。

總結

Hime 的強項是在不離開編輯器的情況下即可與 AI 互動,並且可透過 MCP 執行工具。歡迎試用。

程式碼倉庫: https://github.com/Himeyama/hime

觀察 VOICEVOX 的 API

· 3 分鐘閱讀

VOICEVOX 是由編輯器、引擎與核心組成的。

參考: 整體構成

編輯器是應用程式、引擎是 HTTP 伺服器、核心則是執行語音合成處理的模組。

也就是說,編輯器對引擎呼叫 REST API(以下簡稱 API)。

因此這篇文章要觀察這個 API 的內容。

API 的擷取我使用 Wireshark。

啟動時的通訊

我用 http and tcp.port == 50021 做了過濾,結果如下:

啟動時似乎會讀取以下資訊:

  • 版本資訊 /version
  • 引擎的 manifest 資訊 /engine_manifest
  • 聲優資訊 /speakers(像是 ずんだもん 等角色名單)
  • 歌手資訊 /singers(同上)

取得 speakers 和 singers 之後,會更詳細地取得各角色的資訊(/speaker_info?speaker_uuid=xxx, /singer_info?speaker_uuid=xxx)。

合成語音請求時的通訊

接著我用 ずんだもん 發送語音合成請求,觀察 API。

語音的取得流程似乎如下:

  1. 透過 /accent_phrases 取得重音/語調資訊
  2. 透過 /synthesis?speaker=3 合成 ずんだもん 的聲音

在 (2.) 發送的請求主體看起來和 (1.) 的回應類似,像下面這樣。

因此流程是先在 (1.) 取得重音資訊,接著在 (2.) 依據這些資訊合成語音。

實際呼叫 API 試試看

我使用 httpie 這個工具來呼叫 API。

  1. 取得 speakers 資訊

可以看到 ずんだもん(Normal)的 id 是 3。

  1. 取得重音資訊

我用「ずんだもんなのだ」取得重音資訊。(與取得 speaker 不同,這是用 POST)

  1. 合成語音

建立如下的請求主體:

{
"accent_phrases": <從 /accent_phrases 取得的資料>,
"speedScale": 1,
"pitchScale": 0,
"intonationScale": 1,
"volumeScale": 1,
"prePhonemeLength": 0.1,
"postPhonemeLength": 0.1,
"outputSamplingRate": 24000,
"outputStereo": false,
"kana": ""
}

因為 httpie 好像不能處理 wav,所以改用 PowerShell 送請求。

# 定義 URL 與 JSON 資料
$url = 'http://localhost:50021/synthesis?speaker=3'
$jsonBody = @"
{
"accent_phrases": [
{
"moras": [
{
"text": "ズ",
"consonant": "z",
"consonant_length": 0.12722788751125336,
"vowel": "u",
"vowel_length": 0.11318323761224747,
"pitch": 5.773037910461426
},
{
"text": "ン",
"consonant": null,
"consonant_length": null,
"vowel": "N",
"vowel_length": 0.09306197613477707,
"pitch": 6.108947277069092
},
{
"text": "ダ",
"consonant": "d",
"consonant_length": 0.04249810427427292,
"vowel": "a",
"vowel_length": 0.09372275322675705,
"pitch": 6.09743070602417
},
{
"text": "モ",
"consonant": "m",
"consonant_length": 0.07012023776769638,
"vowel": "o",
"vowel_length": 0.1172478124499321,
"pitch": 5.932623386383057
},
{
"text": "ン",
"consonant": null,
"consonant_length": null,
"vowel": "N",
"vowel_length": 0.06496299058198929,
"pitch": 5.745952129364014
},
{
"text": "ナ",
"consonant": "n",
"consonant_length": 0.038462959229946136,
"vowel": "a",
"vowel_length": 0.08576127141714096,
"pitch": 5.5794854164123535
}
],
"accent": 1,
"pause_mora": null,
"is_interrogative": false
},
{
"moras": [
{
"text": "ノ",
"consonant": "n",
"consonant_length": 0.05504273623228073,
"vowel": "o",
"vowel_length": 0.0903041884303093,
"pitch": 5.551316261291504
},
{
"text": "ダ",
"consonant": "d",
"consonant_length": 0.05024997144937515,
"vowel": "a",
"vowel_length": 0.20450790226459503,
"pitch": 5.633930206298828
}
],
"accent": 2,
"pause_mora": null,
"is_interrogative": false
}
],
"speedScale": 1,
"pitchScale": 0,
"intonationScale": 1,
"volumeScale": 1,
"prePhonemeLength": 0.1,
"postPhonemeLength": 0.1,
"outputSamplingRate": 24000,
"outputStereo": false,
"kana": ""
}
"@

# 建立 HTTP 標頭
$headers = @{
'Content-Type' = 'application/json'
}

# 發送 POST 請求並取得回應
$response = Invoke-WebRequest -Uri $url -Method Post -Headers $headers -Body $jsonBody -OutFile "output.wav"

# 開啟並播放
start output.wav

VOICEVOX:ずんだもん

以上!