話し声を高くしたり低くしたり、リアルタイムで変化させながら、ビデオチャットをすることができます。
ビデオチャットのバックエンドにはSkyWayを使用しています。SkyWayを使うことでWebRTCに必要なサーバを構築・運用することなく、手軽にビデオチャットが可能です。
MediaStreamsのオーディオトラックにcreateMediaStreamDestinationで作成したストリームをセットすることにより、任意のオーディオをストリームすることができます。
Voice Changerでピッチシフトをさせた音声でチャットするために、マイクのストリームのノードをScriptProcessorNodeに接続して処理してMediaStreamsのオーディをトラックに渡しています。
const vStream = canvas.captureStream(20); const aStream = actx.createMediaStreamDestination().stream; const [vTrack] = vStream.getVideoTracks(); const [aTrack] = aStream.getAudioTracks(); return new MediaStream([vTrack, aTrack]);
ピッチシフトとは音を高くしたり低くしたりする技術です。一般的には音声の再生速度を変えることで音の高さ(ピッチ)が変わります。例えば、再生速度を早く変更すると場合はピッチが高くなります。
カセットテープを送りしたりすると声が高くなる現象です。
マイクからの入力の場合には音声の再生速度を変えてしまうと、元の音声の長さが短くなってしまうため隙間ができてしまいます。これでは困るので、処理単位内で隙間が空いてしまった箇所に波形をクロスフェードで重ねます。こうすることによって、自然にピッチを変える処理が実現できます。
ピッチを低くするときも同じように、処理単位より長くなってはみ出してしまっている最後を重ねてクロスフェードして処理単位内に収めることで対応が可能です。