이 블로그 글에서 배운 내용:
- LiveKit이 무엇이며 음성 및 영상 기능을 갖춘 현대적 AI 에이전트 구축에 이상적인 솔루션인 이유.
- AI 에이전트가 접근성 준비가 되어야 하는 이유와 기업이 접근성 있는 AI 솔루션을 구축할 때 직면하는 요구사항.
- Bright Data가 LiveKit과 어떻게 통합되어 실제 브랜드 뉴스 팟캐스트 AI 에이전트를 생성하는지.
- LiveKit에서 Bright Data 통합을 활용한 AI 음성 에이전트 구축 방법.
자, 시작해 보겠습니다!
LiveKit이란?
LiveKit은 음성, 비디오 및 다중 모드 상호 작용을 위한 생산 등급의 AI 에이전트를 구축할 수 있는 오픈 소스 프레임워크 및 클라우드 플랫폼입니다. 
특히 Node.js, Python 또는 코딩이 필요 없는 Agent Builder 웹 인터페이스로 구축된 AI 파이프라인 및 에이전트를 사용하여 오디오, 비디오 및 데이터 스트림을 처리하고 생성할 수 있습니다.
이 플랫폼은 가상 비서, 콜센터 자동화, 원격 의료, 실시간 번역, 대화형 NPC, 로봇 제어 등 음성 AI 사용 사례에 적합합니다.
LiveKit은 STT(음성-텍스트 변환), LLM, TTS(텍스트-음성 변환) 파이프라인을 지원하며, 다중 에이전트 핸드오프, 외부 도구 통합, 안정적인 턴 감지 기능을 제공합니다. 에이전트는 LiveKit Cloud 또는 자체 인프라에 배포할 수 있으며, 확장 가능한 오케스트레이션, WebRTC 기반 안정성, 내장된 전화 통신 지원 기능을 갖추고 있습니다.
접근성 지원 AI 에이전트의 필요성
현재 AI 에이전트의 가장 큰 문제점 중 하나는 대부분 접근성 지원이 준비되지 않았다는 점입니다. 많은 AI 에이전트 구축 플랫폼은 주로 텍스트 입력과 텍스트 출력에 의존하는데, 이는 많은 사용자에게 제한적일 수 있습니다.
이는 특히 기업에게 문제가 됩니다. 기업은 접근 가능한 내부 도구를 제공해야 할 뿐만 아니라 현대적 접근성 규정(예: 유럽 접근성 법)을 준수하는 제품을 제공해야 하기 때문입니다.
이러한 요구사항을 충족하려면 접근성 규정을 준수하는 AI 에이전트가 다양한 능력, 기기, 환경을 가진 사용자를 지원해야 합니다. 여기에는 명확한 음성 상호작용, 실시간 자막, 스크린 리더 호환성, 저지연 성능이 포함됩니다. 글로벌 조직의 경우 다국어 지원, 소음 환경에서의 안정적인 음성 인식, 웹·모바일·전화 환경 전반에 걸친 일관된 경험도 필수입니다.
LiveKit은 실시간 음성 및 영상 인프라, 내장형 음성-텍스트 및 텍스트-음성 변환 파이프라인, 저지연 스트리밍을 제공하여 이러한 과제를 해결합니다. 자막, 대본, 기기 대체 기능, 전화 통합을 지원하는 아키텍처를 통해 기업은 모든 채널에서 포용적이고 신뢰할 수 있는 AI 에이전트를 구축할 수 있습니다.
LiveKit + Bright Data: 아키텍처 개요
AI 에이전트의 가장 큰 문제점 중 하나는 학습 데이터에 한정된 지식입니다 . 실제로 이는 정보가 오래되었으며 적절한 외부 도구 없이는 현실 세계와 상호작용할 수 없음을 의미합니다.
LiveKit은 도구 호출을 지원하여 Bright Data와 같은 외부 API 및 서비스에 AI 에이전트가 연결될 수 있도록 함으로써 이 문제를 해결합니다.
Bright Data는 다음과 같은 AI를 위한 풍부한 도구 인프라를 제공합니다:
- SERP API: 실시간 지역별 검색 엔진 결과를 수집하여 모든 쿼리에 대한 관련 소스를 발견합니다.
- 웹 언락커 API: 공개 URL에서 콘텐츠를 안정적으로 가져오며, 차단, CAPTCHA, 봇 방지 시스템을 자동으로 처리합니다.
- 크롤 API: 전체 웹사이트를 크롤링 및 추출하여 LLM에 적합한 형식으로 데이터를 반환하여 더 나은 추론과 추론을 가능하게 합니다.
- 브라우저 API: 원격 스텔스 브라우저를 사용하여 AI가 동적 웹사이트와 상호작용하고 대규모로 에이전트 워크플로를 자동화할 수 있게 합니다.
이를 통해 다양한 사용 사례를 포괄하는 AI 워크플로, 파이프라인 및 에이전트를 구축할 수 있습니다.
LiveKit과 Bright Data를 사용하여 브랜드 뉴스 팟캐스트를 제작하는 에이전트 구축하기
이제 다음과 같은 접근 가능한 AI 에이전트를 구축하는 것을 상상해보세요.
- 브랜드 또는 브랜드 관련 주제를 입력으로 받습니다.
- SERP API를 사용하여 뉴스를 검색합니다.
- 가장 관련성 높은 결과를 선별합니다.
- 웹 언락커 API를 사용하여 콘텐츠를 스크래핑합니다.
- 해당 콘텐츠를 처리하고 요약합니다.
- 귀사에 대한 뉴스의 최신 소식을 매일 들을 수 있는 오디오 팟캐스트를 생성합니다.
이러한 워크플로는 다음과 같은 LiveKit + Bright Data 통합으로 구현 가능합니다:
이 AI 음성 에이전트를 구현해 보세요!
LiveKit에서 Bright Data 통합을 활용한 음성 AI 에이전트 구축 방법
이 가이드 섹션에서는 Bright Data를 LiveKit과 통합하고 SERP API 및 Web Unlocker 도구를 사용하여 브랜드 뉴스 팟캐스트 생성을 위한 AI 음성 에이전트를 구축하는 방법을 배울 수 있습니다.
필수 조건
이 튜토리얼을 따라하려면 다음이 필요합니다:
- SERP API, Web Unlocker 및 API 키가 설정된 Bright Data 계정.
- LiveKit 계정.
- LiveKit 에이전트 빌더와 음성 에이전트의 작동 방식에 대한 이해.
Bright Data 계정 설정은 별도의 단계에서 안내해 드리므로 지금 당장 걱정하지 마세요.
1단계: LiveKit 에이전트 빌더 시작하기
아직 LiveKit 계정이 없다면 계정을 생성하거나 로그인하세요. LiveKit에 처음 접속하는 경우 “첫 프로젝트 생성” 양식으로 이동합니다:
프로젝트에 “브랜드 뉴스 팟캐스트 프로듀서”와 같은 이름을 지정하세요. 그런 다음 나머지 필수 정보를 입력하고 “계속” 버튼을 눌러 LiveKit Cloud 프로젝트를 생성하세요.
이제 “Branded News Podcast Producer” 프로젝트 페이지로 이동합니다. 여기서 “AI 에이전트” 버튼을 클릭하세요:
“브라우저에서 시작”을 선택하여 에이전트 빌더 페이지에 접속하세요:
이제 “브랜드 뉴스 팟캐스트 프로듀서” 프로젝트의 웹 기반 에이전트 빌더 인터페이스에 접근하게 됩니다:
UI와 옵션에 익숙해지도록 시간을 갖고, 추가 안내를 위해 문서를 확인하세요.
훌륭합니다! 이제 AI 에이전트 구축을 위한 LiveKit 환경이 준비되었습니다.
2단계: AI 음성 에이전트 맞춤 설정
LiveKit에서 AI 음성 에이전트는 세 가지 주요 구성 요소로 이루어집니다:
- TTS(Text-to-Speech) 모델: 에이전트의 응답을 음성으로 변환합니다. 톤, 억양 및 기타 특성을 지정하는 음성 프로필로 구성할 수 있습니다. TTS 모델은 LLM의 텍스트 출력을 사용자가 들을 수 있는 음성으로 변환합니다.
- STT(음성-텍스트 변환) 모델: ASR(“자동 음성 인식”)이라고도 하며, 음성 오디오를 실시간으로 텍스트로 변환합니다. 음성 AI 파이프라인에서 이 단계가 첫 번째입니다: 사용자의 음성이 STT 모델에 의해 텍스트로 변환된 후 LLM에서 처리되어 응답이 생성됩니다. 최종적으로 TTS 모델을 통해 응답이 다시 음성으로 변환됩니다.
- LLM 모델(대규모 언어 모델): 음성 에이전트의 추론, 응답 및 전반적인 조율을 담당합니다. 성능, 정확도, 비용 간 균형을 맞추기 위해 다양한 모델 중에서 선택할 수 있습니다. LLM은 STT 모델로부터 전사본을 받아 텍스트 응답을 생성하며, TTS 모델이 이를 음성으로 변환합니다.
이러한 설정을 변경하려면 “모델 및 음성” 탭으로 이동하여 기업 요구사항에 맞게 AI 에이전트를 맞춤 설정하세요:
이 튜토리얼에서는 프로토타입을 구축하는 단계이므로 기본 설정으로 충분합니다. 이제 시작할 준비가 되었습니다!
3단계: Bright Data 계정 설정
앞서 언급한 바와 같이, 브랜드 뉴스 팟캐스트 제작용 AI 음성 에이전트는 두 가지 Bright Data 서비스를 활용합니다:
- SERP API: Google에서 뉴스 검색을 수행하여 브랜드에 관한 최신 관련 뉴스를 가져옵니다.
- 웹 언락커(Web Unlocker): LLM(대규모 언어 모델)의 수집 및 처리를 위해 AI 최적화 형식으로 뉴스 페이지에 접근합니다.
진행하기 전에 LiveKit 에이전트가 HTTP 호출을 통해 이 도구들에 연결할 수 있도록 Bright Data 계정을 구성해야 합니다.
참고: LiveKit 통합을 위해 Bright Data 계정에서 SERP API 영역을 준비하는 방법을 확인할 수 있습니다. 동일한 프로세스를 Web Unlocker 영역 설정에도 적용할 수 있습니다. 자세한 안내는 다음 Bright Data 문서 페이지를 참조하세요:
계정이 없는 경우 새로 생성하십시오. 기존 계정이 있다면 로그인하십시오. 로그인 후 “프록시 및 스크래핑” 페이지로 이동하십시오. “내 영역” 섹션에서 “SERP API”라고 표시된 행을 찾으십시오:
“SERP API” 행이 보이지 않는다면, 아직 영역이 설정되지 않았다는 의미입니다. 아래로 스크롤하여 “SERP API” 섹션으로 이동한 후 “영역 생성”을 클릭하여 정의하세요:
SERP API 존을 생성하고 serp_api (또는 원하는 이름)과 같은 이름을 지정하세요. LiveKit에서 서비스에 연결할 때 필요하므로 존 이름을 기록해 두세요.
SERP API 제품 페이지에서 “활성화” 토글을 전환하여 존을 활성화하세요:
Google 검색용 API 호출 방법, 사용 가능한 옵션 및 기타 세부 사항을 이해하려면 Bright Data SERP API 문서를 검토하는 것이 좋습니다.
웹 언락커(Web Unlocker)에도 동일한 과정을 반복합니다. 본 튜토리얼에서는 웹 언락커 영역의 이름을 web_unlocker로 가정하겠습니다. Bright Data 문서에서 해당 매개변수를 확인하세요.
마지막으로 공식 튜토리얼을 따라 Bright Data API 키를 생성하세요. LiveKit 음성 에이전트에서 SERP API 및 Web Unlocker로 전송되는 HTTP 요청 인증에 필요하므로 안전하게 보관하십시오.
완벽합니다! Bright Data 계정이 완전히 설정되어 LiveKit으로 구축한 AI 음성 에이전트에 통합할 준비가 되었습니다.
단계 #4: Bright Data API 키용 시크릿 추가
방금 설정하신 Bright Data 서비스는 API 키를 통해 인증되며, 해당 엔드포인트로 HTTP 요청을 보낼 때 Authorization 헤더에 포함되어야 합니다. API 키를 도구 정의에 하드코딩하는 것은 권장되지 않으므로, LiveKit에 시크릿으로 저장하세요.
이를 위해 LiveKit 에이전트 빌더 페이지로 돌아가 “고급” 탭으로 이동하세요. 거기서 “비밀 추가” 버튼을 클릭하세요:
비밀을 다음과 같이 지정하세요:
- 키:
BRIGHT_DATA_API_KEY - 값: 앞서 확인한 Bright Data API 키 값

완료 후 오른쪽 상단의 “변경 사항 저장”을 클릭하여 AI 음성 에이전트 정의를 업데이트하세요. HTTP 도구 정의에서 다음 구문을 사용하여 시크릿에 접근할 수 있습니다:
{{secrets.BRIGHT_DATA_API_KEY}}
좋아요! 이제 Bright Data 서비스를 LiveKit AI 음성 에이전트와 통합하기 위한 모든 구성 요소가 준비되었습니다.
5단계: LiveKit에서 Bright Data SERP API 및 Web Unlocker 도구 정의하기
AI 음성 에이전트가 Bright Data 제품과 통합되도록 하려면 두 가지 HTTP 도구를 정의해야 합니다. 이 도구들은 LLM이 웹 검색과 웹 스크래핑을 위해 각각 SERP API와 웹 언락커 API를 호출하는 방법을 지시합니다.
구체적으로 정의할 두 도구는 다음과 같습니다:
search_engine: SERP API에 연결하여 JSON 형식으로 파싱된 Google 검색 결과를 가져옵니다.scrape_as_markdown: 웹 언락커 API에 연결하여 웹 페이지를 스크래핑하고 마크다운 형식으로 콘텐츠를 반환합니다.
프로 팁: JSON과 마크다운은 AI 에이전트에 입력하기에 이상적인 데이터 형식으로, 원시 HTML(SERP API와 웹 언락커의 기본 형식)보다 훨씬 우수한 성능을 발휘합니다.
먼저 search_engine 도구를 정의하는 방법을 보여드리겠습니다. 이후 동일한 단계를 반복하여 scrape_as_markdown 도구를 정의할 수 있습니다.
새 HTTP 도구를 추가하려면 “작업” 탭으로 이동하여 “HTTP 도구 추가” 버튼을 클릭하세요:
다음과 같이 “HTTP 도구 추가” 양식을 작성하세요:
- 도구 이름:
search_engine - 설명:
Bright Data의 SERP API를 사용하여 JSON 형식으로 Google 검색 결과를 스크랩합니다. - HTTP 메서드:
POST - URL:
https://api.brightdata.com/request
도구 매개변수를 아래와 같이 정의하세요:
- zone (문자열):
기본값: "serp_api"(참고: 기본값을 사용자의 SERP API 영역 이름으로 대체하십시오) - url (문자열):
Google SERP URL (형식: https://www.google.com/search?q=<검색어>") - format (문자열):
기본값: "raw" - data_format (문자열):
기본값: "parsed"(스크랩된 SERP 페이지를 JSON 형식으로 가져오기 위해)
이들은 Google SERP 스크래핑을 위해 Bright Data 제품을 호출하는 데 사용되는 SERP API 본체 매개변수에 해당합니다. 이 본체는 SERP API가 Google로부터 JSON 형식의 파싱된 응답을 반환하도록 지시합니다. url 인수는 제공한 설명을 기반으로 LLM이 실시간으로 생성합니다.
마지막으로 “헤더” 섹션에서 다음 헤더를 추가하여 HTTP 도구를 인증하십시오:
- Authorization:
Bearer {{secrets.BRIGHT_DATA_API_KEY}}
“Bearer” 뒤의 이 HTTP 헤더 값은 앞서 정의한 Bright Data API 키 시크릿을 사용하여 자동으로 채워집니다.
설정이 완료되면 양식 하단의 “Add tool” 버튼을 클릭하세요.
그런 다음 동일한 절차를 반복하여 다음 정보를 사용하여 scrape_as_markdown 도구를 정의하세요:
- 도구 이름:
scrape_as_markdown - 설명:
고급 추출 기능으로 단일 웹페이지를 스크랩하고 마크다운 형식으로 반환합니다. Bright Data의 Web Unlocker를 사용하여 봇 보호 및 CAPTCHA 처리 - HTTP 메서드:
POST - URL:
https://api.brightdata.com/request - 매개변수:
- zone (문자열):
기본값: "web_unlocker"(참고: 기본값을 사용 중인 Web Unlocker 영역 이름으로 대체하세요) - format (문자열):
기본값: "raw" - data_format (문자열):
기본값: "markdown"(스크랩된 페이지를 마크다운 형식으로 받기 위해) - url (문자열):
스크랩할 페이지의 URL
- zone (문자열):
- 헤더:
- Authorization:
Bearer {{secrets.BRIGHT_DATA_API_KEY}}
- Authorization:
이제 “변경 사항 저장”을 다시 클릭하여 AI 에이전트 정의를 업데이트하세요. “작업” 탭에서 두 도구가 모두 표시되어야 합니다:
SERP API 및 Web Unlocker 통합을 위한 search_engine 및 scrape_as_markdown 도구가 성공적으로 추가된 것을 확인하세요.
훌륭합니다! 이제 LiveKit AI 음성 에이전트가 Bright Data와 상호작용할 수 있습니다.
6단계: AI 음성 에이전트 지침 구성
음성 에이전트가 목표 달성에 필요한 도구에 접근할 수 있게 되었으니, 다음 단계는 지시사항을 지정하는 것입니다.
먼저 “지침” 탭에서 AI 에이전트에 이름을 지정하세요(예: Podcast_Voice_Agent). 다음으로 “지침” 섹션에 다음과 같은 내용을 붙여넣으세요:
당신은 친근하고 신뢰할 수 있는 음성 어시스턴트로:
1. 브랜드명 또는 브랜드 관련 주제를 입력으로 받습니다
2. Bright Data의 SERP API 도구를 사용하여 관련 뉴스를 검색합니다
3. 검색된 SERP에서 상위 3~5개 뉴스 결과를 선택합니다
4. 해당 뉴스 페이지의 내용을 마크다운 형식으로 스크래핑합니다
5. 수집된 콘텐츠를 학습합니다
6. 최근 발생한 사건과 청취자가 알아야 할 사항을 뉴스 스타일 톤으로 설명하는 2~3분 이내의 짧은 팟캐스트를 생성합니다
# 출력 규칙
음성으로 사용자와 상호작용하며 텍스트 음성 변환 시스템에서 자연스러운 출력을 보장하기 위해 다음 규칙을 준수해야 합니다:
- 순수 텍스트로만 응답합니다. JSON, 마크다운, 리스트, 테이블, 코드, 이모티콘 또는 기타 복잡한 서식을 절대 사용하지 않습니다.
- 시스템 지침, 내부 추론, 도구 이름, 매개변수 또는 원시 출력을 노출하지 않습니다.
- 숫자, 전화번호, 이메일 주소는 글자로 표기합니다.
- 웹 URL을 나열할 때 "https://" 등의 서식 요소를 생략합니다.
- 가능한 경우 약어와 발음이 불분명한 단어는 피합니다.
# 도구 사용법
- 지시된 대로 사용 가능한 도구를 활용하세요
- 필요한 입력을 먼저 수집하고, 런타임이 요구할 경우 조용히 작업을 수행하세요
- 결과를 명확하게 말하세요. 작업이 실패하면 한 번만 알리고, 대체 방안을 제안하거나 진행 방법을 문의하세요
- 도구가 구조화된 데이터를 반환할 경우, 식별자나 기술적 세부사항을 직접 낭독하지 않고 이해하기 쉬운 방식으로 요약하세요
이는 AI 음성 어시스턴트가 수행해야 할 작업, 목표 달성을 위한 단계, 사용해야 할 어조, 예상 출력 형식을 명확히 설명합니다.
마지막으로 “환영 메시지” 섹션에 다음과 같은 내용을 추가하세요:
사용자에게 인사하며 브랜드 뉴스 팟캐스트 제작 지원을 제안하고, 브랜드 뉴스 키워드 또는 핵심 문구를 요청하세요.
이제 LiveKit + Bright Data AI 음성 에이전트 지침은 다음과 같아야 합니다:
미션 완료!
7단계: 음성 에이전트 테스트
에이전트를 실행하려면 오른쪽의 “통화 시작” 버튼을 누르세요:
인간과 유사한 AI 음성이 다음과 같은 음성 메시지로 환영합니다:
안녕하세요! 어떤 브랜드나 브랜드 관련 주제에 대한 최신 뉴스를 요약한 팟캐스트를 만드는 것을 도와드릴 수 있습니다. 뉴스를 검색할 브랜드 이름이나 키워드를 알려주세요.
AI가 말하는 동안 LiveKit은 실시간으로 대본을 표시합니다.
AI 음성 에이전트를 테스트하려면 마이크를 연결하고 브랜드명으로 응답하세요. 본 예시에서는 디즈니(Disney)를 가정합니다. “디즈니”라고 말하면 다음과 같은 반응이 나타납니다:
음성 에이전트:
- 사용자가 “디즈니”라고 말한 것을 인식하고 브랜드 뉴스 조사에 대한 입력값으로 사용합니다.
search_engine도구를 사용하여 최신 뉴스를 검색합니다.- 4개의 뉴스 기사를 선별하고
scrape_as_markdown도구를 통해 병렬로 스크래핑합니다. - 뉴스 콘텐츠를 처리하여 최근 사건을 요약한 간결한 약 3분 분량의 음성 팟캐스트를 생성합니다.
- 생성된 스크립트를 실시간으로 음성으로 읽어줍니다.
search_engine 도구를 확인하면 AI 에이전트가 자동으로 “디즈니 뉴스” 검색어를 사용했음을 알 수 있습니다:
해당 HTTP 호출 결과는 “디즈니 뉴스”에 대한 Google 검색 결과 페이지(SERP)의 JSON 파싱 버전입니다:
다음으로 AI 에이전트는 가장 관련성 높은 기사 4개를 선별하여 scrape_as_markdown 도구를 사용해 스크래핑합니다:
예를 들어, 한 결과를 열면 도구가 뉴욕 타임스 기사 (구글 SERP 최상위 결과)에 성공적으로 접근하여 마크다운 형식으로 반환한 것을 확인할 수 있습니다:
위 뉴스 기사는 (본문 작성 시점 기준) 새로 공개된 “주토피아 2” 영화에 초점을 맞춥니다. 이는 AI 음성 에이전트가 생성한 브랜드 뉴스 팟캐스트에서 정확히 강조하는 내용입니다(다른 뉴스의 정보도 함께 포함됨)!
뉴스 기사 스크래핑이나 구글 검색 결과 프로그래밍 방식 검색을 시도해 본 적이 있다면, 이 두 작업이 얼마나 복잡한지 잘 알 것입니다. IP 차단, CAPTCHA, 브라우저 지문 인식 등 스크래핑 관련 문제들 때문입니다.
LiveKit의 Bright Data SERP API 및 Web Unlocker 통합 기능은 이러한 모든 문제를 해결해 줍니다. 게다가 스크래핑된 데이터를 AI 입력에 최적화된 형식으로 반환합니다. LiveKit의 접근성 기능 덕분에 에이전트는 팟캐스트용 오디오를 생성할 수 있습니다.
자, 이제 Bright Data를 LiveKit에 통합하여 팟캐스트 제작을 통한 기업 브랜드 모니터링을 위한 접근성 지원 AI 음성 에이전트를 완성했습니다.
다음 단계: 에이전트 코드 접근, 커스터마이징 및 배포 준비
LiveKit의 에이전트 빌더는 프로토타이핑 및 개념 증명(PoC) AI 에이전트 구축에 탁월합니다. 그러나 기업용 AI 에이전트의 경우 특정 요구사항에 맞춰 코드를 수정하기 위해 기본 코드에 접근해야 할 수 있습니다.
이와 관련해 에이전트 빌더는 LiveKit 에이전트 SDK를 기반으로 모범 사례 파이썬 코드를 생성한다는 점을 알아두세요. 코드에 접근하려면 오른쪽의 “코드” 탭을 클릭하기만 하면 됩니다:
이 경우 생성된 코드는 다음과 같습니다:
import logging
import os
from typing import Optional, Any
from urllib.parse import quote
import aiohttp
import asyncio
import json
import handlebars
from dotenv import load_dotenv
from livekit.agents import (
Agent,
AgentSession,
AgentServer,
JobContext,
JobProcess,
RunContext,
ToolError,
cli,
function_tool,
inference,
utils,
room_io,
)
from livekit import rtc
from livekit.plugins import noise_cancellation, silero
from livekit.plugins.turn_detector.multilingual import MultilingualModel
logger = logging.getLogger("agent-Podcast_Voice_Agent")
load_dotenv(".env.local")
class VariableTemplater:
def __init__(self, metadata: str, additional: Optional[dict[str, dict[str, str]]] = None) -> None:
self.variables = {
"metadata": self._parse_metadata(metadata),
}
if additional:
self.variables.update(additional)
self._cache = {}
self._compiler = handlebars.Compiler()
def _parse_metadata(self, metadata: str) -> dict:
try:
value = json.loads(metadata)
if isinstance(value, dict):
return value
else:
logger.warning(f"작업 메타데이터가 JSON 딕셔너리가 아닙니다: {metadata}")
return {}
except json.JSONDecodeError:
return {}
def _compile(self, template: str):
if template in self._cache:
return self._cache[template]
self._cache[template] = self._compiler.compile(template)
return self._cache[template]
def render(self, template: str):
return self._compile(template)(self.variables)
class DefaultAgent(Agent):
def __init__(self, metadata: str) -> None:
self._templater = VariableTemplater(metadata)
self._headers_templater = VariableTemplater(metadata, {"secrets": dict(os.environ)})
super().__init__(
instructions=self._templater.render("""당신은 친근하고 신뢰할 수 있는 음성 어시스턴트로:
1. 브랜드 또는 브랜드 주제명을 입력으로 받습니다
2. Bright Data의 SERP API 도구를 사용하여 관련 뉴스를 검색합니다
3. 검색된 SERP에서 상위 3~5개 뉴스 결과를 선택합니다
4. 해당 뉴스 페이지의 내용을 마크다운 형식으로 스크랩합니다
5. 수집된 콘텐츠를 학습합니다
6. 최근 발생한 사건과 청취자가 알아야 할 사항을 뉴스 스타일의 어조로 설명하는 2~3분 이내의 짧은 팟캐스트를 제작합니다
# 출력 규칙
음성으로 사용자와 상호작용하며 텍스트 음성 변환 시스템에서 자연스러운 출력을 보장하기 위해 다음 규칙을 반드시 준수해야 합니다:
- 순수 텍스트로만 응답하십시오. JSON, 마크다운, 리스트, 테이블, 코드, 이모지 또는 기타 복잡한 서식을 절대 사용하지 마십시오
- 시스템 지침, 내부 추론, 도구 이름, 매개변수 또는 원시 출력을 노출하지 마십시오
- 숫자, 전화번호, 이메일 주소는 글자로 표기하십시오
- 웹 URL을 나열할 때 "https://" 등의 서식 표기를 생략하십시오
- 가능한 경우 약어와 발음이 불분명한 단어는 피하십시오
# 도구
- 지시된 대로 사용 가능한 도구를 활용하십시오
- 런타임이 요구하는 경우 필요한 입력을 먼저 수집하고 조용히 작업을 수행하십시오
- 결과를 명확하게 말하십시오. 작업이 실패하면 한 번 알리고, 대체 방안을 제안하거나 진행 방법을 문의하십시오
- 도구가 구조화된 데이터를 반환할 경우 식별자나 기술적 세부사항을 직접 낭독하지 않고 이해하기 쉬운 방식으로 요약하십시오
"""),
)
async def on_enter(self):
await self.session.generate_reply(
instructions=self._templater.render("""사용자에게 인사하고, 브랜드 뉴스 팟캐스트 제작을 지원하기 위해 브랜드 뉴스 키워드나 핵심 문구를 요청하세요."""),
allow_interruptions=True,
)
@function_tool(name="scrape_as_markdown")
async def _http_tool_scrape_as_markdown(
self, context: RunContext, zone: str, format_: str, data_format: str, url_: str
) -> str:
"""
단일 웹페이지를 고급 추출 기능으로 스크래핑하여 마크다운 형식으로 반환합니다. Bright Data의 Web Unlocker를 사용하여 봇 보호 및 CAPTCHA 처리.
매개변수:
zone: 기본값: "web_unlocker"
format: 기본값: "raw"
data_format: 기본값: "markdown"
url: 스크랩할 페이지의 URL
"""
context.disallow_interruptions()
url = "https://api.brightdata.com/request"
headers = {
"Authorization": self._headers_templater.render("Bearer {{secrets.BRIGHT_DATA_API_KEY}}"),
}
payload = {
"zone": zone,
"format": format_,
"data_format": data_format,
"url": url_,
}
try:
session = utils.http_context.http_session()
timeout = aiohttp.ClientTimeout(total=10)
async with session.post(url, timeout=timeout, headers=headers, json=payload) as resp:
body = await resp.text()
if resp.status >= 400:
raise ToolError(f"error: HTTP {resp.status}: {body}")
return body
except ToolError:
raise
except (aiohttp.ClientError, asyncio.TimeoutError) as e:
raise ToolError(f"error: {e!s}") from e
@function_tool(name="search_engine")
async def _http_tool_search_engine(
self, context: RunContext, zone: str, url_: str, format_: str, data_format: str
) -> str:
"""
Bright Data의 SERP API를 사용하여 JSON 형식의 Google 검색 결과를 스크래핑합니다.
인수:
zone: 기본값: "serp_api"
url: Google SERP의 URL (형식: https://www.google.com/search?q= <검색어>)
format: 기본값: "raw"
data_format: 기본값: "parsed"
"""
context.disallow_interruptions()
url = "https://api.brightdata.com/request"
headers = {
"Authorization": self._headers_templater.render("Bearer {{secrets.BRIGHT_DATA_API_KEY}}"),
}
payload = {
"zone": zone,
"url": url_,
"format": format_,
"data_format": data_format,
}
try:
session = utils.http_context.http_session()
timeout = aiohttp.ClientTimeout(total=10)
async with session.post(url, timeout=timeout, headers=headers, json=payload) as resp:
body = await resp.text()
if resp.status >= 400:
raise ToolError(f"error: HTTP {resp.status}: {body}")
return body
except ToolError:
raise
except (aiohttp.ClientError, asyncio.TimeoutError) as e:
raise ToolError(f"error: {e!s}") from e
server = AgentServer()
def prewarm(proc: JobProcess):
proc.userdata["vad"] = silero.VAD.load()
server.setup_fnc = prewarm
@server.rtc_session(agent_name="Podcast_Voice_Agent")
async def entrypoint(ctx: JobContext):
session = AgentSession(
stt=inference.STT(model="assemblyai/universal-streaming", language="en"),
llm=inference.LLM(model="openai/gpt-4.1-mini"),
tts=inference.TTS(
model="cartesia/sonic-3",
voice="9626c31c-bec5-4cca-baa8-f8ba9e84c8bc",
language="en-US"
),
turn_detection=MultilingualModel(),
vad=ctx.proc.userdata["vad"],
preemptive_generation=True,
)
await session.start(
agent=DefaultAgent(metadata=ctx.job.metadata),
room=ctx.room,
room_options=room_io.RoomOptions(
audio_input=room_io.AudioInputOptions(
noise_cancellation=lambda params: noise_cancellation.BVCTelephony() if params.participant.kind == rtc.ParticipantKind.PARTICIPANT_KIND_SIP else noise_cancellation.BVC(),
),
),
)
if __name__ == "__main__":
cli.run_app(server)
에이전트를 로컬에서 실행하려면 공식 LiveKit Python SDK 저장소를 참조하세요.
다음 단계는 에이전트 코드를 맞춤 설정하고 배포한 후, AI 에이전트가 생성한 오디오를 녹음하여 마케팅 팀이나 브랜드 관계자에게 이메일 또는 기타 형식으로 공유할 수 있도록 워크플로를 완성하는 것입니다!
결론
이 글에서는 Bright Data의 AI 통합 기능을 활용하여 LiveKit에서 정교한 AI 음성 워크플로를 구축하는 방법을 알아보았습니다.
여기에서 소개한 AI 에이전트는 브랜드 모니터링을 자동화하면서 기존 텍스트 보고서보다 접근성이 높고 더 매력적인 결과를 생성하고자 하는 기업에 이상적입니다.
비슷한 고급 AI 에이전트를 생성하려면 Bright Data의 AI 솔루션을 모두 살펴보세요. LLM으로 실시간 웹 데이터를 검색, 검증 및 변환하세요!
지금 바로 무료 Bright Data 계정을 생성하고 AI 지원 웹 데이터 도구로 실험을 시작하세요!