Skip to content
@Parrotalk

앵무말(Parrotalk)

image

Slide 16_9 - 39

👉 앵무말 시연영상 바로가기

앵무말은 전화 통화에 어려움을 겪는 것을 일컫는 '콜포비아' 극복을 위한 AI 기반 통화 보조 서비스입니다.
이 서비스는 음성 통화를 텍스트로, 텍스트를 AI 음성 기술로 변환하여 사용자와 상대방 간의 의사소통을 더욱 편리하고 효과적으로 만들어 줍니다.
특히, 통화에 불안감을 느끼거나, 목소리에 자신감이 없거나, 말실수를 걱정하는 사용자에게 적합한 솔루션입니다.

팀원 및 역할

목차

📞 주요 기능

1. 1대1 통화

  • Voice to Voice : Socket.io, WebRTC, 자체 구축 STUN과 TURN 서버를 활용해 사용자간 1대1 음성통화가 가능합니다.
  • Voice to Chat : Voice to Voice에서 확장하여 Chat 유저는 WebRTC의 DataChannel를 사용하여 연결합니다.
    또한, Chat 사용자는 TTS를 사용해 Voice 사용자에게 자신이 입력한 Chat 메시지를 음성으로 출력하여 전달합니다.
    Voice 사용자의 말은 Amazon Transcribe를 활용한 스트리밍 STT로 실시간으로 Chat 사용자에게 Chat 메시지로 출력됩니다.
  • Chat to Chat : WebRTC의 DataChannel를 활용하여 일반 1대1 채팅으로 연결합니다.

2. 할 말 추천

  • Voice to Chat 시나리오에서 Chat 사용자는 대화 맥락에 맞는 예상되는 추천 문구를 총 3가지를 선택 가능합니다.
  • 추천은 채팅 입력창 위 3개의 버튼으로 출력되며, 버튼을 클릭해 바로 입력할 수 있습니다.
  • 추천은 추천이 필요한 상황인지 AI가 판단한 상황에서만 출력됩니다.

3. 통화 Todo 정리

  • 통화 종료 후, 통화 내용을 요약한 리스트가 출력되고 그 중 원하는 항목만 골라 저장하고
    마이페이지의 통화 목록에서 상대방이 누구였는지, 통화 일시는 언제였는지와 함께 확인할 수 있습니다.

⚒️ 기술스택

본문 확인 (👈 Click)

📞 텍스트 통화


🎤 STT / TTS


🤖 AI


🔄 CI/CD


🔍 모니터링


⚙️ 인프라

🔎 기술 사용 근거

본문 확인 (👈 Click)

1. 사용자간 웹 상 통화 구현 방법

  • HLS : 미디어 스트리밍에 있어서 점유율이 가장 높습니다.
    But, latency가 3초로 실시간 전송이 필요한 우리 서비스에는 미흡하다고 판단했습니다.
  • Twillio : 웹상 통화 API로 간단한 사용 방법과 실시간 전송, 일반 스마트폰과 웹 사용자와의 통화를 지원했습니다.
    But, 사용자마다 임시 번호를 구입해야하거나 미리 대량의 번호를 사 두고 돌아가며 지급해야하는 운영의 복잡성이 올라갑니다.
  • WebRTC : latency가 매우 낮고 실시간 전송을 보장하며 데이터 전송에서 서버를 거치지 않아 네트워크 사용량이 적습니다.
    But, 학습곡선이 높을 수 있고 NAT 환경에서의 연결을 위해 TURN 서버 구축이 필수이며 서버 비용이 높을 수 있습니다.

-> 서비스의 기술 요구사항에 따라 WebRTC 가 가장 적합하여 채택했습니다.


2. WebRTC 토폴로지 선택

  • MCU : 중앙에 미디어 서버를 두고 통신하는 방식으로 미디어 서버 구현 난이도와 클라우드 비용 문제가 상충하여 채택하지 않았습니다.
  • Mesh : 클라이언트 간 미디어를 직접 전송하는 방식으로 1대1일때 품질이 우수하고 대기시간이 짧아 채택했습니다.
  • SFU : 대규모 다자간 통신으로 확장성이 있고, SFU 역시 미디어 서버를 사용하지만
    MCU와 달리 서버에서 인코딩/디코딩을 하지 않아 추후 지속적인 서비스를 위해 고려하고 있습니다.

-> 1대1 통화를 우선으로 하니 Mesh로 구성했습니다.


3. STT 기술 선택

  • Google STT : 실시간 스트리밍을 제공하고 다양한 언어를 지원하지만 화자 분리 기능이 존재하지 않았습니다.
  • OpenAI Whisper : 무료지만 실시간 스트리밍을 제공하지 않아 Batch 처리를 해야 하므로 지연도가 높아집니다.
  • Amazon Transcribe : 실시간 스트리밍을 제공하고 추후 다자간 통신을 위한 화자 분리가 가능합니다.
    공식 문서가 잘 되어 있었고, 이미 사용하고 있는 Amazon의 다른 서비스와 함께 관리 및 운영이 수월했습니다.

-> Speech-to-Text 기술은 Amazon Transcribe를 활용했습니다.

💸 서버 아키텍처

본문 확인 (👈 Click)

Slide 16_9 - 46

Infrastructure & Application Management

1. Parrotalk-CD Repository

  • Terraform: AWS 인프라 구성 (VPC, EKS, RDS)
  • Ansible: Kubernetes 클러스터, ArgoCD 설치
  • Kubespray: K8s 클러스터 자동 설치

2. Parrotalk-Manifests Repository

  • 매니페스트 관리: K8s 리소스 정의 매니페스트 관리
  • 자동 배포: ArgoCD를 통한 자동 배포
  • 설정 관리: 마이크로서비스 및 인프라 설정 포함

배포 프로세스

  1. CD Repository로 인프라 구성 및 ArgoCD 설치
  2. ArgoCD가 Manifests Repository와 연동되어 전체 시스템 자동 구성
  3. 이후 모든 변경사항은 Git을 통해 자동 배포

🗂️ ERD

본문 확인 (👈 Click)
image

앵무말ERD

1. Users 테이블

  • 역할: 사용자 정보를 저장합니다.
  • 주요 필드:
    • user_id: 사용자 고유 식별자 (Primary Key)
    • nickname: 사용자의 닉네임
    • email: 사용자 이메일
    • provider: 소셜 로그인 방식 (e.g., KAKAO, GOOGLE)
    • profile_image: 사용자 프로필 이미지
    • created_at, updated_at: 데이터 생성 및 수정 시간

2. Talks 테이블

  • 역할: 대화 관련 정보를 저장합니다.
  • 주요 필드:
    • talk_id: 대화 고유 식별자 (Primary Key)
    • status: 대화 상태 (ACTIVE, INACTIVE, CLOSED)
    • created_at: 대화 생성 시간
    • closed_at: 대화 종료 시간
    • room_name: 대화방 이름
    • sender_id: 발신자 ID
    • receiver_id: 수신자 ID

3. Todos 테이블

  • 역할: 대화 방에서 생성된 투두(To-Do) 항목을 저장합니다.
  • 주요 필드:
    • todo_id: 투두 고유 식별자 (Primary Key)
    • title: 투두 제목

4. RoomUser_Detail 테이블

  • 역할: 마이페이지에서 유저별 투두(To-Do)를 관리하며, 사용자, 대화, 투두 간의 관계를 연결합니다.
  • 주요 필드:
    • user_id: 사용자 ID (Foreign Key)
    • todo_id: 투두 ID (Foreign Key)
    • talk_id: 대화 ID (Foreign Key)
    • todo_status: 투두의 상태를 나타내는 필드
  • 관계:
    • Users, Todos, Talks 테이블과 모두 연관. RoomUser_Detail은 다대다 관계를 구현하는 연결 테이블 역할을 합니다.

테이블 간 관계 요약

  • Users ↔ RoomUser_Detail: 사용자와 마이페이지 상세 정보는 1:N 관계입니다.
  • Talks ↔ RoomUser_Detail: 대화와 마이페이지 상세 정보는 1:N 관계입니다.
  • Todos ↔ RoomUser_Detail: 투두와 마이페이지 상세 정보는 1:N 관계입니다.

유의할 점

RoomUser_Detail 테이블의 데이터 증가 문제
RoomUser_Detail 테이블은 대화가 시작될 때 유저 수(2명)와 투두의 갯수만큼 데이터가 생성됩니다.
예를 들어, 대화 하나에 두 명의 유저와 10개의 투두 항목이 있다면, 이 대화로 인해 RoomUser_Detail 테이블에는 2 x 10 = 20개의 데이터가 추가됩니다.
여러 대화와 투두가 반복적으로 추가되면 데이터가 기하급수적으로 증가하여 성능 및 저장 공간에 문제가 발생할 수 있습니다.

최적화 전략 구상

  • 인덱싱 추가 → 빠른 쿼리 개선.
  • 캐싱 도입 → 자주 조회되는 데이터를 캐시에 저장.
  • 데이터 수명 관리 → 오래된 데이터를 주기적으로 삭제.
  • 비즈니스 로직 개선 → 중복 데이터 최소화.

📈 성능 개선 & 리팩토링

본문 확인 (👈 Click)

성능 개선 & 리팩토링 내용입니다.

🖥️ 테스트 & 모니터링

본문 확인 (👈 Click)

테스트 & 모니터링 내용입니다.

Popular repositories Loading

  1. .github .github Public

    카카오테크 파이널 프로젝트 Repository

  2. Parrotalk_BE Parrotalk_BE Public

    카카오테크 파이널 프로젝트 백엔드 Repository

    Java

  3. Parrotalk_FE Parrotalk_FE Public

    카카오테크 파이널 프로젝트 프론트엔드 Repository

    JavaScript

  4. Parrotalk_AI Parrotalk_AI Public

    카카오테크 파이널 프로젝트 AI Repository

    Python 2

  5. Parrotalk_CD Parrotalk_CD Public

    HCL

  6. Parrotalk Parrotalk Public

    Parrotalk 프로젝트의 메인 레포지토리입니다.

Repositories

Showing 6 of 6 repositories
  • Parrotalk_FE Public

    카카오테크 파이널 프로젝트 프론트엔드 Repository

    Parrotalk/Parrotalk_FE’s past year of commit activity
    JavaScript 0 0 1 0 Updated Jan 15, 2025
  • .github Public

    카카오테크 파이널 프로젝트 Repository

    Parrotalk/.github’s past year of commit activity
    0 0 0 0 Updated Jan 14, 2025
  • Parrotalk_CD Public
    Parrotalk/Parrotalk_CD’s past year of commit activity
    HCL 0 0 3 0 Updated Dec 26, 2024
  • Parrotalk_AI Public

    카카오테크 파이널 프로젝트 AI Repository

    Parrotalk/Parrotalk_AI’s past year of commit activity
    Python 0 2 7 2 Updated Dec 22, 2024
  • Parrotalk_BE Public

    카카오테크 파이널 프로젝트 백엔드 Repository

    Parrotalk/Parrotalk_BE’s past year of commit activity
    Java 0 0 1 0 Updated Dec 22, 2024
  • Parrotalk Public

    Parrotalk 프로젝트의 메인 레포지토리입니다.

    Parrotalk/Parrotalk’s past year of commit activity
    0 0 0 0 Updated Oct 13, 2024

Top languages

Loading…

Most used topics

Loading…