このコンテンツは自動機械翻訳サービスによる翻訳版であり、皆さまの便宜のために提供しています。原本の英語版と異なる誤り、省略、解釈の微妙な違いが含まれる場合があります。ご不明な点がある場合は、英語版原本をご確認ください。
AIとのやり取りの方法は根本的に変化しています。ChatGPTのようなテキストベースのインターフェースは何が可能かを示してくれましたが、対話するという点では、まだ始まりに過ぎません。人間はテキストだけでなく、話すこともします。私たちは物事を表示し、リアルタイムで中断し、明らかにします。このような自然な対話パターンをアプリケーションにもたらすのが、Voice AIです。
本日、Cloudflareのグローバルネットワーク上で、リアルタイムの音声対応AIアプリケーションの構築をこれまで以上に簡単にする新機能を発表できることを嬉しく思います。これらの新機能は、次世代の対話型AIエクスペリエンスを構築する開発者のための完全なプラットフォームを作成したり、複数のプラットフォーム間で実行されるより高度なAIエージェントのビルディングブロックとして機能することもできます。
弊社では以下をローンチします:
Cloudflare Realtime Agents - エッジで音声AIパイプラインを調整するためのランタイム
WorkersでPCMとして生のWebRTC音声をパイプライン - AIモデルや、すでに構築された複雑なメディアパイプラインにWebRTC音声を直接接続できるようになります
Workers AI WebSocket対応 - PipeCatのsmart-turn-v2などのモデルを使用したリアルタイムAI推論
Workers AIでDeepgram - 世界330都市以上で音声テキスト変換と音声合成
現在、音声AIアプリケーションの構築は難しいです。複雑な音声パイプラインを管理し、中断に対応し、自然な会話に十分な遅延を実現する一方で、音声入力、言語モデル、音声合成
本番環境の音声AIの構築には、複雑な技術の構成が必要です。低遅延の音声認識、文脈を理解し中断に対応できるインテリジェントな言語モデル、自然な音声の音声合成が必要です。そしてこれらすべてを800ミリ秒以内に行う必要があります。これは、会話が停滞するのではなく、自然に感じられる閾値です。遅延に対する予算は許されません。ミリ秒単位でのカウント:マイク入力では40ミリ秒、文字起こしでは300ミリ秒、LLM推論では400ミリ秒、文章音声では150ミリ秒です。インフラストラクチャの選択が不適切であったり、サーバーが遠い場合は、遅延により満足のいくエクスペリエンスがイライラするものです。
そのために、私たちはリアルタイムAIツールを構築しています。リアルタイム音声AIを静的Webサイトと同じくらい簡単にデプロイできるようにしたいのです。また、対話型AIが実験的なデモ技術から、グローバルに拡張可能な本番環境対応システムへと移行する重要な転換点でもあります。すでにリアルタイムAIエコシステムの開発者の方には、Cloudflareが構築した330か所以上のデータセンターを活用することで、遅延を最小化するための最適なビルディングブロックを構築したいと考えています。
Cloudflare Realtime Agentsの紹介
Cloudflare Realtime Agentsは、当社のグローバルネットワーク上で稼働する音声AIパイプラインを、可能な限りユーザーに近いところで調整するためのシンプルなランタイムです。複雑なインフラストラクチャを自社で管理するのではなく、優れた会話体験の構築に集中できます。
ユーザーが音声AIアプリケーションに接続すると、次のようになります:
WebRTC接続 - ユーザーのデバイスからの音声ストリームは、Cloudflare RealtimeKitモバイルまたはWeb SDKを使用して、WebRTC経由で最も近いCloudflareの場所に送信されます
AIパイプラインオーケストレーション - 事前設定されたパイプラインが音声テキストからテキストへ → LLM → 音声であるように実行、中断検出とターンテイクのサポートあり
設定したランタイムオプション/コールバック/ツールを実行
応答配信 - 生成された音声ストリームを最小限の遅延でユーザーに返します
魔法は、これを組み立て可能な構成要素として設計したことにあります。厳格なパイプラインに縛られることはありません。データフローの設定、操作の追加、AIエージェントの動作の正確な制御が可能です。
例えば、上の図のMyTextHandler
関数を見てみましょう。これは、テキストを取り込んでテキストを返す関数で、音声からテキストへの検出後、テキストから音声への変換の前に挿入されます。
class MyTextHandler extends TextComponent {
env: Env;
constructor(env: Env) {
super();
this.env = env;
}
async onTranscript(text: string) {
const { response } = await this.env.AI.run('@cf/meta/llama-3.1-8b-instruct', {
prompt: "You are a wikipedia bot, answer the user query:" + text,
});
this.speak(response!);
}
}
エージェントは、RealtimeAgentを拡張したJavaScriptクラスであり、さまざまなテキストから音声、音声からテキスト、テキストからテキスト、さらには音声から音声へのTransformationsで構成されるパイプラインを初期化することができます。
export class MyAgent extends RealtimeAgent<Env> {
constructor(ctx: DurableObjectState, env: Env) {
super(ctx, env);
}
async init(agentId: string ,meetingId: string, authToken: string, workerUrl: string, accountId: string, apiToken: string) {
// Construct your text processor for generating responses to text
const textHandler = new MyTextHandler(this.env);
// Construct a Meeting object to join the RTK meeting
const transport = new RealtimeKitTransport(meetingId, authToken, [
{
media_kind: 'audio',
stream_kind: 'microphone',
},
]);
const { meeting } = transport;
// Construct a pipeline to take in meeting audio, transcribe it using
// Deepgram, and pass our generated responses through ElevenLabs to
// be spoken in the meeting
await this.initPipeline(
[transport, new DeepgramSTT(this.env.DEEPGRAM_API_KEY), textHandler, new ElevenLabsTTS(this.env.ELEVENLABS_API_KEY), transport],
agentId,
workerUrl,
accountId,
apiToken,
);
// The RTK meeting object is accessible to us, so we can register handlers
// on various events like participant joins/leaves, chat, etc.
// This is optional
meeting.participants.joined.on('participantJoined', (participant) => {
textHandler.speak(`Participant Joined ${participant.name}`);
});
meeting.participants.joined.on('participantLeft', (participant) => {
textHandler.speak(`Participant Left ${participant.name}`);
});
// Make sure to actually join the meeting after registering all handlers
await meeting.rtkMeeting.join();
}
async deinit() {
// Add any other cleanup logic required
await this.deinitPipeline();
}
}
開発者ドキュメントで例を完全にご覧になり、ご自身のRealtimeエージェントを実行してみてください。ダッシュボード上のリアルタイムエージェントを表示します。
リアルタイムエージェントの強みはその柔軟性です。
多くのAIプロバイダーオプション - Workers AI、OpenAI、Anthropic、またはAI Gatewayを通じてあらゆるプロバイダーでモデルを使用
複数の入出力モード - 音声やテキストを受け付け、音声やテキストで応答
ステートフルな調整 - 複雑な状態を自力で管理することなく、会話全体のコンテキストを維持
スピードと柔軟性 - RealtimeKitを使ってWebRTCセッションとUIを管理し、開発を加速するか、標準WebRTCクライアントか未加工のWebSocketsを使って直接接続することも可能です。
Cloudflare Agents SDKと統合
本日から始まるオープンベータでは、Cloudflare Realtime Agentsランタイムを無料で利用でき、さまざまなAIモデルに連携します:
WorkersでPCMとして生のWebRTC音声をパイプ
リアルタイムエージェント以上のアプリケーションで最も柔軟性を必要とする開発者のために、生のWebRTCの音声パイプラインをWorkersに直接公開します。
WorkersのWebRTC音声は、CloudflareのRealtime SFUを活用することで機能します。Realtime SFUは、OpusコーデックのWebRTC音声をPCMに変換し、指定されたエンドポイントにストリーミングします。つまり、Workersを使って以下を実装できるのです:
ライブ文字起こし - ビデオ通話の音声を文字起こしサービスに直接ストリーミングします。
カスタムAIパイプライン - 複雑なインフラストラクチャを構築せずにAIモデルに音声を送信
録画と処理 - オーディオストリームをリアルタイムで保存、監査、分析します。
音声AIにおけるWebSocketsとWebRTCの比較
WebSocketsとWebRTCはAIサービスの音声を処理できますが、異なる状況で最適に機能します。WebSocketsはサーバー間の通信に最適で、超高速の応答が必要でない時でも問題なく機能するため、テストや実験に最適です。しかし、ユーザーが遅延の少ないリアルタイム会話を必要とするアプリを構築する場合は、WebRTCの方が良い選択肢です。
WebRTCには、ライブ音声ストリーミングに優れた利点がいくつかあります。TCPの代わりにUDPを使用することで、パケットの損失による音声の遅延を防止し、ストリーム全体を妨害します(ヘッドオブラインブロッキングについては、このブログでよく説明します)。WebRTCのOps音声コーデックは、ネットワーク状況に自動的に調整し、パケットロスに柔軟に対応できます。WebRTCにはエコーキャンセルやノイズ低減などの組み込み機能も含まれています。WebSocketではこれらを別途構築する必要がありますが、
この機能を使うと、クライアントからサーバーへの通信にWebRTCを使い、Cloudflareを使って、サーバー間通信やバックエンド処理のために使い慣れたWebSocketに変換することができます。
WebRTCの音声がWebSocketsに変換されると、PCMの音声が元のサンプルレートで取得され、そこからCloudflareの開発者プラットフォーム内外であらゆるタスクを実行することができます。
WebSocketは双方向で動作するため、WebSocketに送り返されたデータはRealtime SFU上でWebRTCトラックとして利用可能になり、WebRTC内で利用できるようになるのです。
このセットアップを説明するために、ElevenLabs APIを使用したテキスト音声合成の簡単なWebRTCアプリケーションデモを作成しました。
利用開始の方法については、Realtime SFUの開発者ドキュメントをご覧ください。
WebSocketsは、低遅延の双方向プリミティブであり、開発者ツールでユビキタスなサポートを備えており、特にサーバー間通信でサポートされているため、リアルタイムAIパイプラインのバックボーンを提供することができます。HTTPはチャットやバッチ推論などの多くのユースケースに最適ですが、リアルタイム音声AIがAI推論サーバーと通信する場合は、持続的で低遅延の接続が必要です。リアルタイムAIワークロードをサポートするため、Workers AIでは一部のモデルでWebSocket接続をサポートしています。
PipeCat SmartTurn V2でローンチ
WebSocketをサポートする最初のモデルは、PipeCatのSmart-turn-v2ターン検出モデルです。これは、自然な会話に不可欠なコンポーネントです。ターン検出モデルは、発表者が会話を終了し、AIが応答するのが適切かどうかを判断します。ここを正しく理解することが、常に中断するAIと、自然に会話ができるAIとの違いです。
以下は、Workers AIで動作するSmart-turn-v2を呼び出す方法の例です。
"""
Cloudflare AI WebSocket Inference - With PipeCat's smart-turn-v2
"""
import asyncio
import websockets
import json
import numpy as np
# Configuration
ACCOUNT_ID = "your-account-id"
API_TOKEN = "your-api-token"
MODEL = "@cf/pipecat-ai/smart-turn-v2"
# WebSocket endpoint
WEBSOCKET_URL = f"wss://api.cloudflare.com/client/v4/accounts/{ACCOUNT_ID}/ai/run/{MODEL}?dtype=uint8"
async def run_inference(audio_data: bytes) -> dict:
async with websockets.connect(
WEBSOCKET_URL,
additional_headers={
"Authorization": f"Bearer {API_TOKEN}"
}
) as websocket:
await websocket.send(audio_data)
response = await websocket.recv()
result = json.loads(response)
# Response format: {'is_complete': True, 'probability': 0.87}
return result
def generate_test_audio():
noise = np.random.normal(128, 20, 8192).astype(np.uint8)
noise = np.clip(noise, 0, 255)
return noise
async def demonstrate_inference():
# Generate test audio
noise = generate_test_audio()
try:
print("\nTesting noise...")
noise_result = await run_inference(noise.tobytes())
print(f"Noise result: {noise_result}")
except Exception as e:
print(f"Error: {e}")
if __name__ == "__main__":
asyncio.run(demonstrate_inference())
水曜日、私たちはDeepgramの音声からテキスト、およびテキストから音声へのモデルが、世界中のCloudflareロケーションで動作するWorkers AIで利用可能になることを発表しました。つまり:
遅延の低減 - 音声認識は、Workersと同じネットワーク内で実行しているユーザーに近いエッジで行われます。
Cloudflareネットワークから離れることなくWebRTCの音声処理ができる
Workers AIを通じて直接利用可能な最先端の音声MLモデル強力で高機能な高速音声モデル
グローバル規模 - 330都市以上でCloudflareのグローバルネットワークを自動的に活用
Deepgramは、音声AIアプリの一般的な選択肢です。Cloudflareプラットフォーム上に音声AIシステムを構築することで、強力なモデルと最も遅延が少ないインフラを利用でき、お客様のアプリケーションに自然で応答性の高いエクスペリエンスを提供することができます。
Cloudflareで稼働する他のリアルタイムAIモデルにご関心をお持ちですか?
リアルタイムアプリケーションのためのAIモデルを開発しているなら、Cloudflareのネットワーク上で実行したいです。独自のモデルをお持ちの方、オープンソースモデルで大規模に超低遅延の推論を必要とする方は、当社までご連絡ください。
これらの機能はすべて、現在利用可能です:
これを開発したエンジニアの頭脳を取り出したいですか?ラスベガスのCloudflare Connectで、技術詳細や質疑応答のライブデモを実施しますので、ぜひご参加ください。詳細なスケジュールを確認し、登録してください。