오디오 후킹
PlanetKit은 Planet Cloud가 상대방에게 오디오를 전송하기 전에 오디오 데이터를 가져올 수 있는 오디오 후킹(audio hooking) 기능을 제공합니다. 이 기능은 로컬 사용자의 음성을 변조하거나 오디오 데이터를 음성 인식에 활용하는 용도로 사용할 수 있습니다.
개요
오디오 후킹 기능을 사용하기 위한 메서드는 HookAudioExtension
에서 제공합니다.
오디오 후킹 활성화
오디오 후킹을 활성화하려면 PlanetKitCallHookedAudioHandler
구현체를 인자로 enableHookMyAudio()
를 호출하세요.
오디오 데이터 수정하기(선택 사항)
가져온 오디오 데이터를 수정하려면 PlanetKitHookedAudio
의 setData()
를 사용하세요.
setData()
메서드는 raw 오디오 데이터(data
)만 수정할 수 있습니다. channel
, sampleCount
, sampleRate
, sampleType
, seq
와 같은 메타데이터는 수정할 수 없습니다.
오디오 데이터 돌려놓기
가져온 오디오 데이터를 다시 돌려놓으려면 PlanetKitHookedAudio
객체를 인자로 putHookedMyAudioBack()
을 호출하세요.
오디오 후킹을 활성화한 후에는 오디오 데이터 수정 여부와 상관없이 반드시 가져온 오디오 데이터를 다시 돌려놓아야 합니다. 돌려놓지 않으면 상대방에게 오디오가 전달되지 않습니다.
오디오 후킹 비활성화
오디오 후킹을 비활성화하려면 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는 다음과 같습니다.