AI Sparkup

복잡한 AI 세상을 읽는 힘

파이썬으로 구현하는 AI 음성 에이전트: 최신 라이브러리 및 실전 적용 가이드

인공지능 기술이 발전함에 따라 사람과 기계 간의 상호작용 방식이 급격히 변화하고 있습니다. 특히 음성 에이전트 기술은 이러한 변화의 최전선에 서 있으며, 더 직관적이고 자연스러운 사용자 경험을 제공하고 있습니다. 이 글에서는 AI 음성 에이전트 개발에 필요한 최신 파이썬 라이브러리들과 실제 고객 지원 음성 에이전트를 구현하는 방법에 대해 알아보겠습니다.

AI 음성 에이전트란?

 스마트 홈 기기에서 작동하는 음성 에이전트 (출처: Unsplash)

AI 음성 에이전트는 사용자의 명령을 이해, 처리, 응답할 수 있는 AI 기반 시스템입니다. 이 시스템은 음성 인식(Speech Recognition), 자연어 처리(Natural Language Processing, NLP), 그리고 텍스트-음성 변환(Text-to-Speech, TTS) 기술을 활용하여 사용자와 음성 명령을 통해 상호작용합니다.

현재 음성 에이전트는 다양한 분야에서 활용되고 있습니다:

  • 가상 비서(시리, 구글 어시스턴트 등)
  • 고객 지원 챗봇
  • 콜센터 자동화
  • 스마트 홈 제어
  • 접근성 솔루션

성공적인 음성 에이전트 개발을 위해서는 다음과 같은 핵심 요소들이 필요합니다:

  • 음성 인식 및 텍스트 변환(STT)
  • 자연어 이해(NLU)
  • 텍스트-음성 변환(TTS)
  • 대화 관리

음성 에이전트 개발을 위한 최고의 파이썬 라이브러리

파이썬은 음성 에이전트 개발에 가장 널리 사용되는 프로그래밍 언어 중 하나입니다. 여기서는 효율적인 음성 에이전트를 구축하는 데 도움이 되는 상위 10개의 오픈소스 파이썬 라이브러리를 소개합니다.

1. SpeechRecognition

SpeechRecognition은 음성을 텍스트로 변환하는 오픈소스 파이썬 라이브러리입니다. 여러 음성 인식 엔진을 지원하기 때문에 개발자가 정확도, 속도, 인터넷 연결 가능 여부, 비용 등을 고려하여 적합한 엔진을 선택할 수 있습니다.

주요 특징:

  • Google Speech Recognition, Microsoft Azure Speech, IBM Speech to Text 등의 온라인 서비스 지원
  • CMU Sphinx, Vosk API, OpenAI Whisper 등의 오프라인 엔진 호환
  • PyAudio 라이브러리를 통한 실시간 음성 인식 지원
  • 노이즈 보정 기능
  • 실시간 명령어 감지 기능

2. Pyttsx3

Pyttsx3는 인터넷 연결 없이도 텍스트를 음성으로 합성할 수 있는 파이썬 라이브러리입니다. 클라우드 기반 TTS 솔루션과 달리 로컬 기기에서만 실행되므로 기밀성 보장, 응답 시간 단축, 인터넷 연결 의존도 감소 등의 장점이 있습니다.

주요 특징:

  • 다양한 운영체제별 TTS 엔진 지원 (Windows: SAPI5, macOS: NSSpeechSynthesizer, Linux: eSpeak)
  • 말하기 속도 조절 가능
  • 음량 제어 기능
  • 남성/여성 음성 선택 (엔진에 따라 다름)
  • 합성된 음성을 오디오 파일로 저장 가능

3. Vocode

Vocode 라이브러리 AI 음성 기술의 발전 (출처: Unsplash)

Vocode는 LLM(대규모 언어 모델) 기반의 실시간 음성 비서를 만들기 위한 오픈소스 파이썬 라이브러리입니다. 음성 인식, 텍스트-음성 변환, 대화형 AI의 통합을 용이하게 만들어 전화 비서, 자동화된 고객 상담원, 실시간 음성 애플리케이션 등을 구현하는 데 적합합니다.

주요 특징:

  • 다양한 STT 서비스 지원 (AssemblyAI, Deepgram, Google Cloud, Microsoft Azure, RevAI, Whisper 등)
  • 다양한 TTS 서비스 지원 (Rime.ai, Microsoft Azure, Google Cloud, Play.ht, Eleven Labs, gTTS 등)
  • OpenAI, Anthropic 등이 개발한 대규모 언어 모델과의 통합
  • 실시간 스트리밍 지원

4. WhisperX

WhisperX는 OpenAI의 Whisper 모델을 기반으로 한 고정밀 파이썬 라이브러리로, 실시간 음성 에이전트 애플리케이션에 최적화되어 있습니다. 빠른 트랜스크립션, 화자 구분, 다국어 지원 등의 기능을 제공하며, 일반 음성-텍스트 소프트웨어보다 노이즈가 많고 여러 화자가 있는 환경에서 더 뛰어난 성능을 발휘합니다.

주요 특징:

  • 빠른 트랜스크립션 (배치 처리를 통한 속도 향상)
  • 정확한 단어 수준 타임스탬프
  • pyannote-audio를 통한 화자 구분
  • 음성 활동 감지(VAD)를 통한 배경 소음 제거
  • 다국어 지원

5. Rasa

Rasa는 지능형 AI 비서를 구축하기 위한 오픈소스 머신러닝 프레임워크입니다. 자연어 이해와 대화 관리를 목적으로 설계되어 사용자 상호작용을 처리하는 종단간 도구입니다. Rasa는 단순 STT나 TTS 기능을 제공하지는 않지만, 음성 비서에 맥락을 이해하고 자연스럽게 대화할 수 있는 지능을 부여합니다.

주요 특징:

  • 고급 NLU (사용자 의도 및 엔티티 파악)
  • 대화 관리 (다중 대화 턴 유지)
  • 다중 플랫폼 호환성 (Alexa Skills, Google Home Actions, Twilio, Slack 등)
  • 음성 스트리밍 기능
  • 확장성과 유연성
  • 맞춤형 파이프라인 설정

6~10. 추가 라이브러리

그 외에도 음성 에이전트 개발에 유용한 파이썬 라이브러리로는 다음과 같은 것들이 있습니다:

  • Deepgram: 클라우드 기반 음성 인식 및 합성 플랫폼
  • Mozilla DeepSpeech: 바이두의 Deep Speech 연구를 기반으로 한 오픈소스 STT 엔진
  • Pipecat: 음성 우선 및 멀티모달 대화형 에이전트 개발을 단순화하는 오픈소스 파이썬 플랫폼
  • PyAudio: 오디오 장치 접근 및 제어를 위한 파이썬 패키지
  • Pocketsphinx: 완전 오프라인으로 작동하는 경량 음성 인식 엔진

실전 적용: 고객 지원 음성 에이전트 구현하기

음성 에이전트 코드 음성 에이전트 개발 환경 (출처: Unsplash, Ales Nesetril)

이제 위에서 소개한 라이브러리들을 활용하여 실제 고객 지원 음성 에이전트를 만들어 보겠습니다. 이 애플리케이션은 문서 웹사이트를 크롤링하고, 내용을 검색 가능한 지식 베이스로 처리한 후, 사용자 질문에 텍스트와 음성으로 응답하는 시스템입니다.

사용 기술

  • Firecrawl: 문서 웹사이트에서 콘텐츠 추출
  • Qdrant: 벡터 저장 및 검색 기능
  • OpenAI GPT-4o: 메인 언어 모델
  • OpenAI GPT-4o-mini TTS: 텍스트-음성 변환 모델
  • OpenAI Agents SDK: AI 에이전트와 음성 파이프라인 조정
  • FastEmbed: 임베딩 생성

애플리케이션 작동 방식

이 애플리케이션은 크게 세 단계로 작동합니다:

  1. 시스템 초기화
    • 사용자가 API 키(Qdrant, Firecrawl, OpenAI)와 문서 URL을 입력
    • TTS 음성 선택
    • 시스템이 Qdrant에 연결하고 벡터 컬렉션 생성
    • Firecrawl이 지정된 문서 URL에서 콘텐츠 추출
    • 콘텐츠를 청크로 처리하여 임베딩 후 Qdrant에 저장
    • 두 개의 OpenAI 에이전트 구성
  2. 질의 처리
    • 사용자가 질문 입력
    • 질문의 임베딩 생성
    • Qdrant에서 가장 관련성 높은 문서 청크 검색
    • 상위 3개 청크를 추출하여 질문과 함께 맥락으로 포맷팅
    • GPT-4o 에이전트가 답변 생성
    • TTS 에이전트가 최적의 음성 합성을 위해 응답 포맷팅
    • OpenAI의 GPT-4o-mini TTS가 선택된 음성으로 텍스트를 오디오로 변환
  3. 응답 제공
    • 텍스트 응답 표시
    • 오디오 재생
    • 출처 URL 표시
    • 오디오 파일 다운로드 옵션 제공

코드 구현

아래는 Streamlit을 사용한 고객 지원 음성 에이전트 구현의 핵심 코드입니다:

# 필요한 라이브러리 임포트
from typing import List, Dict, Optional
from pathlib import Path
import os
from firecrawl import FirecrawlApp
from qdrant_client import QdrantClient
from qdrant_client.http import models
from qdrant_client.http.models import Distance, VectorParams
from fastembed import TextEmbedding
from agents import Agent, Runner
from openai import AsyncOpenAI
import tempfile
import uuid
from datetime import datetime
import time
import streamlit as st
from dotenv import load_dotenv
import asyncio

load_dotenv()  # 환경 변수 로드

# 세션 상태 초기화
def init_session_state():
    defaults = {
        "initialized": False,
        "qdrant_url": "",
        "qdrant_api_key": "",
        "firecrawl_api_key": "",
        "openai_api_key": "",
        "doc_url": "",
        "setup_complete": False,
        "client": None,
        "embedding_model": None,
        "processor_agent": None,
        "tts_agent": None,
        "selected_voice": "coral"
    }
    
    for key, value in defaults.items():
        if key not in st.session_state:
            st.session_state[key] = value

# Qdrant 컬렉션 설정
def setup_qdrant_collection(qdrant_url, qdrant_api_key, collection_name="docs_embeddings"):
    client = QdrantClient(url=qdrant_url, api_key=qdrant_api_key)
    embedding_model = TextEmbedding()
    test_embedding = list(embedding_model.embed(["test"]))[0]
    embedding_dim = len(test_embedding)
    
    try:
        client.create_collection(
            collection_name=collection_name,
            vectors_config=VectorParams(size=embedding_dim, distance=Distance.COSINE)
        )
    except Exception as e:
        if "already exists" not in str(e):
            raise e
    
    return client, embedding_model

# OpenAI 에이전트 설정
def setup_agents(openai_api_key):
    os.environ["OPENAI_API_KEY"] = openai_api_key
    
    processor_agent = Agent(
        name="Documentation Processor",
        instructions="""문서를 분석하여 사용자 질문에 명확하고 유익한 응답을 생성하는 도움말 문서 비서입니다.""",
        model="gpt-4o"
    )

    tts_agent = Agent(
        name="Text-to-Speech Agent",
        instructions="""음성 합성에 최적화된 응답을 생성하는 TTS 에이전트입니다. 자연스러운 억양과 적절한 강조를 위해 텍스트를 조정합니다.""",
        model="gpt-4o-mini-tts"
    )
    
    return processor_agent, tts_agent

# 질의 처리 함수
async def process_query(query, client, embedding_model, processor_agent, tts_agent, collection_name, openai_api_key):
    try:
        # 질의 임베딩 생성 및 유사 문서 검색
        query_embedding = list(embedding_model.embed([query]))[0]
        search_response = client.query_points(
            collection_name=collection_name,
            query=query_embedding.tolist(),
            limit=3,
            with_payload=True
        )
        
        # 검색 결과 처리 및 컨텍스트 구성
        search_results = search_response.points if hasattr(search_response, 'points') else []
        context = "다음 문서를 기반으로 답변하세요:\n\n"
        for result in search_results:
            # 각 결과에서 콘텐츠 추출...
        
        # 프로세서 에이전트로 텍스트 응답 생성
        processor_result = await Runner.run(processor_agent, context)
        processor_response = processor_result.final_output
        
        # TTS 에이전트로 TTS 지침 생성
        tts_result = await Runner.run(tts_agent, processor_response)
        tts_response = tts_result.final_output
        
        # OpenAI TTS로 오디오 생성
        async_openai = AsyncOpenAI(api_key=openai_api_key)
        audio_response = await async_openai.audio.speech.create(
            model="gpt-4o-mini-tts",
            voice=st.session_state.selected_voice,
            input=processor_response,
            instructions=tts_response,
            response_format="mp3"
        )
        
        # 오디오 파일 임시 저장
        temp_dir = tempfile.gettempdir()
        audio_path = os.path.join(temp_dir, f"response_{uuid.uuid4()}.mp3")
        with open(audio_path, "wb") as f:
            f.write(audio_response.content)
        
        # 결과 반환
        return {
            "status": "success",
            "text_response": processor_response,
            "audio_path": audio_path,
            # 추가 세부 정보...
        }
    except Exception as e:
        return {"status": "error", "message": str(e)}

# 메인 Streamlit 앱
def run_streamlit():
    st.set_page_config(
        page_title="고객 지원 음성 에이전트",
        page_icon="🎙️",
        layout="wide"
    )
    
    init_session_state()
    
    st.title("🎙️ 고객 지원 음성 에이전트")
    st.markdown("""
    OpenAI SDK 기반 음성 지원 문서 질의응답 시스템! 사용 방법:
    1. 사이드바에 API 키 설정
    2. 분석할 문서 URL 입력
    3. 아래에 질문을 입력하여 텍스트와 음성 응답 모두 받기
    """)
    
    # 사이드바 설정 코드...
    
    # 사용자 질의 처리
    query = st.text_input(
        "문서에 대해 무엇을 알고 싶으신가요?",
        placeholder="예: API 요청은 어떻게 인증하나요?",
        disabled=not st.session_state.setup_complete
    )
    
    if query and st.session_state.setup_complete:
        with st.status("질의 처리 중...") as status:
            # 질의 처리 및 결과 가져오기
            result = asyncio.run(process_query(...))
            
            if result["status"] == "success":
                # 텍스트 응답 표시
                st.markdown("### 응답:")
                st.write(result["text_response"])
                
                # 오디오 플레이어와 다운로드 버튼 표시
                st.markdown(f"### 🔊 음성 응답 (음성: {st.session_state.selected_voice})")
                st.audio(result["audio_path"], format="audio/mp3")
                
                # 다운로드 버튼 추가
                with open(result["audio_path"], "rb") as audio_file:
                    audio_bytes = audio_file.read()
                    st.download_button(
                        label="📥 음성 응답 다운로드",
                        data=audio_bytes,
                        file_name=f"voice_response_{st.session_state.selected_voice}.mp3",
                        mime="audio/mp3"
                    )

음성 에이전트의 실제 활용 사례

음성 에이전트는 다양한 산업 분야에서 활용되고 있습니다:

  • 음성 제어 스마트 홈 지원: 아마존 알렉사, 구글 어시스턴트 등을 통해 조명, 온도조절기, 엔터테인먼트 시스템 등의 스마트 홈 기기 제어
  • 원격 의료 및 건강 모니터링: 간단한 건강 자가 점검, 약 복용 알림, 의사 예약 지원
  • 가상 의료 도우미: IBM Watson과 같은 플랫폼이 의사에게 의료 데이터 제공, 진단 추천, 환자 처리 지원
  • 차량 내 음성 비서: 테슬라, BMW 등의 차량에 내장된 음성 에이전트가 운전자의 손을 사용하지 않고도 네비게이션, 음악 변경, 통화 응답 등 지원
  • 승차 공유 서비스: 우버나 리프트와 같은 승차 공유 서비스가 음성 명령을 통해 승차 예약이나 승차 상태 확인 기능 추가

결론

음성 에이전트는 인간-기계 상호작용을 혁신적으로 변화시키며, 직관적이고 지능적인 대화형 인터페이스를 만들어냈습니다. 스마트 홈 기기를 넘어 고객 지원, 의료, 자동차 등 다양한 산업에 혜택을 주고 있습니다. Vocode, WhisperX, Rasa, Deepgram과 같은 강력한 라이브러리들이 음성 인식, 텍스트-음성 변환, NLP 등의 기능을 제공하여 이러한 혁신을 뒷받침하고 있습니다.

AI 기술이 계속 발전함에 따라 음성 에이전트는 더욱 정교해지고, 일상 생활에서의 자동화와 접근성을 향상시킬 것입니다. 음성 기술의 발전과 오픈소스 커뮤니티의 기여로, 이러한 에이전트들은 현대 디지털 생태계의 핵심 구성 요소로 자리잡아 효율성을 높이고 사용자 인터페이스를 개선할 것입니다.

이제 위에서 소개한 라이브러리와 구현 방식을 활용하여 여러분만의 음성 에이전트를 개발해 보세요. 간단한 음성 비서부터 복잡한 AI 기반 시스템까지, 이러한 도구들이 개발 과정을 원활하게 만들어 줄 것입니다.

참고자료


Awsom GPT에서 더 알아보기

구독을 신청하면 최신 게시물을 이메일로 받아볼 수 있습니다.

Comments