Skip to content

Commit

Permalink
v0.2.0
Browse files Browse the repository at this point in the history
  • Loading branch information
led-mirage committed Dec 17, 2023
1 parent e333fa0 commit fec01d5
Show file tree
Hide file tree
Showing 11 changed files with 510 additions and 53 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -160,3 +160,4 @@ cython_debug/
#.idea/

image/*
log/*
77 changes: 65 additions & 12 deletions Readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ VOICEVOX Engine … https://github.com/VOICEVOX/voicevox_engine

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

https://github.com/led-mirage/ZundaGPT/releases/tag/v0.1.0
https://github.com/led-mirage/ZundaGPT/releases/tag/v0.2.0

#### 3. 実行

Expand Down Expand Up @@ -109,23 +109,59 @@ Windowsの場合は、Windowsの検索窓で「環境変数を編集」で検索

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

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

声に出して読み上げるかどうかの設定なのだ。設定できる値は`true``false`の2つなのだ。

`@echo [ on | off ]`コマンドで設定可能なのだ。

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

声のIDなのだ。3はずんだもんを意味しているのだ。VOICEVOXに収録されている他のキャラクターの声で話して欲しいときは、この値を変更すればいいのだ。キャラクターのIDを調べるときは、「VOICEVOX スピーカーID 一覧」などとググれば出てくるのでそれを参考にすればいいのだ。
声のIDなのだ。3はずんだもんを意味しているのだ。VOICEVOXに収録されている他のキャラクターの声で話して欲しいときは、この値を変更すればいいのだ。キャラクターのIDを調べるには、[この資料](voicevox_speaker_list.md)を参考にするといいのだ。

`@speaker_id [数値]`コマンドで設定可能なのだ。

#### ✨speed_scale(既定値 1.2)
#### speed_scale(既定値 1.2)

読み上げの速さの設定なのだ。VOICEVOXのデフォルトは1.0なんだけど、ボクは少し早く読み上げさせたかったので1.2としているのだ。遅くしたい場合はこの値を減らせばいいのだ。

#### ✨pitch_scale(既定値 0.0)
`@speaker_scale [数値]`コマンドで設定可能なのだ。

#### ✨ pitch_scale(既定値 0.0)

声の高さの設定なのだ。この値を増やすと、声の高さが上がるのだ。ただ、少しの変化で大きく変わるので、0.1とか0.2とか小刻みに調整するといいのだ。

#### ✨voicevox_server(既定値 http://127.0.0.1:50021)
`@pitch_scale [数値]`コマンドで設定可能なのだ。

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

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

`@user_echo [ on | off ]`コマンドで設定可能なのだ。

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

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

`@user_speaker_id [数値]`コマンドで設定可能なのだ。

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

あなたの声の読み上げの速さの設定なのだ。VOICEVOXのデフォルトは1.0なんだけど、ボクは少し早く読み上げさせたかったので1.2としているのだ。遅くしたい場合はこの値を減らせばいいのだ。

`@user_speed_scale [数値]`コマンドで設定可能なのだ。

#### ✨ user_pitch_scale(既定値 0.0)v0.2.0から新設

あなたの声の高さの設定なのだ。この値を増やすと、声の高さが上がるのだ。ただ、少しの変化で大きく変わるので、0.1とか0.2とか小刻みに調整するといいのだ。

`@user_pitch_scale [数値]`コマンドで設定可能なのだ。

#### ✨ voicevox_server(既定値 http://127.0.0.1:50021)

VOICEVOXのサーバーのURLを記載するのだ。これがVOICEVOXのデフォルトなので、普通はここを変更する必要はないのだ。分かる人はわかると思うんだけど、このIPは自PCのIPになっているのだ。他のPCで実行しているVOICEVOXに声を生成してもらう場合は、このURLを変更すればいいのだ。ただ、ファイアウォールの設定とかいろいろ面倒なので、分からない人は気にする必要はないのだ。

#### ✨chat_api(既定値 OpenAI)
#### chat_api(既定値 OpenAI)

使用するAPIの設定なのだ。設定できる値は`OpenAI``AzureOpenAI`の二つなのだ。あまり使っている人はいないかもしれないけど、Azure OpenAI ServiceのAPIを使用する場合は`AzureOpenAI`にするのだ。

Expand All @@ -138,32 +174,42 @@ VOICEVOXのサーバーのURLを記載するのだ。これがVOICEVOXのデフ

需要がないと思うのでAzure OpenAI Serviceの詳しい説明は省略するのだ。使いたい人は自分で調べて欲しいのだ。

#### ✨chat_model(既定値 gpt-3.5-turbo-1106)
#### chat_model(既定値 gpt-3.5-turbo-1106)

OpenAIのテキスト生成のモデル名を指定するのだ。これを変更することでAIの賢さが変わるのだ。既定はリーズナブルなGTP3.5を使用しているのだ。もっと賢くしたい場合はGPT4.0系も使えるけれど、その分利用量が上がるので注意するのだ。使用できるモデルの一覧と利用料金は以下のリンクで確認できるのだ。

モデルの一覧 … https://platform.openai.com/docs/models
利用料金 … https://openai.com/pricing#language-models

#### ✨chat_character_name(既定値 ずんだ)
#### chat_character_name(既定値 ずんだ)

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

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

AIのキャラづけの設定なのだ。ここで、AIの台詞をずんだもんっぽくするようお願いしているのだ。ここを変更することで、ずんだもん以外のキャラクターっぽい回答を生成することも可能なのだ。

#### ✨chat_bad_response(既定値 答えられないのだ)
#### chat_bad_response(既定値 答えられないのだ)

何らかの原因でAIが回答できなかった場合に表示するセリフを設定するのだ。無理なお願いをするとAIが答えてくれない場合があるから気を付けるといいのだ。

#### ✨chat_history_size(既定値 6)
#### chat_history_size(既定値 6)

AIに送信する過去の会話の履歴数を設定するのだ。この値が大きいほど前の回答、質問を考慮した回答をAIが生成するようになって、会話のつながりがよくなるのだ。ただ、その分利用料金も増えるので注意が必要なのだ。

この設定がある理由を考えればわかるけど、OpenAIのAIは過去の会話を覚えていないのだ。質問をするたびに、過去の会話もAIに送信することで、AIは会話のつながりを知ることができるのだ。ただ利用料金は送信するデータ量が増えるとその分加算されるので、バランスをとることが大事なのだ。

### ℹ️ OpenAI API利用量確認ファイル(閲覧のみ)
#### ✨ chat_log_folder(既定値 log)v0.2.0から新設

チャットのログファイルを保存するフォルダを指定するのだ。この値が空文字の場合はログは保存されないのだ。

## 出力ファイル

### 🗒️ チャットログファイル

チャットのログはlogファルダに出力されるのだ。出力先はsettings.jsonファイルで変更することもできるのだ。アプリが起動してから終了するまでを1ファイルで出力するのだよ。

### 🗒️ OpenAI API利用量確認ファイル

`monthly_token_usage.json`ファイルは、このアプリで使用したOpenAI APIの利用量(トークン数)を月別に記録するファイルなのだ。利用料はトークン数(会話の量)で算出されるので、この値を参考にするといいのだ。

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

- ファーストリリース

### 0.2.0 (2023/12/18)

- チャットのログを保存する機能を追加
- ユーザー(あなた)のメッセージを読み上げる機能を追加
- 設定用のコマンドを追加
- chat_history_sizeが効かないバグを修正

## さいごに

楽しいと感じてくれると嬉しいのだ。また、使った感想などをissueなどに書き込んでくれるともっと嬉しいのだ。不定期でバージョンアップしていく予定なのでよろしくお願いしますなのだ。
Expand Down
1 change: 1 addition & 0 deletions build.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pyinstaller --onefile --icon=zundagpt.ico --name ZundaGPT main.py
36 changes: 28 additions & 8 deletions chat.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,25 @@
# このソースコードは MITライセンス の下でライセンスされています。
# ライセンスの詳細については、このプロジェクトのLICENSEファイルを参照してください。

import json
import os
from datetime import datetime
from typing import Tuple

from openai import OpenAI
from openai import AzureOpenAI

# チャット基底クラス
class Chat:
def __init__(self, client, model: str, instruction: str, bad_response: str, history_size: int):
def __init__(self, client, model: str, instruction: str, bad_response: str, history_size: int, log_folder: str):
self.messages = []
self.client = client
self.model = model
self.instruction = instruction
self.bad_response = bad_response
self.history_size = history_size
self.log_folder = log_folder
self.chat_start_time = datetime.now()

# メッセージを送信して回答を得る
def send_message(self, text: str) -> Tuple[str, int]:
Expand All @@ -32,13 +36,27 @@ def send_message(self, text: str) -> Tuple[str, int]:
content = response.choices[0].message.content
if content:
self.messages.append({"role": role, "content": content})
self.write_chat_log()
return content, response.usage.total_tokens
else:
return self.bad_response, 0

# チャットのログを保存する
def write_chat_log(self):
if self.log_folder == "":
return

if not os.path.exists(self.log_folder):
os.mkdir(self.log_folder)

filename = self.chat_start_time.strftime("chatlog-%Y%m%d-%H%M%S.txt")
path = os.path.join(self.log_folder, filename)
with open(path, "w", encoding="utf-8") as file:
json.dump(self.messages, file, ensure_ascii=False, indent=4)

# OpenAI チャットクラス
class ChatOpenAI(Chat):
def __init__(self, model: str, instruction: str, bad_response: str, history_size: int):
def __init__(self, model: str, instruction: str, bad_response: str, history_size: int, log_folder: str):
api_key = os.environ.get("OPENAI_API_KEY")
if api_key is None:
raise ValueError("環境変数 OPENAI_API_KEY が設定されていません。")
Expand All @@ -49,12 +67,13 @@ def __init__(self, model: str, instruction: str, bad_response: str, history_size
model = model,
instruction = instruction,
bad_response = bad_response,
history_size = history_size
history_size = history_size,
log_folder = log_folder
)

# Azure OpenAI チャットクラス
class ChatAzureOpenAI(Chat):
def __init__(self, model: str, instruction: str, bad_response: str, history_size: int):
def __init__(self, model: str, instruction: str, bad_response: str, history_size: int, log_folder: str):
endpoint = os.environ.get("AZURE_OPENAI_ENDPOINT")
if endpoint is None:
raise ValueError("環境変数 AZURE_OPENAI_ENDPOINT が設定されていません。")
Expand All @@ -69,17 +88,18 @@ def __init__(self, model: str, instruction: str, bad_response: str, history_size
model = model,
instruction = instruction,
bad_response = bad_response,
history_size = history_size
history_size = history_size,
log_folder = log_folder
)

# チャットファクトリー
class ChatFactory:
# api_idに基づいてChatオブジェクトを作成する
@classmethod
def create(cls, api_id: str, model: str, instruction: str, bad_response: str, history_size: int) -> Chat:
def create(cls, api_id: str, model: str, instruction: str, bad_response: str, history_size: int, log_folder: str) -> Chat:
if api_id == "OpenAI":
return ChatOpenAI(model, instruction, bad_response, history_size)
return ChatOpenAI(model, instruction, bad_response, history_size, log_folder)
elif api_id == "AzureOpenAI":
return ChatAzureOpenAI(model, instruction, bad_response, history_size)
return ChatAzureOpenAI(model, instruction, bad_response, history_size, log_folder)
else:
raise ValueError("API IDが間違っています。")
Loading

0 comments on commit fec01d5

Please sign in to comment.