オーディオフック
PlanetKitは、オーディオフック(audio hooking)という機能を提供します。これは、Planet Cloudが相手にオーディオを転送する前にオーディオデータを取得(フック)する機能です。ローカルユーザーの音声を変えたり、オーディオデータを音声認識に活用したりする用途で使用できます。
概要
オーディオフック機能を使用するためのメソッドは、HookAudioExtensionで提供しています。
オーディオフックの有効化
オーディオフックを有効にするには、PlanetKitCallHookedAudioHandlerの実装を引数としてenableHookMyAudio()を呼び出します。
オーディオデータの修正(オプション)
フックしたオーディオデータを修正するには、PlanetKitHookedAudioのsetData()を使用します。
Note
setData()メソッドは、rawオーディオデータ(data)のみ修正できます。channel、sampleCount、sampleRate、sampleType、seqのようなメタデータは修正できません。
オーディオデータの復元
フックしたオーディオデータを元に戻すには、PlanetKitHookedAudioオブジェクトを引数としてputHookedMyAudioBack()を呼び出します。
Warning
オーディオフックを有効にした後は、オーディオデータの修正有無にかかわらず、フックしたオーディオデータを必ず元に戻す必要があります。そうしないと、相手にオーディオが転送されません。
オーディオフックの無効化
オーディオフックを無効にするには、disableHookMyAudio()を呼び出します。
サンプルコード
以下のサンプルコードは、音声を変えるためにオーディオフック機能を使用する方法を示しています。
func modifyVoice(PlanetKitCall call) async {
final audioClipper = PlanetKitCallHookedAudioHandler(
onHook: (call, audio) async {
if(await audio.setData(clipAudioData(audio.data, 0.01)) {
await call.putHookedMyAudioBack(audio);
}
},
);
final result = await call.enableHookMyAudio(audioClipper);
print("enableHookMyAudio result: $result")
}
Uint8List clipAudioData(Uint8List audioData, double threshold) {
var floatData = audioData.buffer.asFloat32List();
for (int i = 0; i < floatData.length; i++) {
double value = floatData[i];
if (value > threshold) {
floatData[i] = threshold;
} else if (value < -threshold) {
floatData[i] = -threshold;
}
}
return Float32List.fromList(floatData).buffer.asUint8List();
}
関連API
オーディオフック機能に関連するAPIは、以下のとおりです。