はじめに
最近業務でも扱うことが出てきたWebRTC、Speach to Speach(S2S)についてAWSでも扱ってみたいと考え、やってみました。
今回の構成要素
今回は主にAmazon Nova Sonic、Kinesis Video Streams(KVM)、WebRTCを使いますが、それらについて触れておきます。
Amazon Nova Sonic
2025年4月にリリースされたSpeach to SpeachタイプのLLM。
これまでのような「音声入力→音声認識→文字化→回答生成→音声化→音声出力」といった複数のプロセスが不要で、これひとつで音声入出力ができるというものです。
ただし残念なことに2025年11月現在日本語対応していません。
(現在は英語、フランス語、スペイン語、ドイツ語、イタリア語の5つのみ対応)
→東京リージョンで展開はされています。
AWSマネジメントコンソールからBedrockのコンソールに入り、モデルアクセスからNova Sonicを選択します。
現在のバージョンは、1.0になっています。
Nova SonicについてのAWS公式ドキュメントは以下のとおりです。
Amazon Kinesis Video Streams
AWSのサービス、デバイスからライブビデオをストリーミングしたり、リアルタイムのビデオ処理やバッチ指向のビデオ分析用のアプリケーションを構築したりすることが可能です。
WebRTC
「Web Real-Time Communication」の略で、ウェブブラウザ間でプラグインなしに音声、動画、データをリアルタイムにやり取りできる技術です.
P2P接続の一種である、WebRTCピア接続を用いて主にSpeach to Speachタイプのソリューションを構築できます。
技術としてはText to SpeachやSpeach to Textが以前からありますが、「音声入力→音声認識→文字化→回答生成→音声化→音声出力」のようなフローを一気に簡略化できるものとなっています。
また、OpenAIのRealtime APIでSIPという通信プロトコルを利用したS2Sも追加されましたが、今回はWebRTCについて検証しています。
(他にもWebSocketを使ったS2Sもある)
この構成図はOpenAIのRealtimeAPIにおけるWebRTCについてのものです。
WebRTCの公式サイトです。
OpenAIのRealtimeAPIのページです。
実際に構築
1.Condaのインストール
Condaは、パッケージ管理と環境管理を行うためのツールのことです。
異なるPythonのバージョンやライブラリの組み合わせを簡単に切り替えられる独立した環境を、ローカルマシン上に作成・保存・ロード・切り替えできます。
早速インストールしてみましょう。
今回はMacを使っているのでMacから
# Homebrewを使用
brew install miniconda
# download installerを使用
# Intel
curl -O https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-x86_64.sh
# Apple シリコン
curl -O https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-arm64.sh
Homebrewを予めインストールしておくとCondaのインストールもスムーズです。
もちろんダウンロードインストーラーでもできます。
なお、Windowsでは以下のようにやります。
# Windowsパッケージマネージャーを使用
winget install Anaconda.Miniconda3
# Chocolateyを使用
choco install miniconda3
ダウンロードインストーラーからでもインストールできます。
Linuxでは以下のようにやります。
# ダウンロードとインストール
curl -O https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
# パッケージマネージャーを使用
sudo apt install miniconda3 # Ubuntu/Debian
sudo yum install miniconda3 # CentOS/RHEL
今回はCondaを使いましたが、Node.jsでもできます(今回は割愛)
2.プロジェクトのセットアップ
以下のように入力します。
# プロジェクトディレクトリへの移動
cd sample-nova-sonic-speech2speech-webrtc/
LinuxやmacOSの場合は以下のコマンドも必要です。
# スクリプトを実行可能にする
chmod +x *.sh
また、各バージョンの確認もやっておきます。
# 前提条件の確認
python3 --version # Should be 3.8+
node --version # Should be 16.0+
conda --version # Should show conda version
3.AWS設定
AWS上でもいくつか手順があります。
AWS認証情報の作成
AWSアカウントの作成(持っていなければ)
プログラムによるアクセス権限を持つIAMユーザーの作成
必要なポリシーをアタッチ
AmazonKinesisVideoStreamsFullAccess
AmazonBedrockFullAccess
のふたつをアタッチ
KVSシグナリングチャネルの作成
AWSマネジメントコンソールを使用
・Amazon Kinesis Video Streamsコンソールを開く
・左ペインのシグナリングチャネルに移動
・シグナリングチャネルの作成をクリック
・チャンネル名を以下のように入力
nova-s2s-webrtc-test
・その他の設定はデフォルトのままで
・シグナリングチャネルの作成をクリック

シグナリングチャネルが作成されました。
※AWS CLIを使用を使用しても設定が可能です。
なお、チャネル名はKVS_CHANNEL_NAME環境設定と一致している必要があります。
チャネルは設定で指定したのと同じAWSリージョンに作成する必要があります。
(今回はap-northeast-1)
# シグナリングチャネルの作成
aws kinesisvideo create-signaling-channel \
--channel-name nova-s2s-webrtc-test \
--region ap-northeast-1
# チャネルが作成されたことの確認
aws kinesisvideo list-signaling-channels \
--region ap-northeast-1 \
--query 'ChannelInfoList[?ChannelName==`nova-s2s-webrtc-test`]'
環境ファイルの設定
Python バックエンド (.env)
# 環境テンプレートのコピーと編集
cp python-webrtc-server/.env.template python-webrtc-server/.env
nano python-webrtc-server/.env # Edit with your values
必要な変数
アクセスキーIDとシークレットアクセスキーは作成したものを入力
# AWS Configuration
AWS_REGION=ap-northeast-1
AWS_ACCESS_KEY_ID=your_access_key_here
AWS_SECRET_ACCESS_KEY=your_secret_key_here
# KVS WebRTC Configuration
KVS_CHANNEL_NAME=nova-s2s-webrtc-test
# Bedrock Configuration
BEDROCK_MODEL_ID=amazon.nova-sonic-v1:0
# Logging Configuration
LOGLEVEL=INFO
Reactフロントエンド (.env)
# 環境テンプレートのコピーと編集
cp react-webrtc-client/.env.template react-webrtc-client/.env
nano react-webrtc-client/.env # Edit with your values
必要な変数
# AWS Configuration (embedded in client-side code)
REACT_APP_AWS_REGION=ap-northeast-1
REACT_APP_AWS_ACCESS_KEY_ID=your_access_key_here
REACT_APP_AWS_SECRET_ACCESS_KEY=your_secret_key_here
# KVS WebRTC Configuration
REACT_APP_KVS_CHANNEL_NAME=nova-s2s-webrtc-test
4.サービスの開始
自動セットアップと手動セットアップがありますが、今回は手動セットアップは割愛します。
自動セットアップ
ターミナル1. Python バックエンド
# このスクリプトで、Conda環境の作成、依存関係のインストール、サーバーの起動を処理する
./start-python-server.sh
ターミナル2 - Reactフロントエンド
# npmインストールとクライアントのスタートアップ
./start-react-client.sh
これにはオプションもあります。
# ./start-react-client.sh --port 3001
# ./start-react-client.sh --build # Production build
# ./start-react-client.sh --serve # Serve production build
5.アクセスとテスト
以下の手順でやります。
ブラウザでhttp://localhost:3000を開く
権限の付与: プロンプトが表示されたらマイクのアクセスを許可する
接続テスト: 「セッションを開始」をクリックし、マイクに向かって話す
※日本語に対応していないので、英語で話します。
(他の言語を話せる方は他の言語でもOK)
終わりに
Bedrock KnowledgeのようなRAG、AWS関連のMCPサーバー、Stands Agents等を絡めることができるようであり、より幅広いものができそうなものです。
一番期待したいのは日本語の対応です。





