構想から15年、個人で音声コミュニケーションSNSを開発・リリースしたので色々書いてく
はじめに
まず初めに、今回リリースしたプラットフォームは現職企業とは一切関係のない個人活動の内容です。
また、この記事はあまり技術的な内容は含んでおらず、どんな思いで作ったのかや今後の予定などを書いたコラム記事です。
本来はNoteなどのメディアで書くべき内容ですが、あくまで私は開発者なので少しだけ技術的な内容も混じえながらここに書いていきたいと思います。
どんなサービスなのか
音声とチャットを用いて相互にコミュニケーションを行うことを可能とするSNSサービスです。
ユーザーが自由に音声ルームを作成し、作成されたルームに他のユーザーが自由に入室すると作成したユーザーの音声が聞くことが可能になります。
※ 以降ルーム作成者をオーナー、ルーム参加者をリスナーとします。
リスナーは、ルーム内のみで有効なチャットを打つことでオーナーとコミュニケーションをとることができるようになっています。
また、リスナーはルーム内でのみ有効なマイク申請を行うことによってスピーカーに昇格することが可能になっており、昇格後は音声発話が可能になります。
誰でも配信は可能ですが、みんながおしゃべり上手なわけではないので、間を埋めるための機能としてBGM機能を提供します。
今でいうGravityやTwitterのスペース、Clubhouseに近いサービスです。
現状の機能について
現状の機能は上で書いた通りですが、以下の機能を保有しています。
- アカウント作成
- プロフィール編集
- 音声ルーム作成機能
- 画面共有
- スピーカーへの昇格 / リスナーへの降格
- BGM再生
一番大事な機能がBGM再生機能部分です。
BGMについて
音声ルームのオーナーは、自身およびリスナーにtunetalk上に登録されている楽曲をBGMとして再生する機能を提供しています。
登録楽曲は私の知人に登録いただいた楽曲や、フリーで配布されている楽曲を個別で手動登録しており、再生時にルーム参加者全員の画面に再生中楽曲のクレジット、およびサイトリンクを表示するようにしています。
※ 基本的に著作権を犯さない範囲で未利用者の方に楽しんでいただけるようにしたいと思っています。
※ 問題がある場合、直近ではご連絡いただく窓口を作りますのでそこからお問い合わせをいただくか、メールでお問い合わせをいただく形式を取ろうと思っています。
現状の課題
- システムキャパが把握しきれていないなどのインフラ設計、障害設計課題
- 電気通信事業の届出ができていないなどの法的課題
- フォロー機能やブロック機能などのSNSとして必須機能が具備できていないなどの機能課題
- 運用者体制やサポート体制課題
- アダルトフィルターや出会い目的の利用、業者駆逐などなど...
特に2, 5が致命的です。順次対応するか、抵触する機能を削るなど検討したいと思っています。
まずはありのまま使ってみていただいて、いただいたお声に応じて検討を進めたいと思っています。
技術的な内容
せっかくなので少しだけ技術部分について書きたいと思います。
細かいアーキテクチャについての言及はしません。お許しを。
使用している色々
インフラ
使用言語、フレームワークなど
大枠の選定理由
-
Typescript
-
React
普段から業務で使っていて、ある程度書けたため選定しました。 -
Recoil
こちらも業務でよく使っており、今後使う機会が一層増えそうだったため勉強がてら選定しました。 -
mediasoup
音声通話などの部分で使用しています。
元々Skywayなどを使用して工数をかけずに実装、早期検証をする案もありました。
が、個人的には自分でプロダクトを作る以上はいくつか譲りたくないポイントがありました。
- コアの部分は一定以上自分でつくりたい
- 実コストをなるべくかけずに運用をスタートさせたい
最終的に安定性が損なわれてきたり、拡張性がなかったりで外部のサービスを使わなければいけない状況になることも想定されますが、デバッグ作業などを通して理解を深めておくことでいざという時に自分で対処できるようにしたかったのが1番目の理由です。
2番目のコストに関しては、まず最初は持ち出しをある程度押さえておくことで心理的な負担を減らしたかったという理由があります。
広告収益もそれほど期待できないと思っているので、少ない広告収益で運用を回したいと考えました。
フロントエンド
上述の通り、Reactを使って実装しています。状態管理はRecoilです。
他にもreact-hook-formとか細かく色々使っていたりしますが、大きく苦しめられたのはmediasoup-clientとReactの組み合わせです。
(Reactの知識が浅かったこともあり、フックによって多重に動作してしまったり...)
mediasoupのサーバーと通信するための諸々について、複数の手続きを順番にしなければいけないことが重要でした。
下図のように三者の通信を順番にみながら問題の原因を特定しなければいけないなど、不具合が発生した際のデバッグが最も大変でした。
また、MediaStreamも今回初めて触れまして、これ関連もたくさんハマりました。
音声をキャストした際、キャスト先への音量調整ができなかったり、ミュートが効かなかったり...
React側に実装した処理が原因なのかMediaStreamの処理が不足しているのか、midisaoup-clientの実装が不足しているのか、複合的すぎて順番に原因をたぐろうにも地味すぎて辛かったです。
(そもそもブラウザ多重起動しながら音声がどう届いているのかのテストなんて頭が混乱しっぱなしでした。)
そもそも、どこにも資料がなかったのがかなり辛かったです。
この辺りの需要がありそうならまた記事を書きたいと思います。
バックエンド
もうExpressは飽きてしまって使いたくない、という理由で頑なにFastifyで実装をしました。
多少Fastifyに知見はあったものの、socket.ioは初見、mediasoupは未知すぎて開発は地獄のソレでした。
あと未だ未解決なんですが、ユーザーの接続状況などはシングルトンにすることによって管理していますが、これってクラスタリングする時どうするんでしょう...
もし知見をお持ちの方がいれば、ぜひコメントなどでご連絡ください...
元々はサーバーサイドの人間なので、それ以外は割と淡々と実装しました。
以下開発背景という名の蛇足
サービスを作った背景
遡ること15年前、お店などで音楽を合法的に流すためのほぼ唯一の手段はUSENで、ちょうどNapstarがラッピングカーを走らせていた頃のお話です。
USENでは主にその時流行っている楽曲が流れるほか、ユーザーのリクエストによって流れる楽曲があり、流行はUSENから生まれるなんてことも多々あったと思います。
例えば私の世代だと、アンダーグラフのツバサはUSENやラジオがキッカケで火がついたような記憶があります。
(3年ほど前にshazamの検索ランキング4位に入ったそうです。リリースから16年経ってなおチャートに入るのは偉大すぎますね...)
で、同世代の方ならわかってくれると思いますが、音楽チャートって操作されているって話がそこらじゅうで語られてましたよね。
音楽が好きだった僕らの間ではこの話題になることが多々あり、その中で
「誰の都合にも左右されない、誰にでも公平にチャンスがある音楽配信サービスを作りたいね」
という話が持ち上がりました。
ここからすべてが始まりました。
原資を稼ぐために美容系ECサイトを作ってみたり、アフィサイト運営してみたり、諸々失敗して就職してみたりしました。
結果、多少なりとも社会経験、開発経験、運用経験のノウハウが溜まってきたので、15年越しに改めて友人とプロジェクトを再始動させました。
なぜ音声SNSなのか
上述の通り音楽を広く人に知ってもらうためのきっかけとしてストリーミングサイトを企画しましたが、元を辿れば多くの人にまだ聞いたことがない音楽を届けたいというのが発端です。
起点になったUSENで言えば、多くのお店で音楽を流すのは会話の間を埋めるためです。
(もちろんお店の雰囲気作りなどもありますが)
そこで、僕らは音声SNSによるコミュにケーションの中でBGM機能をつけようと思い至りました。
今後について
掲題の音声SNSのほかにmisskeyサーバーを建てました。
misskey.tunetalk.jp
現在はこのmisskeyとtunetalkは別個のものとして動作しておりアカウントの連携もできていませんが、今後は掲題の音声SNS内にMisskeyクライアントを実装し、テキストと音声によるコミュニケーションや発信のできるプラットフォームを作っていきたいと思っています。
最終的にはクリエイターが収益を得られる仕組みを作っていきたいです。
あと諸々の都合でまだモバイルに対応できてないのでこちらも頑張ります。
どんなプラットフォームを目指しているのか
- 音楽・イラスト・VTuberなどさまざまなジャンルの方に発信してほしいので、発信できるプラットフォーム
- インフラ・プログラマなどのエンジニアがコミュニティを形成できるプラットフォーム
1については開発背景で記載した通りです。発信できるプラットフォームになるように頑張ります。
2についてですが、私は普通のエンジニアで、そもそもバックグラウンドはインフラエンジニアなのであまり社外コミュニティを形成する文化がありませんでした。(Janogにも参加したことはありません。)
エンジニアって社外コミュニティを作るのすごく難しいし、だから自分のエンジニアとしての現在地も見えないし、トレンドのキャッチアップも難しいなと思っています。(プライドが邪魔したりもする)
なので、気軽に話せるエンジニアの知り合いが作れるプラットフォームにしていきたいと思っています。
最後に
ここまで読んでくださった方、ありがとうございます。
よろしければ、ぜひtunetalkを使ってみてください。
だらだらと書きましたが、音声のみの配信は気楽で意外と面白いので、いろんな人に体験してみていただきたいと思っています。
また、アーティストの方で楽曲を登録してもいいよという方はぜひTwitter DMなどでご一報ください。
あなたが有名になるためのお手伝いをさせてください。
Discussion