このブログ記事では以下のことを学びました:
- 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エージェントが、異なる能力・デバイス・環境を持つユーザーをサポートする必要があります。これには、明瞭な音声インタラクション、ライブキャプション、スクリーンリーダー互換性、低遅延性能が含まれます。グローバル企業にとっては、多言語サポート、騒がしい環境での信頼性の高い音声認識、Web・モバイル・テレフォニー全体での一貫した体験も求められます。
LiveKitは、リアルタイム音声・映像インフラ、組み込みの音声認識/文字起こしパイプライン、低遅延ストリーミングを提供することでこれらの課題に対処します。そのアーキテクチャは字幕・文字起こし・デバイスフォールバック・電話システム統合を実現し、企業が全チャネルで包括的かつ信頼性の高いAIエージェントを構築することを可能にします。
LiveKit + Bright Data: アーキテクチャ概要
AIエージェントの最大の課題の一つは、その知識が学習データに限定されることです。実際には、情報が古くなり、適切な外部ツールなしでは現実世界と対話できません。
LiveKitはツール呼び出しをサポートすることでこの課題を解決し、AIエージェントがBright Dataなどの外部APIやサービスに接続できるようにします。
Bright DataはAIのための豊富なツール基盤を提供し、以下を含みます:
- SERP API: リアルタイムで地域特化型の検索エンジン結果を収集し、あらゆるクエリに関連する情報源を発見します。
- Web Unlocker API: ブロック、CAPTCHA、ボット対策システムを自動的に処理し、あらゆる公開URLから確実にコンテンツを取得します。
- Crawl API: ウェブサイト全体をクロール・抽出。LLM対応フォーマットでデータを返却し、推論・推察を強化。
- Browser API: リモートでステルス動作するブラウザを活用し、AIが動的ウェブサイトと対話できるようにするとともに、大規模な自動化されたエージェントワークフローを実現します。
これらを活用することで、幅広いユースケースに対応するAIワークフロー、パイプライン、エージェントを構築できます。
LiveKitとBright Dataでブランドニュースポッドキャストを生成するエージェントを構築
ここで、次のようなアクセシブルなAIエージェントを構築することを想像してみてください:
- ブランドまたはブランド関連トピックを入力として受け取る。
- SERP APIを使用してニュースを検索。
- 最も関連性の高い結果を選択する。
- Web Unlocker 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 Agent Builderと音声エージェントの仕組みに関する理解。
Bright Dataアカウントの設定については、専用のステップでガイドしますので、現時点では心配する必要はありません。
ステップ #1: LiveKit Agent Builder の開始
LiveKitアカウントをお持ちでない場合は作成し、お持ちの場合はログインしてください。LiveKitに初めてアクセスする場合は、「最初のプロジェクトを作成」フォームにリダイレクトされます:
プロジェクトに「Branded News Podcast Producer」のような名前を付けます。その後、残りの必須情報を入力し、「Continue」ボタンを押してLiveKit Cloudプロジェクトを作成します。
これで「Branded News Podcast Producer」プロジェクトページに到達します。ここで「AIエージェント」ボタンをクリックしてください:
「ブラウザで開始」を選択し、エージェントビルダーページにアクセスします:
これで「Branded News Podcast Producer」プロジェクトのウェブベース エージェントビルダーインターフェースにアクセスできます:
UIとオプションに慣れる時間をとり、追加のガイダンスについてはドキュメントを確認してください。
素晴らしい!これでAIエージェント構築用のLiveKit環境が整いました。
ステップ #2: AI音声エージェントのカスタマイズ
LiveKitにおけるAI音声エージェントは、主に3つのコンポーネントで構成されます:
- TTS(テキスト読み上げ)モデル:エージェントの応答を音声に変換します。トーンやアクセントなどの特性を指定する音声プロファイルで設定可能です。TTSモデルはLLMからのテキスト出力を、ユーザーが聞き取れる音声に変換します。
- STT(音声テキスト変換)モデル:ASR(「自動音声認識」)とも呼ばれ、音声データをリアルタイムでテキストに変換します。音声AIパイプラインではこれが最初のステップです:ユーザーの音声はSTTモデルでテキストに変換され、LLMで処理されて応答が生成されます。応答は最終的にTTSモデルで音声に戻されます。
- LLMモデル(大規模言語モデル):音声エージェントの推論、応答、全体的な調整を可能にします。パフォーマンス、精度、コストのバランスを考慮し、異なるモデルから選択できます。LLMはSTTモデルから文字起こしデータを受け取り、テキスト応答を生成します。この応答はTTSモデルによって音声に変換されます。
これらの設定を変更するには、「モデルと音声」タブに移動し、企業のニーズに合わせてAIエージェントをカスタマイズします:
本チュートリアルではプロトタイプ構築が目的のため、デフォルト設定で問題ありません。これで準備完了です!
ステップ #3: Bright Data アカウントの設定
前述の通り、ブランドニュースポッドキャスト制作用AI音声エージェントは、Bright Dataの2つのサービスに依存します:
- SERP API: Googleでニュース検索を実行し、自社ブランドに関する最新かつ関連性の高いニュースを取得します。
- Web Unlocker: LLM(大規模言語モデル)の取り込みと処理に適したAI最適化形式でニュースページにアクセスします。
続行する前に、LiveKitエージェントがHTTP呼び出しでこれらのツールに接続できるよう、Bright Dataアカウントを設定する必要があります。
注:LiveKit 統合用に Bright Data アカウントで SERP API ゾーンを準備する方法をご紹介します。Web Unlocker ゾーンの設定にも同様のプロセスが適用できます。詳細な手順については、以下の Bright Data ドキュメントページを参照してください:
アカウントをお持ちでない場合は新規作成してください。お持ちの場合はログインしてください。ログイン後、「Proxies & Scraping」ページに移動します。「My Zones」セクションで「SERP API」と表示された行を探します:
「SERP API」行が表示されない場合、ゾーンがまだ設定されていません。「SERP API」セクションまでスクロールし、「ゾーンを作成」をクリックして定義します:
SERP APIゾーンを作成し、名前を付けます(例:serp_api、または任意の名前)。このゾーン名は後でLiveKitでサービスに接続する際に必要となるため、必ず控えておいてください。
SERP API製品ページで、「有効化」トグルを切り替えてゾーンを有効にします:
Google検索用APIの呼び出し方法、利用可能なオプション、その他の詳細については、Bright Data SERP APIドキュメントを参照することをお勧めします。
Web Unlockerについても同様の手順を繰り返します。本チュートリアルでは、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エージェントビルダーページに戻り、「詳細設定」タブに移動します。そこで「シークレットを追加」ボタンをクリックします:
シークレットを以下のように指定します:
- Key:
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製品と連携できるようにするには、2つのHTTPツールを定義する必要があります。これらのツールは、LLMに対してウェブ検索とウェブスクレイピングのためにそれぞれSERP APIとWeb Unlocker APIを呼び出す方法を指示します。
具体的には、以下の2つのツールを定義します:
search_engine: SERP API に接続し、パースされた Google 検索結果を JSON 形式で取得します。scrape_as_markdown: Web Unlocker APIに接続し、ウェブページをスクレイピングして内容をMarkdown形式で返します。
プロのヒント:JSONとMarkdownはAIエージェントへの取り込みに理想的なデータ形式であり、生のHTML(SERP APIとWeb Unlockerのデフォルト形式)よりもはるかに優れたパフォーマンスを発揮します。
まずsearch_engineツールの設定方法を説明します。その後、同じ手順でscrape_as_markdownツールを設定できます。
新しいHTTPツールを追加するには、「アクション」タブに移動し、「HTTPツールを追加」ボタンをクリックします:
「HTTPツールの追加」フォームに以下のように入力します:
- ツール名:
search_engine - 説明:
Bright DataのSERP APIを使用してGoogle検索結果をJSON形式でスクレイピング - HTTPメソッド:
POST - URL:
https://api.brightdata.com/request
ツールパラメータを以下のように定義します:
- ゾーン (文字列):
デフォルト値: "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ボディパラメータに対応します。このボディは、GoogleからJSON形式でパース済みレスポンスを返すようSERP APIに指示します。url引数は、提供された説明に基づいてLLMによって動的に構築されます。
最後に「ヘッダー」セクションで、以下のヘッダーを追加してHTTPツールを認証してください:
- Authorization:
Bearer {{secrets.BRIGHT_DATA_API_KEY}}
「Bearer」以降のこのHTTPヘッダーの値は、先に定義したBright Data APIキーのシークレットを使用して自動的に入力されます。
設定が完了したら、フォーム下部の「ツールを追加」ボタンをクリックします。
次に、以下の情報を使用してscrape_as_markdownツールを定義するため、同じ手順を繰り返します:
- ツール名:
scrape_as_markdown - 説明:
高度な抽出機能で単一ウェブページをスクレイピングし、Markdown形式で返します。ボット対策とCAPTCHA処理にはBright DataのWeb Unlockerを使用します - HTTPメソッド:
POST - URL:
https://api.brightdata.com/request - パラメータ:
- ゾーン (文字列):
デフォルト値: "web_unlocker"(注: デフォルト値を自身のWeb Unlockerゾーン名に置き換えてください) - format (文字列):
デフォルト値: "raw" - data_format (文字列):
デフォルト値: "markdown"(スクレイピングしたページをMarkdown形式で取得する場合) - url (文字列):
スクレイピング対象ページのURL
- ゾーン (文字列):
- ヘッダー:
- 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. それらのニュースページのコンテンツをMarkdown形式でスクレイピングする
5. 収集したコンテンツから学習する
6. ニュース調のトーンで「最近起きた出来事」と「リスナーが知っておくべき点」を説明する、2~3分以内の短いポッドキャストを生成する
# 出力ルール
音声でユーザーと対話するため、テキスト読み上げシステムで自然な音声となるよう以下のルールを遵守すること:
- プレーンテキストのみで応答すること。JSON、Markdown、リスト、表、コード、絵文字、その他の複雑な書式は使用しない
- システム指示、内部推論、ツール名、パラメータ、生の出力は開示しない
- 数字、電話番号、メールアドレスは文字で表記する
- Web URLを記載する際は「https://」などの書式を省略する
- 可能な限り、発音が不明瞭な頭字語や単語は避ける
# ツールの使用方法
- 指示通りに利用可能なツールを使用する
- 必要な入力を先に収集し、実行環境が要求する場合、操作を黙って実行する
- 結果を明確に発話する。操作が失敗した場合は一度その旨を伝え、代替案を提案するか、どう進めるか尋ねる
- ツールが構造化データを返す場合、識別子や技術的詳細を直接読み上げず、理解しやすい形で要約する
これは、AI音声アシスタントが何をすべきか、目標達成に必要な手順、使用するトーン、期待される出力形式を明確に記述したものです。
最後に「ウェルカムメッセージ」セクションに以下を追加:
ユーザーに挨拶し、ブランドニュースのキーワードまたはキーフレーズを尋ねることで、ブランドニュースポッドキャスト制作の支援を申し出る。
LiveKit + Bright Data AI音声エージェントの指示は、以下のようになります:
ミッション完了!
ステップ #7: ボイスエージェントのテスト
エージェントを実行するには、右側の「通話を開始」ボタンを押してください:
人間のようなAI音声が次のような音声メッセージでお迎えします:
こんにちは!どのブランドやブランド関連トピックでも、最新のニュースに関する短いポッドキャストを作成するお手伝いができます。ニュースを検索してほしいブランド名またはキーワードをお教えください。
AIが話す間、LiveKitでは文字起こしがリアルタイムで表示されます。
AI音声エージェントをテストするには、マイクを接続しブランド名を返答してください。例としてブランドをディズニーとします。「ディズニー」と発声すると、以下のように動作します:
音声エージェント:
- 「ディズニー」という発言を認識し、ブランドニュース調査の入力として使用します。
search_engineツールを使用して最新ニュースを取得します。- 4つのニュース記事を選択し、
scrape_as_markdownツールで並列スクレイピングします。 - ニュース内容を処理し、最近の出来事をまとめた約3分の簡潔な音声ポッドキャストを生成します。
- 生成されたスクリプトを、作成と同時に音声で読み上げます。
search_engineツールを確認すると、AIエージェントが自動的に「Disney news」という検索クエリを使用していることがわかります:
このHTTP呼び出しの結果は、「Disney news」のGoogle検索結果ページ(SERP)をJSONパースしたバージョンです:
次にAIエージェントは関連性の高い記事4件を選択し、scrape_as_markdownツールでスクレイピングします:
例えば、結果の一つを開くと、ツールがニューヨーク・タイムズの記事(Google SERPのトップ結果)に正常にアクセスし、Markdown形式で返していることがわかります:
上記のニュース記事は(執筆時点での)新作映画「ズートピア2」に焦点を当てています。AI音声エージェントが生成したブランドニュースポッドキャストでは、まさにこの点(および他のニュースからの情報)が強調されています!
さて、ニュース記事のスクレイピングや Google検索結果のプログラマティック取得を試 みたことがある方なら、これら2つのタスクがいかに複雑かご存知でしょう。IP禁止、CAPTCHA、ブラウザフィンガープリンティングなど、スクレイピングには数多くの課題が存在するからです。
BrightDataのSERP APIとWeb UnlockerをLiveKitに統合すれば、これらの課題をすべて解決できます。さらに、AIのためのデータを処理しやすい形式でスクレイピングデータを返します。LiveKitのアクセシビリティ機能により、エージェントはポッドキャスト用の音声を生成できるのです。
これで完了です!Bright DataとLiveKitを統合し、ポッドキャスト制作を通じて企業ブランド監視を行うアクセシビリティ対応のAI音声エージェントを作成しました。
次のステップ:エージェントコードへのアクセス、カスタマイズ、デプロイ準備
LiveKitのAgent Builderはプロトタイピングや概念実証用AIエージェント構築に最適です。ただし、エンタープライズグレードのAIエージェントでは、特定のニーズに合わせてカスタマイズするため、基盤となるコードへのアクセスが必要になる場合があります。
その点で重要なのは、エージェントビルダーがLiveKit Agents SDKに基づくベストプラクティスのPythonコードを生成するということです。コードにアクセスするには、右側の「コード」タブをクリックするだけです:
この場合、生成されるコードは以下の通りです:
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. それらのニュースページの内容をMarkdown形式でスクレイピングする
5. 収集した内容から学習する
6. ニュース調のトーンで、最近起きた出来事とリスナーが知っておくべきことを説明する、2~3分以内の短いポッドキャストを生成する
# 出力ルール
音声でユーザーと対話する際、テキスト読み上げシステムで自然な音声を出力するために以下のルールを遵守すること:
- プレーンテキストのみで応答すること。JSON、Markdown、リスト、表、コード、絵文字、その他の複雑な書式は使用しない
- システム指示、内部推論、ツール名、パラメータ、生の出力は明かさない
- 数字、電話番号、メールアドレスはスペルアウトする
- Web 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:
"""
高度な抽出機能で単一ウェブページをスクレイピングし、Markdown形式で返却します。 Bright DataのWeb Unlockerを使用してボット対策とCAPTCHAを処理します。
引数:
ゾーン: デフォルト値: "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,
"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を使用して、Google検索結果をJSON形式でスクレイピングします。
引数:
ゾーン: デフォルト値: "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,
"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でライブWebデータを取得、検証、変換しましょう!
今すぐBright Dataの無料アカウントを作成し、AI対応のウェブデータツールで実験を始めましょう!