日別アーカイブ: 2023年5月4日

Pythonを用いたツンデレChat GPTとの対話

サンプル動画

ツンデレ

開発環境準備
・Chat GPT:テキストを考える
・Coeiroink:テキスト読みあげ→Voicevoxはコードを指定すれば使える
・Notepad++:プログラム書く
・python:プログラム動作
・IrfanView:Chat GPTリロードのスクショに

*Pythonの開発環境設定も忘れずに

Pythonプラグ(参考サイト

$ pip install requests
$ pip install pydub
$ pip install pyaudio
$ pip install pillow
$ python hello_ink.py

*ctrl+Cでpython対話終了

ファイルの保存先

Cドライブ直下に「INK」というファイルを作成し、そこにNotepad++で書いたプログラムなど今回用いるファイルを格納する。INK意外にした場合、プログラムを書き換える必要がある(auto01.py)。

Anaconda Navigater

以前使用したのが保存されないのか、「Anaconda Navigater→INK」を選択してからでないと左画像のようにPrompt内で(base)のままでエラーをはかれる。

動作チェック
そもそもCoeiroinkに読んでもらえるかの動作チェックは下記プログラムから。9行目のspeaker_idからつくよみちゃんのタイプを切り替える(ID6など)。

import json
 
import requests
from pydub import AudioSegment, playback
 
# パラメータ
text = "こんにちは、つくよみちゃんです。よろしくお願いします。"  # セリフ
text2="先日さ、友達とカラオケに行ったんだけど、その時の話がすごく面白かったんだよね。みんなで歌って楽しんでいたんだけど、途中で友達の一人が「誰か知らないけど、めちゃくちゃ上手い人が歌ってる!」って言い出したんだ。";
speaker_id = 1  # スピーカーID (0:つくよみちゃん)
 
# 音声合成のクエリの作成
response = requests.post(
    "http://localhost:50031/audio_query",
    params={
        'text': text2,
        'speaker': speaker_id,
        'core_version': '0.0.0'
    })
query = response.json()
 
# 音声合成のwavの生成
response = requests.post(
    'http://localhost:50031/synthesis',
    params={
        'speaker': speaker_id,
        'core_version': "0.0.0",
        'enable_interrogative_upspeak': 'true'
    },
    data=json.dumps(query))
 
# wavの音声を再生
playback.play(AudioSegment(response.content,
    sample_width=2, frame_rate=44100, channels=1))

実行するためのプログラム
この後に出てくる「setting01.txt」というChat GPT性格設定に使うテキスト文を元に、ヤンデレなり、ツンデレなり、思春期の娘など自分の好きなタイプに合わして会話できる。

注意点
・15行目:txtファイルの呼び出し
・21, 55, 69行目:カーソル位置
・38行目:画面のサイズを適当に→設定からMaxサイズを調べちょい減らした値

#auto01.py
import pyautogui
import pyperclip
import time
import json
import requests
from pydub import AudioSegment, playback
 
speaker_id = 0  # スピーカーID (0:つくよみちゃん)
#speaker_id = 1  # スピーカーID (まなノーマル)
config=""
 
##########################################
def copy_and_paste(text):
    with open('C:/INK/setting1.txt', 'r',encoding='utf-8') as f:
        config = f.read()
    #print(config)
 
    # インプット部分をクリックします
    #pyautogui.moveTo(-905, 1370)
    pyautogui.moveTo(361, 994)
    pyautogui.click()
    time.sleep(0.5)
 
    #print(text)
    print("_")
     
    #入力する
    pyperclip.copy(text)
    pyautogui.hotkey('ctrl', 'v')
    pyperclip.copy(config)
    pyautogui.hotkey('ctrl', 'v')
    pyautogui.press('enter')
 
    #出力終了を待つ
    time.sleep(1)
    print('scan ',end='')
    search_region = (0, 800, 900, 1070)
    
    time.sleep(5)
    
    
    while pyautogui.locateOnScreen('C:/INK/regbutton.png', region=search_region) == None:
        time.sleep(0.1)
        print('>',end='')
    print(" found")
    
   
    
         
    #下までスクロール
    #time.sleep(1)
    #pyautogui.scroll(-5000)
    #time.sleep(1)
    pyautogui.moveTo(856, 923)
    pyautogui.click()
    pyautogui.press('down')
    pyautogui.press('down')
    pyautogui.press('down')
    pyautogui.press('down')
    pyautogui.press('down')
    pyautogui.press('down')
    pyautogui.press('down')
    pyautogui.press('down')
    pyautogui.press('down')
    pyautogui.press('down')
 
    #x, y = -548, 1321
    x, y = 856, 901
    step=20
    prev_clipboard = pyperclip.paste()
 
    time.sleep(1)
 
    for i in range(40):
        y -= step
        pyautogui.moveTo(x, y)
        pyautogui.click()
         
        # クリップボードのテキストを取得して表示する
        clipboard_text = pyperclip.paste()
        #print(y, clipboard_text)
        if clipboard_text != prev_clipboard:
            break
         
        # 前回のクリップボードの内容を更新する
        prev_clipboard = clipboard_text    
 
    print(clipboard_text)
    pyautogui.moveTo(1791, 1220) #コンソールに復帰
    pyautogui.click()    
    return clipboard_text
 
##########################################
def speakINK(msg):
    # 音声合成のクエリの作成
    response = requests.post(
        "http://localhost:50031/audio_query",
        params={
            'text': msg,
            'speaker': speaker_id,
            'core_version': '0.0.0'
        })
    query = response.json()
      
    # 音声合成のwavの生成
    response = requests.post(
        'http://localhost:50031/synthesis',
        params={
            'speaker': speaker_id,
            'core_version': "0.0.0",
            'enable_interrogative_upspeak': 'true'
        },
        data=json.dumps(query))
      
    # wavの音声を再生
    playback.play(AudioSegment(response.content,
        sample_width=2, frame_rate=44100, channels=1))    
     
##########################################
def main():
  
    print("チャットをはじめます。q または quit で終了します。")
    print("-"*50)
    while True:
        user = input("<あなた>\n")
        if user == "q" or user == "quit":
            print("お疲れ様でした")
            break
        else:
            buf1=copy_and_paste(user)
            speakINK(buf1)
 
 
 
# 現在のカーソル位置を取得
#current_position = pyautogui.position()
#print("現在のカーソル位置:", current_position)
 
 
 
#buf1=copy_and_paste("こんにちは")
#speakINK(buf1)
 
 
 
#image_location  = pyautogui.locateOnScreen('C:/Users/Science/SELENIUM/clipicon.png')
#print(image_location )
 
if __name__ == "__main__":
    main()

人格設定
Chat GPTの人格設定で、文頭に「。」がついていると読み込みやすい。「~の話し方」「~という感じで」とかアバウトでok.

。敬語は使わず、ヤンデレの話し方をして下さい。回答は50~100文字くらいで行ってください。口調は「なんで逃げるの?」とか「あなたのことは何でも知ってる」「私だけはずっと側にいるよ」といった感じで話してください。

カーソル位置の取得
Pythonで勝手に文章のコピペ(コントロール)してもらうのに、座標を一つずつ教えてやらないといけないみたい。x, y座標を調べるためのプログラムは「auto02」。やり方は下記動画の通りマウスカーソルを合わして実行するだけ。座標の入力は「auto01」21, 55, 69行目。

#auto02.py
import pyautogui
import pyperclip
import time
  
# 現在のカーソル位置を取得
time.sleep(1)
current_position = pyautogui.position()
print("現在のカーソル位置:", current_position)

参考サイト(152)
Pythonで画面操作
Pythonでつくよみ