62 lines
2.6 KiB
JavaScript
62 lines
2.6 KiB
JavaScript
export function queueSteps(chunkMs, computeMs, count = 8) {
|
|
if (
|
|
!Number.isFinite(chunkMs) ||
|
|
!Number.isFinite(computeMs) ||
|
|
chunkMs <= 0 ||
|
|
computeMs <= 0
|
|
) {
|
|
throw new RangeError("Time values must be finite and positive.");
|
|
}
|
|
let previousEnd = 0;
|
|
return Array.from({ length: count }, (_, index) => {
|
|
const arrival = (index + 1) * chunkMs;
|
|
const start = Math.max(arrival, previousEnd);
|
|
const end = start + computeMs;
|
|
previousEnd = end;
|
|
return { index: index + 1, arrival, start, end, wait: start - arrival };
|
|
});
|
|
}
|
|
|
|
export const architectures = {
|
|
cascade: {
|
|
nodes: [
|
|
["用户语音", "声音输入", "input"],
|
|
["ASR", "识别成文本"],
|
|
["文本 LLM", "生成回答"],
|
|
["TTS", "合成声音"],
|
|
["系统语音", "播放输出", "output"],
|
|
],
|
|
detail:
|
|
"<p><strong>两个独立的文本接口。</strong>ASR 把用户语音交给文本模型,TTS 再把回答读出。模块可以独立替换。仅传文字时,输入声学信息会在接口处被压缩。</p><p>持续双工需要在这些模块之间保持新输入、话轮状态、取消与播放进度的一致。</p>",
|
|
},
|
|
two: {
|
|
nodes: [
|
|
["用户语音", "声音输入", "input"],
|
|
["语音理解 LLM", "直接读取音频特征"],
|
|
["回答文本", "内容接口"],
|
|
["TTS", "合成声音"],
|
|
["系统语音", "播放输出", "output"],
|
|
],
|
|
detail:
|
|
"<p><strong>输入端直接理解声音。</strong>模型接收音频特征并生成回答文字,之后由独立 TTS 合成。输入端可以保留语气等线索,输出端仍通过文本接口组织。</p><p>本页以 Ultravox 核心加外接 TTS 作为这一工作定义的例子。</p>",
|
|
},
|
|
native: {
|
|
nodes: [
|
|
["用户语音", "声音输入", "input"],
|
|
["语音表示", "编码或特征"],
|
|
["联合交互模型", "声音与内容建模"],
|
|
["语音解码", "还原波形"],
|
|
["系统语音", "播放输出", "output"],
|
|
],
|
|
detail:
|
|
"<p><strong>语音直接参与内容与声学生成。</strong>编码器、音频 token、文字辅助流和波形解码器可以共同存在,具体组织依模型而异。</p><p>持续听说依赖输入更新方式、因果训练与实时服务。原生语音接口与全双工行为分别核验。</p>",
|
|
},
|
|
};
|
|
|
|
export const benchmarks = [
|
|
{ name: "级联管线", first: 8.78, answer: 10.12 },
|
|
{ name: "Ultravox 0.7", first: 3.88, answer: 8.4 },
|
|
{ name: "GPT-Realtime 1.5", first: 6.36, answer: 6.89 },
|
|
{ name: "Gemini Live 3.1", first: 3.95, answer: 4.25 },
|
|
];
|