Sanas はいかにして Expo で3か月でリアルタイム動画翻訳アプリを作り上げたか
Sanas は Expo で世界初の即時翻訳ビデオ通話アプリを開発し、25 以上の言語に対応、話者の口調も保持。
日本語
コピー

何十年もの間、エンジニアたちは本物の万能翻訳機を夢見てきた。異なる言語を話す2人が、同じ言語を話しているかのように互いを理解できる——そんな装置を。Sanas で、私たちはその夢を現実にしようと決めた。
Sanas の小さなチームは、わずか数か月でそれをやってのけた。Sanas は音声 AI の会社で、私たちは Expo を使って世界初のリアルタイム言語翻訳ビデオ通話アプリを開発・リリースした。最先端の LLM 翻訳研究と Expo のモダンなモバイル開発ツールを組み合わせることで、リアルタイムの多言語会話を可能にした。

これほど野心的なものを作るには、開発スタックが柔軟性、ネイティブ性能、イテレーション速度のバランスを取れていなければならない。Expo はまさにその土台を与えてくれた。統一された開発体験、速いイテレーションサイクル、そしてネイティブ API へのアクセス。おかげで私たちは、AI の中でもとりわけ人間味のある問題のひとつに集中できた。人と人が理解し合えるようにすることだ。
リアルタイム・低遅延の音声翻訳はなぜ難しいのか
リアルタイムかつ低遅延の音声翻訳は、通信技術の中でも最も難しい問題のひとつだ。自然に感じられるには、音声を即座に取得して送信し、通話中に翻訳と音声合成を十分速く終わらせる必要がある。しかも話者それぞれの口調や感情を保ったままで。さらに、予測できないネットワーク条件下でも動作し、25 以上の言語にスケールし、モバイルのビデオ通話で安定して届けなければならない。
モバイルのビデオ通話でこれを全部同時にやるとなれば、遅延、性能、音質の忠実度をまとめて解決する必要がある。数百ミリ秒の遅延でも、会話はぎこちなく聞こえてしまう。iOS と Android のどちらでもユーザーが負担を感じないシステムと、毎日テストして改善を出せる開発フレームワークが要る。

Sanas が Expo を選んだ理由
チームはスタンフォードにいた頃から Expo を使っていた。何科目かのモバイル開発の授業で勧められていたフレームワークだ。速く進めながらネイティブ API も手放さずに済むことは分かっていた。Expo なら毎日ビルド、テスト、デプロイができ、性能が重要なコンポーネントは完全に制御できる。
Expo の統一されたツールチェーンと統合サービスがあったからこそ、本当に厄介な問題に集中できた。翻訳の精度、遅延、自然さだ。
-
Expo SDK 54 により、一貫した開発体験を保ちながらネイティブ API に深くアクセスできる。
-
EAS Build が iOS と Android の CI/CD を引き受け、手動設定の手間をなくす。
-
EAS Update で、内部テスターと早期ユーザーに OTA で即座にビルドを配信できる。
ビルド、更新、ネイティブ設定といった複雑な部分を Expo に任せたことで、私たちは最も重要なことに力を注げた。音声翻訳を限界まで押し上げることだ。
主要な Expo モジュールと統合
即時翻訳と滑らかなコミュニケーションを実現するため、私たちは一連の Expo モジュールとカスタムのネイティブ統合を軸にアプリを構築した。
-
expo-audio:リアルタイムの取得と音声合成のための録音・再生
-
expo-camera:ライブ映像ストリーミングと参加者画面の制御
-
expo-webrtc(カスタム統合):暗号化されたピアツーピア通話レイヤー
-
expo-haptics:翻訳イベントを伝える繊細な触覚フィードバック
-
expo-notifications:通話の招待、不在着信の通知、翻訳の更新
-
expo-secure-store:認証情報と API 資格情報のローカル暗号化保存
-
expo-updates:シームレスな OTA 機能リリース
-
カスタムネイティブモジュール:LLM のストリーミング推論とオンデバイスの声質クローニング
これらのモジュールがあれば、小さなチームでもプロダクションレベルの体験を作れる。即時性があり、直感的で、セキュリティ、声質の忠実度、翻訳速度のいずれも妥協しない。
Sanas アプリのアーキテクチャ
裏側では、アプリはエッジの知能とオンデバイスの効率のバランスを取る、そぎ落とされたアーキテクチャで動いている。各レイヤーは遅延を最小化し、忠実度を最大化するように設計されている。
-
クライアントは React Native + Expo のアプリで、UI、状態管理、ローカルの音声・映像処理を担う。
-
エッジサーバーは微調整済みの多言語 LLM を使い、低遅延の音声認識、翻訳、音声合成を処理する。
-
WebRTC トランスポートがリアルタイムの双方向通信を担い、品質を動的に調整してネットワーク状況が悪いときも安定させる。
-
EAS Build と Update がビルドの自動化、プレリリースチャネル、遅延の A/B テスト用のフィーチャーフラグを担う。
デバイスとエッジの間で計算を賢く配分することで、ほぼ即時の翻訳体験を実現しつつ、すべてのプラットフォームで一貫した性能を保っている。
例:リアルタイムのストリーミング翻訳
即時翻訳を作る上で最も厄介な部分のひとつは、リアルタイムの音声取得、文字起こし、翻訳、合成音声の再生を、単一の接続上で最小の遅延にまとめることだ。私たちの実装はこうなっている:
// A single WebSocket handles the entire translation pipeline
ws.onmessage = event => {
const message = JSON.parse(event.data);
switch (message.type) {
case 'ready':
// Server is ready — start streaming audio chunks
LiveAudioStream.on('data', (data: string) => {
ws.send(JSON.stringify({ type: 'audio', data }));
});
LiveAudioStream.start();
break;
case 'transcription':
// Progressive transcription with complete + partial words
const completeText = message.complete.map(w => w.word).join('');
const partialText = message.partial.map(w => w.word).join('');
updateTranscription(completeText, partialText);
break;
case 'translation':
// Full translation arrives after user stops speaking
displayTranslation(message.complete.map(w => w.word).join(''));
break;
case 'speech':
// Streamed TTS audio chunks with character-level timestamps
audioChunks.push(base64ToUint8Array(message.audio));
break;
}
};
この方式では、単一の持続的な WebSocket で文字起こし、翻訳、音声合成を多重化し、API を別々に呼ぶことによるラウンドトリップのオーバーヘッドをなくしている。ユーザーが話すと文字起こしが表示され、話し終えるとほぼ即座に翻訳結果が聞こえる。
Expo で作ったことの見返り
わずか3か月で、小さなチームがアイデアをプロトタイプから本番環境へと押し上げ、App Store と Google Play で同時にリリースした。このアプリは現在25以上の言語に対応し、どの言語でも話者の自然な口調とアイデンティティを保つ。平均翻訳レイテンシは2秒未満で、体験は滑らかかつ自然、どのデバイスでもネイティブに動作する。
この速さを可能にしたのは Expo だ。統一されたツールチェーン、オープンソースの柔軟性、クラウドベースのビルドシステムが、スケールして届けるために必要なものをすべて揃えてくれた。複雑なネイティブ設定を管理する手間がなくなり、その分の時間をコア翻訳モデルの改善とリアルタイム体験の最適化に注げるようになった。
あるエンジニアの言葉を借りれば、「Expo のおかげで、ビルドシステムの設定ではなく、翻訳の限界を押し広げることに全力を注げる」。
Sanas の次なる一手は?
ここで終わりではない。チームは次のフロンティアに集中している。リアルタイム翻訳をより表現豊かに、より人間らしくすることだ。詳しくは技術記事を読んでほしい。
Expo はこれからもこの旅の要であり続ける。高速で信頼性の高いアップデートシステムにより、モデルの改善と新機能を毎週リリースでき、研究のブレークスルーがほぼ即座に実際のユーザー体験へと変わる。
Sanas の目標は一貫してシンプルだ。どの言語を話していても、人が相手を理解し、相手から理解されること。Expo はそのビジョンを現実にする手助けをしてくれる。