개인 프로젝트/KarinAI

KarinAI :: OpenAI & Voicevox with Python

체리비! 2024. 2. 22. 01:15

20230311 개발시작

OpenAI API → Python


목표 : ChatGPT를 파이썬으로 구동해 보기

 


 

튜토리얼

 

[Python] pip 개념 및 설치 방법(pip, pip3)

본 포스팅에서는 pip 개념과 pip/pip3 설치 방법을 알아봅니다. 1. pip 개념 Pip Installs Packages의 약자 Python 패키지를 설치하고 관리하는 패키지 매니저(Package Manager) MacOS에서 brew, node의 npm, yarn, Linux에

heytech.tistory.com

 

ChatGPT API Python 사용법 (feat.DALL-E, Karlo)

ChatGPT API Python 사용법 (feat.DALL-E, Karlo)

wooiljeong.github.io

 

용어 정리

System

전역적인 규칙

한 80% 정도 들어먹는다.

항상 들어 먹는건 아냐


User

사용자가 GPT에게 할 말. 


Assistant

이전에 GPT가 응답했던 말을 기억. 다음에 응답할 말에 대한 힌트로 작용.


Token

단어의 길이

  • 너무 길면 잘릴 수도
  • Assistant로 받은 단어도 토큰으로 계산되는가?

 

실험

Assistant도 토큰에 포함될까?

 

GitHub - openai/tiktoken: tiktoken is a fast BPE tokeniser for use with OpenAI's models.

tiktoken is a fast BPE tokeniser for use with OpenAI's models. - openai/tiktoken

github.com

 

tiktoken으로 계산한 결과 : 743

 

 

실제 요청 : 3288

 

  • 결론 : 아무래도 실제 토큰에는 Assistant list 도 포함되어 있는 걸로 추정.
  • 토큰을 절약하면서 기억을 보존할 수는 없을까?

 


소스코드

import openai
import tiktoken

# 발급받은 API 키 설정
OPENAI_API_KEY = "-------------------"

# openai API 키 인증
openai.api_key = OPENAI_API_KEY

# 모델 - GPT 3.5 Turbo 선택
model = "gpt-3.5-turbo"

messages = [
    {
        "role": "system",
        "content": "---------------------"
    }
]


# To get the tokeniser corresponding to a specific model in the OpenAI API:
enc = tiktoken.encoding_for_model(model)
tokens = 0

def num_tokens_from_string(string: str, encoding_name: str) -> int:
    """Returns the number of tokens in a text string."""
    encoding = tiktoken.get_encoding(encoding_name)
    num_tokens = len(encoding.encode(string))
    return num_tokens

while True:
    # 질문 작성하기
    query = input("나 : ")
    tokens += num_tokens_from_string(query, "cl100k_base")

    messages.append(
        {
            "role": "user",
            "content": query
        }
    )

    # ChatGPT API 호출하기
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages
    )
    answer = response['choices'][0]['message']['content']
    print("AI : " + answer)

    tokens += num_tokens_from_string(answer, "cl100k_base")

    messages.append( # 리스트에 추가되는 거라서 role 중복 가능. 아마 모든 assistant를 순회 하는것으로 추정.
        {
            "role": "assistant",
            "content": answer
        },
    )

    print("현재토큰 : " + str(tokens))

 


결과

 


Voicevox → Python


목표 : 오픈소스 TTS인 Voicevox를 파이썬으로 구동해 보기

 


튜토리얼

 

GPT-3とVoiceVoxを活用してAIエージェントを作る!【Unity】|ねぎぽよし

何を作ったのか? OpenAI GPT-3+VoiceVoxで、3D AIエージェントを作ってLooking Glassで良い感じに表示させてみた! ふとした時に何か会話するの楽しいし、自分の作業してるすぐ横で見守ってくれる

note.com

 

VOICEVOXのサーバー(エンジン)をWindowsで立てる - Qiita

経緯Raspberry PiでVOICEVOXの音声を扱いたく、インストールしたが、"テスト"の3文字の音声合成に、1分程度かかってしまったため、ほかのPCに処理してもらう。したかったことWi…

qiita.com

 

Voicevox Engine

 

GitHub - VOICEVOX/voicevox_engine: 無料で使える中品質なテキスト読み上げソフトウェア、VOICEVOXの音声

無料で使える中品質なテキスト読み上げソフトウェア、VOICEVOXの音声合成エンジン. Contribute to VOICEVOX/voicevox_engine development by creating an account on GitHub.

github.com

 

VOICEVOXエンジンを使ったPythonでの「高」品質音声合成API

VOICEVOXは、商用利用が可能である無料のテキスト読み上げソフトです。ホームページ上では中品質と言われていますが、実際にはかなりの高品質の読み上げソフトです。今回はVOICEVOXエンジン

happy-shibusawake.com

 


플로우차트

flowchart LR n1(OpenAI API)-->|Text|n2(VoiceVox) f1(VoiceVox Engine)<-->n2 n2-->n3(TTS)

 


소스코드

import requests
import json
import pyaudio  # wav 파일 없이 오디오 재생
import time 

text = "こんにちは!"

params = {
    'speaker': '1',
    'text': text,
}

resAudioQuery = requests.post(
    'http://----------/audio_query', params=params)

# print(resAudioQuery)

resSynthesis = requests.post('http://----------/synthesis',
                             params={'speaker': '1'}, headers={'Content-Type': 'application/json'}, data=json.dumps(resAudioQuery.json()))

p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16,  
                channels=1,  
                rate=24000,  
                output=True)

time.sleep(0.2)  # 앞에 이상한 기계음 섞여서 0.2초 정도 쉬어준다음에 오디오 작성

stream.write(resSynthesis.content)

stream.stop_stream()
stream.close()

# 재생
p.terminate()

 


결과

  • 문제점 : Text는 일본어만 인식가능
  • 한국어 대안으로 네이버 CLOVA 사용 
    (비싸다)
  • 다른 방안이 필요.