跳至主要內容

標籤「VoiceVox」的 2 篇文章

查看所有標籤

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

我做了一個可以和多個 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

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:ずんだもん

以上!