p99와 VAP — 대화 차례 모델

p99는 단일 오디오 채널에서 발화 종료 확률을 추정합니다. VAP는 동기화된 사용자와 에이전트 채널에서 음성 활동을 예측합니다. 응답이나 끼어들기 시점은 애플리케이션이 결정합니다.

이 API는 SDK를 소스에서 빌드하여 사용합니다. Swift는 SpeechVAD를 사용하며 C++는 SPEECH_CORE_WITH_ONNX=ON이 필요합니다. Android API는 ONNX Runtime을 사용합니다. 기존 파이프라인의 기본 설정은 바뀌지 않습니다.

모델

p99 turn-1-mini5.3M · CoreML · Float3216 kHz · 160 ms · 1 chApache-2.0
VAP (otoSpeech)5.8M · CoreML / ONNX · Float3216 kHz · 20 s · 2 chCC BY 4.0 / MIT

Swift API

p99는 한 단계보다 짧은 입력을 버퍼링합니다. 160 ms 단계마다 20 ms 프레임 여덟 개를 반환합니다. 판단 시점에는 availableAfterSeconds를 사용하고 대화 사이에 세션을 초기화하세요.

import SpeechVAD

let p99 = try await P99TurnModel.fromPretrained()
let session = try p99.createSession()
let frames = try session.pushAudio(pcm16k)
for frame in frames {
    print(frame.probability, frame.availableAfterSeconds)
}
try session.reset()

let vap = try await VAPModel.fromPretrained()
let forecast = try vap.forecast(userAudio: userPcm, agentAudio: agentPcm)
print(forecast.pNow, forecast.pFuture, forecast.voiceActivity)

VAP는 최근 20초의 16 kHz 오디오를 사용합니다. 두 채널 길이를 맞추고 에이전트가 말하지 않으면 0으로 채운 채널을 전달하세요. 짧은 입력 앞에는 무음을 채웁니다. 매 예측마다 전체 창을 다시 계산하므로 기기에 맞는 호출 간격을 선택하세요.

C++

#include <speech_core/models/onnx_vap.h>

speech_core::OnnxVap model("models/vap.onnx");
auto forecast = model.forecast(user.data(), agent.data(), user.size(), 16000);
// p_now[0]: user, p_now[1]: agent
// p_future and voice_activity use the same channel order.

Android

val directory = ModelManager.ensureVapModels(context)
withContext(Dispatchers.Default) {
    VoiceActivityProjection(VoiceActivityProjectionConfig(directory)).use { model ->
        val forecast = model.forecast(userPcm, agentPcm)
        println(forecast.userNearTerm)
        println(forecast.agentNearTerm)
    }
}

다운로드

벤치마크 결과

TurnBench · Soniqo

라이선스