とあるポットキャストをやっているんですが、今まで、Discord、Riverside、SonoBusを使って通話して、Audacityを使って録音してきました。Riversideだと、録音時の最初の音合わせが自動的に行われるため必要なく便利なのですが、会話はSonoBusの方が低遅延で使いやすく、これをまとめたアプリケーションが欲しくなったので、今回作りました。

その名もIdobatalk。


参考
Idobatalkidobatalk.eita.dev

機能などはすでにWebsite側に書いてあるので、具体的な実装の部分に触れたいと思います。

技術スタック

  • Tauri v2
  • pen.dev (Pencil)
  • Claude Code
  • Rust
  • HTML / CSS

具体的に

流れはこれです。

  1. Claude Codeと仕様を考える
  2. Claude Codeとpen.devでデザインを作る
  3. Claude CodeとTauriを使って実装する

ほとんど前回書いた内容と同じなので詳細はこれを見てもらった方がわかりやすいです。

PencilとClaude Codeの組み合わせが良すぎる

今回機能を作るにあたって、低遅延であること、同時録音ができること、最低でも3人同時に通話できることが絶対で、あとは自分的に欲しい部分を肉付けしていきました。

技術選定に関しては、
低遅延であることが前提だとP2Pしかない。
録音だとローカルに同時に保存してクラッシュ対策の考慮が必要。
ということもあり、Webアプリではなくデスクトップアプリになりました。

P2Pに関しては、WebRTCを使うか自前で実装するかあったんですが、遅延、バッファなどの微調整、付随してメタデータを送れることを考えて、音声データをQUICで送ることにしました。
実際WebRTCを使えばWeb化することが容易なので、逆にクラッシュ対策のためのローカルにリアルタイムで書き込む方法などを考えて、File System Access APIあたりでいけそうな気はしたものの、対応ブラウザの話もありやめました。


参考
File System Access API: ローカル ファイルへのアクセスを簡素化developer.chrome.com

一通り作り終わったあたりで、アップデートの手間が掛かるようになってきたので、アプリ内からアップデートできるようにしました。
普段はストア経由で配ることが多いので、意外と自前でこの機能作ったことがなかったんですが、意外と簡単で、Tauriの場合は、Updaterがプラグインとして提供されていて、Object Storageに、最新バージョンが書かれたJSONファイルとアプリ本体、検証用の署名を配置すれば完成です。
今回はCloudflare R2を使用しています。


参考
TAURI Updater(アップデート)v2.tauri.app

あとは、ネットワークのステータス表示や、画面共有機能などを追加して、現在も開発中になります。

個人的なポイント

このアプリは、Discordのような誰かがルームにいることがわかる仕組み、人がいたら気軽に入れる仕組みを作りたいと思い、今まで入ったルームの一覧と今入っている人が表示されるようになっています。Idobatalkという名前にもなっている井戸端会議ができれば良いなと思っています。

そして、このアプリはE2EEに対応しています。
P2Pの仕様上、サーバを経由しないので経路でもれることってあんまりないと思うのですが、このアプリでは相手との通信は全て最初に交換される鍵で暗号化されています。安心ですね!

最後に

今後も、必要な機能があれば作っていこうと思っています。
Githubは公開していないのですが、具体的に欲しい機能やバグがあれば、このサイトか、Idobatalkのお問い合わせからメッセージいただけますと嬉しいです!