- OpenAI(ChatGPT) API를 통해 질문에 대한 응답 생성
- ElevenLabs TTS API를 통해 텍스트 → 음성 변환
- 사용자 입력 → ChatGPT 응답 → 음성 출력까지 자동 처리
: 텍스트 입력 → AI 응답 생성 → 음성 출력 멀티모달 파이프라인 구성
ChatGPT API를 사용한 질의응답 프로그램
실시간 대화형 버전
from openai import OpenAI
import openai
import os
openai.api_key = os.environ.get("OPENAI_API_KEY0")
client = OpenAI(api_key=openai.api_key) # OpenAI 클라이언트 생성
system_message = {
"role": "system",
"content": "너는 한국의 전문적인 베테랑 변호사야. 나에게 법적인 상담을 해줘. 한국의 현재법 기준으로.",
}
user_message = [
{"role": "user", "content": "내 이름은 수빈"},
{"role": "user", "content": "백수"},
]
messages = [system_message] + user_message
while True:
user_input = input("사용자: ")
if user_input == "바이":
print("대답: 즐거운 대화였습니다! 감사합니다!")
break
messages.append({"role": "user", "content": user_input})
# client.chat.completions.create: 사용자가 입력한 문구에 대해 ChatGPT API를 호출, 응답을 반환하는 함수
completion = client.chat.completions.create(model="gpt-4o", messages=messages)
reply = completion.choices[0].message.content
print("대답: " + reply)
messages.append({"role": "assistant", "content": reply})
ElevenLabs API를 사용한 음성 합성
라이브러리 설치
pip install requests pydub
pydub 사용 시 ffmpeg 설치 필요
brew install ffmpeg
Download FFmpeg
If you find FFmpeg useful, you are welcome to contribute by donating. More downloading options Git Repositories Since FFmpeg is developed with Git, multiple repositories from developers and groups of developers are available. Release Verification All FFmpe
ffmpeg.org
.env 파일예시
API Key들은 nano파일에 넣어주고, voice_id는 .env파일 만들어서 넣어줬음
voice_id=모델id
텍스트 → 음성 변환 코드
import os
import requests
from pydub import AudioSegment
from pydub.playback import play
import io
# 환경 변수에서 API키 불러오기
api_key = os.environ.get("ELEVENLABS_API_KEY")
# 사용자 설정
output_filename = "output_audio.mp3"
voice_id = os.environ.get("voice_id")
url = f"https://api.elevenlabs.io/v1/text-to-speech/{voice_id}"
headers = {"xi-api-key": api_key, "Content-Type": "application/json"}
# 텍스트 입력
text = input("텍스트: ")
# 요청 데이터
data = {
"text": text,
"model_id": "eleven_multilingual_v2",
"voice_settings": {
"style": 1, # 0.0 ~ 1.0 감정/표현력 정도
"use_speaker_boost": True, # True/False 음성 강조/존재감
},
}
# 요청 및 재생
response = requests.post(url, json=data, headers=headers, stream=True)
if response.status_code == 200:
audio_content = b""
for chunk in response.iter_content(chunk_size=1024):
audio_content += chunk
segment = AudioSegment.from_mp3(io.BytesIO(audio_content))
segment.export(output_filename, format="mp3")
print(f"음성 파일 저장 완료: {output_filename}")
play(segment)
else:
print(f"요청 실패: {response.status_code}, {response.text}")
ChatGPT와 ElevenLabs 연동하기
1. 사용자 질문을 입력 : input()으로 사용자 입력 받음
2. ChatGPT가 답변 생성 : ChatGPT API로 응답 생성
3. 생성된 답변을 ElevenLabs로 전송 : ElevenLabs API로 음성 생성
4. 음성 파일로 저장 + 자동 재생 : pydub로 음성 재생
import os
import io
import openai # chatGPT API 호출용
import requests # ElevenLabs REST API 요청용
from dotenv import load_dotenv # 환경변수 관리용
# 오디오 재생 및 배속처리용
from pydub import AudioSegment
from pydub.playback import play
# .env 파일에서 환경변수 불러오기
load_dotenv()
openai.api_key = os.environ.get("OPENAI_API_KEY0")
eleven_key = os.environ.get("ELEVENLABS_API_KEY")
voice_id = os.environ.get("voice_id")
# ElevenLabs TTS API 기본 정보
tts_url = f"https://api.elevenlabs.io/v1/text-to-speech/{voice_id}"
headers = {"xi-api-key": eleven_key, "Content-Type": "application/json"}
# 음성 생성 요청 (텍스트 → 오디오 바이트)
def generate_audio(text):
data = {
"text": text,
"model_id": "eleven_multilingual_v2",
"voice_settings": {
"stability": 0.5,
"similarity_boost": 0.1,
"style": 1.0,
"use_speaker_boost": True,
},
}
response = requests.post(tts_url, json=data, headers=headers, stream=True)
if response.status_code == 200:
audio_bytes = b""
for chunk in response.iter_content(chunk_size=1024):
audio_bytes += chunk
return audio_bytes
else:
print(f"TTS 요청 실패: {response.status_code}")
print(response.text)
return None
# 오디오 바이트를 mp3로 변환 후 배속 재생
def play_audio(audio_bytes, speed=1.5):
audio = AudioSegment.from_mp3(io.BytesIO(audio_bytes))
faster_audio = audio.speedup(playback_speed=speed)
faster_audio.export("output_chat_audio.mp3", format="mp3")
play(faster_audio)
# 텍스트를 음성으로 출력 (generate + play 조합)
def speak(text):
audio_bytes = generate_audio(text)
if audio_bytes:
play_audio(audio_bytes)
# 시스템 프롬프트 설정
system_message = {
"role": "system",
"content": "너는 전문적인 한국 변호사야. 사용자 질문에 한국 법률 기준으로 명확하고 조리 있게 설명해줘. 자연스럽고 친근한 문장으로 말해줘.",
}
# 사용자 초기 메시지
user_message = [
{"role": "user", "content": "사실은 법률상담필요 없음"},
{"role": "user", "content": "아무말이나 하러 온 사람임"},
]
# 전체 메시지 목록 초기화
messages = [system_message] + user_message
# 사용자와의 대화 루프
while True:
user_input = input("\n사용자: ")
# 종료 명령어 입력 시
if user_input.lower() in ["그만", "바이", "done", "exit"]:
farewell = "즐거운 대화였습니다! 고맙습니다"
print(f"\n변호사: {farewell}")
speak(farewell)
break
# 사용자 입력 추가
messages.append({"role": "user", "content": user_input})
# ChatGPT 응답 생성
completion = openai.chat.completions.create(model="gpt-4o", messages=messages)
reply = completion.choices[0].message.content.strip()
messages.append({"role": "assistant", "content": reply})
# 응답 출력 및 음성 재생
print(f"\n변호사: {reply}")
speak(reply)
generate_audio(text)
텍스트를 ElevenLabs API로 전송하고 오디오 바이트 반환
play_audio(audio_bytes, speed=1.5)
mp3로 변환 후 배속 재생
speak(text)
위 두 함수를 합쳐 텍스트 음성으로 출력
[사용자 입력] → [ChatGPT 응답] → [음성 변환 요청] → [1.5배속 음성 출력]
↘ ↘
messages.append speak()
'⊢ AI 모델 활용' 카테고리의 다른 글
FastAI: 사전 학습된 모델을 활용한 이미지 분류 (4) | 2025.03.27 |
---|---|
Ultralytics YOLOv8를 활용한 이미지 및 실시간 객체 탐지 (1) | 2025.03.26 |
FastAPI를 활용한 API 구축 (2) | 2025.03.25 |
Stable Diffusion을 활용한 이미지 생성 (0) | 2025.03.25 |
생성형 모델의 기본 원리 - 랜덤성(Randomness)과 조건성(Conditionality) (3) | 2025.03.25 |