Skip to content

Commit

Permalink
v0.6.0
Browse files Browse the repository at this point in the history
  • Loading branch information
led-mirage committed Jan 14, 2024
1 parent 61dbb93 commit d1270ad
Show file tree
Hide file tree
Showing 9 changed files with 351 additions and 73 deletions.
60 changes: 52 additions & 8 deletions Readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ Copyright (c) 2023-2024 led-mirage

v0.4.0からA.I.VOICEにも対応したのだ!

v0.6.0からCOEIROINKにも対応したのだ!

## スクリーンショット

https://github.com/led-mirage/ZundaGPT/assets/139528700/3996d2d5-0180-495d-8b12-1966e273d625
Expand All @@ -19,6 +21,7 @@ https://github.com/led-mirage/ZundaGPT/assets/139528700/3996d2d5-0180-495d-8b12-
- VOICEVOX 0.14.10
- VOICEVOX ENGINE 0.14.6
- A.I.VOICE Editor 1.4.9.0
- COEIROINK v.2.2.1

## 必要なもの

Expand All @@ -32,7 +35,7 @@ APIキーの作成は特に難しくないのだ。OpenAI APIの設定画面に

OpenAI … https://platform.openai.com/

### ✅ VOICEVOX
### ✅ VOICEVOX(オプション)

ずんだもんの声でチャットを読み上げてもらうにはVOICEVOXをインストールしておく必要があるのだ。VOICEVOXは公式サイトからダウンロードして簡単にインストールできるのだ。

Expand All @@ -49,6 +52,12 @@ A.I.VOICEで話してもらうにはA.I.VOICEを購入してインストール

A.I.VOICE … https://aivoice.jp/

### ✅ COEIROINK(オプション)

COEIROINKはVOICEVOXと同じ無料のテキスト読み上げソフトウェアなのだ。COEIROINKをダウンロードしてインストールしておけば、ずんだGPTでも使えるのだ。

COEIROINK … https://coeiroink.com/

## 実行方法

### 🛩️ 実行ファイル(EXE)を使う場合
Expand All @@ -61,7 +70,7 @@ A.I.VOICE … https://aivoice.jp/

以下のリンクから ZundaGPT.ZIP をダウンロードして、作成したフォルダに展開するのだ。

https://github.com/led-mirage/ZundaGPT/releases/tag/v0.5.1
https://github.com/led-mirage/ZundaGPT/releases/tag/v0.6.0

#### 3. 実行

Expand Down Expand Up @@ -118,6 +127,10 @@ Windowsの場合は、Windowsの検索窓で「環境変数を編集」で検索

`settings.json`ファイルにはこのアプリの設定情報が記載されているのだ。普通は特に変更する必要はないけど、自分用にカスタマイズしたい人は、このファイルをいじるといいのだ。以下に設定項目を簡単に紹介するのだ。

#### ✨ assistant_prompt(既定値 ずんだ)v0.6.0から新設

チャットアシスタントのプロンプトに表示する文字列の設定なのだ。

#### ✨ assistant_echo(既定値 true)v0.2.0から新設

チャットアシスタントが声に出して読み上げるかどうかの設定なのだ。設定できる値は`true``false`の2つなのだ。
Expand All @@ -126,14 +139,16 @@ Windowsの場合は、Windowsの検索窓で「環境変数を編集」で検索

#### ✨ assistant_tts_software(既定値 VOICEVOX)v0.4.0から新設

チャットアシスタントのテキスト読み上げに使用するソフトウェアを選択するのだ。設定できる値は、"VOICEVOX""AIVOICE"、もしくはテキストを読み上げない場合に使用する""の3つなのだ
チャットアシスタントのテキスト読み上げに使用するソフトウェアを選択するのだ。設定できる値は、"VOICEVOX""AIVOICE"、"COEIROINK"、もしくはテキストを読み上げない場合に使用する""の4つなのだ

#### ✨ assistant_speaker_id(既定値 3)

チャットアシスタントの声のIDなのだ。VOICEVOXの場合、"3"はずんだもんを意味しているのだ。VOICEVOXに収録されている他のキャラクターの声で話して欲しいときは、この値を変更すればいいのだ。キャラクターのIDを調べるには、[この資料](voicevox_speaker_list.md)を参考にするといいのだ。

A.I.VOICEの場合、ここにはキャラクターの名前かプリセットの名前を設定すればいいのだ。例えば、"琴葉 茜"とかを設定すればいいのだ。

COEIROINKの場合、ここにはキャラクターのStyleIdを指定するのだ。StyleIdは[この資料](coeiroink_speaker_list.md)を参考にしてほしいのだ。ただこの資料に載っているのは一部のキャラクターのみなのだ。使いたいキャラのStyleIdを調べるには、coeiroink_speaker_list.pyを実行してほしいのだ。

※旧名 speaker_id … v0.4.0から変更

#### ✨ assistant_speed_scale(既定値 1.2)
Expand All @@ -152,20 +167,26 @@ A.I.VOICEの場合、この設定は無効なのだ。読み上げ方はA.I.VOIC

※旧名 pitch_scale … v0.4.0から変更

#### ✨ user_prompt(既定値 あなた)v0.6.0から新設

あなたのメッセージのプロンプトに表示する文字列の設定なのだ。

#### ✨ user_echo(既定値 true)v0.2.0から新設

あなたのメッセージを声に出して読み上げるかどうかの設定なのだ。設定できる値は`true``false`の2つなのだ。

#### ✨ user_tts_software(既定値 VOICEVOX)v0.4.0から新設

あなたのメッセージのテキスト読み上げに使用するソフトウェアを選択するのだ。設定できる値は、"VOICEVOX""AIVOICE"、もしくはテキストを読み上げない場合に使用する""の3つなのだ
あなたのメッセージのテキスト読み上げに使用するソフトウェアを選択するのだ。設定できる値は、"VOICEVOX""AIVOICE"、"COEIROINK"、もしくはテキストを読み上げない場合に使用する""の4つなのだ

#### ✨ user_speaker_id(既定値 13)v0.2.0から新設

あなたの声のIDなのだ。VOICEVOXの場合、"13"は青山龍星を意味しているのだ。VOICEVOXに収録されている他のキャラクターの声で話して欲しいときは、この値を変更すればいいのだ。キャラクターのIDを調べるには、[この資料](voicevox_speaker_list.md)を参考にするといいのだ。

A.I.VOICEの場合、ここにはキャラクターの名前かプリセットの名前を設定すればいいのだ。例えば、"琴葉 茜"とかを設定すればいいのだ。

COEIROINKの場合、ここにはキャラクターのStyleIdを指定するのだ。StyleIdは[この資料](coeiroink_speaker_list.md)を参考にしてほしいのだ。ただこの資料に載っているのは一部のキャラクターのみなのだ。使いたいキャラのStyleIdを調べるには、coeiroink_speaker_list.pyを実行してほしいのだ。

#### ✨ user_speed_scale(既定値 1.2)v0.2.0から新設

あなたの声の読み上げの速さの設定なのだ。VOICEVOXのデフォルトは1.0なんだけど、ボクは少し早く読み上げさせたかったので1.2としているのだ。遅くしたい場合はこの値を減らせばいいのだ。
Expand Down Expand Up @@ -198,9 +219,9 @@ OpenAIのテキスト生成のモデル名を指定するのだ。これを変
モデルの一覧 … https://platform.openai.com/docs/models
利用料金 … https://openai.com/pricing#language-models

#### ✨ chat_character_name(既定値 ずんだ)
#### <s>chat_character_name(既定値 ずんだ)</s>

コマンドプロンプトに表示するキャラクターの名前を設定すのだ。話者を変えた場合や、自分の好きな名前にしたい場合はここを編集するといいのだ
v0.6.0で削除されたのだ。この設定は assistant_prompt に移行されたのだ

#### ✨ chat_instraction(既定値 君は優秀なアシスタント…以下略)

Expand Down Expand Up @@ -236,17 +257,31 @@ VOICEVOXの実行ファイルのパスを記載するのだ。この項目がな

A.I.VOICEのDLLのパスを記載するのだ。この項目がない場合は、A.I.VOICEの既定のインストール先の設定が使われるのだ。

#### ✨ coeiroink_path(既定値 空文字)v0.6.0から新設

COEIROINKの実行ファイルのパスを記載するのだ。COEIROINKは既定のインストール場所がないから、自分がインストールした場所(解凍した場所)を記載するのだ。例えば次のように記載するのだ。

```json
"coeiroink_path": "C:/Program Files/COEIROINK_GPU/COEIROINKv2.exe"
```

なんのことかわからない人は、COEIROINKを起動してから、ずんだGPTを使えば問題ないのだ。

## コマンド

### ⛏️ @assistant

チャットアシスタントの声の設定情報を表示するコマンドなのだ。

### ⛏️ @assistant_prompt [文字列]

チャットアシスタントのプロンプトを設定するコマンドなのだ。

### ⛏️ @assistant_echo [ on | off ] ( エイリアス @echo )

チャットアシスタントが回答を声に出して読み上げるかどうかを設定するコマンドなのだ。

### ⛏️ @assistant_tts_software [VOICEVOX | AIVOICE]
### ⛏️ @assistant_tts_software [VOICEVOX | AIVOICE | COEIROINK]

チャットアシスタントのテキスト読み上げに使用するソフトウェアを設定するコマンドなのだ。

Expand All @@ -266,11 +301,15 @@ A.I.VOICEのDLLのパスを記載するのだ。この項目がない場合は

あなたの声の設定情報を表示するコマンドなのだ。

### ⛏️ @user_prompt [文字列]

あなたのプロンプト文字列を設定するコマンドなのだ。

### ⛏️ @user_echo [ on | off ]

あなたの書いたテキストを声に出して読み上げるかどうかを設定するコマンドなのだ。

### ⛏️ @user_tts_software [VOICEVOX | AIVOICE]
### ⛏️ @user_tts_software [VOICEVOX | AIVOICE | COEIROINK]

あなたの書いたテキストを読み上げるのに使用するソフトウェアを設定するコマンドなのだ。

Expand Down Expand Up @@ -403,6 +442,11 @@ WindowsのIME設定で「以前のバージョンのMicrosoft IMEを使う」と

- リソース開放処理の修正

### 0.6.0 (2024/01/14)

- COEIROINK対応
- プロンプト文字列設定の変更と追加

## さいごに

楽しいと感じてくれると嬉しいのだ。また、使った感想などをissueなどに書き込んでくれるともっと嬉しいのだ。不定期でバージョンアップしていく予定なのでよろしくお願いしますなのだ。
Expand Down
54 changes: 53 additions & 1 deletion character.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
#
# VOICEキャラクターモジュール
#
# Copyright (c) 2023 led-mirage
# Copyright (c) 2023-2024 led-mirage
# このソースコードは MITライセンス の下でライセンスされています。
# ライセンスの詳細については、このプロジェクトのLICENSEファイルを参照してください。

Expand All @@ -16,6 +16,7 @@
from settings import Settings
from sound import play_sound
from voicevox_api import VoicevoxAPI
from coeiroink_api import CoeiroinkApi

# キャラクターファクトリ
class CharacterFactory:
Expand All @@ -33,6 +34,12 @@ def create_assistant_character(settings: Settings):
return CharacterAIVoice(
settings.get_aivoice_path(),
settings.get_assistant_speaker_id())
elif tts_software == "COEIROINK":
return CharacterCoeiroink(
settings.get_coeiroink_path(),
settings.get_assistant_speaker_id(),
settings.get_assistant_speed_scale(),
settings.get_assistant_pitch_scale())
else:
return None

Expand All @@ -50,6 +57,12 @@ def create_user_character(settings: Settings):
return CharacterAIVoice(
settings.get_aivoice_path(),
settings.get_user_speaker_id())
elif tts_software == "COEIROINK":
return CharacterCoeiroink(
settings.get_coeiroink_path(),
settings.get_user_speaker_id(),
settings.get_user_speed_scale(),
settings.get_user_pitch_scale())
else:
return None

Expand Down Expand Up @@ -137,3 +150,42 @@ def run_aivoice(cls, aivoice_path):
tts_control.StartHost()
tts_control.Connect()
cls._tts_control = tts_control

# COEIROINKキャラクター
class CharacterCoeiroink:
def __init__(self, coeiroink_path, speaker_id, speed_scale, pitch_scale):
self.coeiroink_path = coeiroink_path
self.speed_scale = speed_scale
self.pitch_scale = pitch_scale
self.speaker_id = speaker_id
CharacterCoeiroink.run_coeiroink(self.coeiroink_path)

# 話す
def talk(self, text):
if CharacterCoeiroink.run_coeiroink(self.coeiroink_path):
wave_data = CoeiroinkApi.get_wave_data(
self.speaker_id, text, speedScale=self.speed_scale, pitchScale=self.pitch_scale, volumeScale=0.8)
play_sound(wave_data)

# COEIROINKが起動しているかどうかを調べる
@staticmethod
def is_coeiroink_running():
return CoeiroinkApi.get_status() is not None

# COEIROINKが起動していなかったら起動する
@staticmethod
def run_coeiroink(coeiroink_path):
if CharacterCoeiroink.is_coeiroink_running():
return True
else:
if os.path.isfile(coeiroink_path):
subprocess.Popen(coeiroink_path, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
loop_count = 0
while CharacterCoeiroink.is_coeiroink_running() == False:
time.sleep(1)
loop_count += 1
if loop_count >= 10:
return False
return True
else:
return False
110 changes: 110 additions & 0 deletions coeiroink_api.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
# ZundaGPT
#
# COEIROINK APIクラス
#
# Copyright (c) 2024 led-mirage
# このソースコードは MITライセンス の下でライセンスされています。
# ライセンスの詳細については、このプロジェクトのLICENSEファイルを参照してください。

import json

import requests

class CoeiroinkApi:
DEFAULT_SERVER = "http://127.0.0.1:50032"
server = DEFAULT_SERVER

# ステータスを取得する
@staticmethod
def get_status(print_error=False) -> str:
try:
response = requests.get(f"{CoeiroinkApi.server}/")
response.raise_for_status()
return response.json()["status"]
except Exception as err:
if print_error:
print(err)
return None

# 話者リストを取得する
@staticmethod
def get_speakers(print_error=False) -> {}:
try:
response = requests.get(f"{CoeiroinkApi.server}/v1/speakers")
response.raise_for_status()
return response.json()
except Exception as err:
if print_error:
print(err)
return None

# スタイルIDから話者情報を取得する
@staticmethod
def get_speaker_info(styleId: int, print_error=False) -> {}:
try:
post_params = {"styleId": styleId}
response = requests.post(f"{CoeiroinkApi.server}/v1/style_id_to_speaker_meta", params=post_params)
response.raise_for_status()
return response.json()
except Exception as err:
if print_error:
print(err)
return None

# テキストの読み上げ用データを取得する
@staticmethod
def estimate_prosody(text: str, print_error=False) -> {}:
try:
post_params = {"text": text}
response = requests.post(f"{CoeiroinkApi.server}/v1/estimate_prosody", data=json.dumps(post_params))
response.raise_for_status()
return response.json()
except Exception as err:
if print_error:
print(err)
return None

# 音声データを生成する
@staticmethod
def synthesis(speaker: {}, text: str, prosody: {},
speedScale = 1, volumeScale = 1, pitchScale = 0, intonationScale = 1,
prePhonemeLength = 0.1, postPhonemeLength = 0.1, outputSamplingRate = 24000, print_error=False) -> bytes:
post_params = {
"speakerUuid": speaker["speakerUuid"],
"styleId": speaker["styleId"],
"text": text,
"prosodyDetail": prosody["detail"],
"speedScale": speedScale,
"volumeScale": volumeScale,
"pitchScale": pitchScale,
"intonationScale": intonationScale,
"prePhonemeLength": prePhonemeLength,
"postPhonemeLength": postPhonemeLength,
"outputSamplingRate": outputSamplingRate
}
try:
response = requests.post(f"{CoeiroinkApi.server}/v1/synthesis", data=json.dumps(post_params))
response.raise_for_status()
return response.content
except Exception as err:
if print_error:
print(err)
return None

# 音声データを生成する
@staticmethod
def get_wave_data(styleId: int, text: str,
speedScale = 1, volumeScale = 1, pitchScale = 0, intonationScale = 1,
prePhonemeLength = 0.1, postPhonemeLength = 0.1, outputSamplingRate = 24000, print_error=False) -> bytes:

speaker = CoeiroinkApi.get_speaker_info(styleId)
if speaker is None:
return None

prosody = CoeiroinkApi.estimate_prosody(text)
if prosody is None:
return None

return CoeiroinkApi.synthesis(speaker, text, prosody,
speedScale, volumeScale, pitchScale, intonationScale,
prePhonemeLength, postPhonemeLength, outputSamplingRate, print_error)
15 changes: 15 additions & 0 deletions coeiroink_speaker_list.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# COEIROINK キャラクターリスト

| SpeakerUuid | StyleId | キャラクター | スタイル |
|-------------|---------|--------------|----------|
| 292ea286-3d5f-f1cc-157c-66462a6a9d08 | 1 | MANA | のーまる |
| 292ea286-3d5f-f1cc-157c-66462a6a9d08 | 7 | MANA | いっしょうけんめい |
| 292ea286-3d5f-f1cc-157c-66462a6a9d08 | 40 | MANA | ごきげん |
| 292ea286-3d5f-f1cc-157c-66462a6a9d08 | 45 | MANA | どやがお |
| 2932eb06-e388-45bf-a6ba-dbc66a48961e | 41 | MANA+ | ふくれっつら |
| 2932eb06-e388-45bf-a6ba-dbc66a48961e | 42 | MANA+ | しょんぼり |
| 2932eb06-e388-45bf-a6ba-dbc66a48961e | 43 | MANA+ | ないしょばなし |
| 2932eb06-e388-45bf-a6ba-dbc66a48961e | 44 | MANA+ | ひっさつわざ |
| 3c37646f-3881-5374-2a83-149267990abc | 0 | つくよみちゃん | れいせい |
| 3c37646f-3881-5374-2a83-149267990abc | 5 | つくよみちゃん | おしとやか |
| 3c37646f-3881-5374-2a83-149267990abc | 6 | つくよみちゃん | げんき |
Loading

0 comments on commit d1270ad

Please sign in to comment.