主题
实时变声
Convbased.startVoiceChange 采集麦克风音频,协商连接,并按 output 把转换后的音频流接入音频元素或回调。每次调用对应独立会话,返回的会话句柄用于在线调参与结束。
启动会话
ts
import { Convbased } from "@convbased/sdk";
const session = await Convbased.startVoiceChange({
auth,
modelId: "model_xxx",
output: document.querySelector("audio")!,
preferences: { pitch: 0, rms_mix_rate: 0.25 },
onStatus: (status) => console.log(status),
onError: (err) => console.error(err),
});参数:
| 参数 | 类型 | 说明 |
|---|---|---|
auth | SdkAuthentication | 必填。SDK 鉴权配置,见鉴权。 |
modelId | string | 必填。加载的模型 ID。 |
output | HTMLMediaElement | (stream) => void | 转换后的音频去向。传音频元素则设置 srcObject 并尝试播放,播放仍可能受浏览器策略阻止;传回调则自行处理 MediaStream;省略时可读取 session.stream。 |
input | MediaStream | MediaTrackConstraints | boolean | 麦克风约束,或传入已采集的流。 |
preferences | VoicePreferences | 初始调音参数,详见末节。 |
onStatus | (status) => void | 生命周期回调,取值 connecting / live / ended。 |
onError | (err) => void | 会话进入 live 后出现的失败。 |
startVoiceChange() 在服务端报告实时服务就绪后 resolve;连接失败则 reject。resolve 不表示音频元素已获准播放。
会话句柄
ts
session.setPitch(2); // 调音高(半音)
session.update({ formant: 1 }); // 调任意参数,只有传入字段生效
session.setMuted(true); // 静音麦克风
session.mute(); // 等价于 setMuted(true)
session.unmute(); // 等价于 setMuted(false)
session.stream; // 转换后的流,便于自定义音频接线
await session.stop(); // 结束会话并释放麦克风自定义输出
output 传回调可拿到转换后的 MediaStream,接入自己的音频图:
ts
await Convbased.startVoiceChange({
auth,
modelId,
output: (stream) => myAudioGraph.connect(stream),
});复用已有输入流
input 传入已采集的流可跳过取麦克风,便于接降噪、变调等前置管线:
ts
const raw = await navigator.mediaDevices.getUserMedia({ audio: true });
const processed = await applyEffects(raw);
await Convbased.startVoiceChange({ auth, modelId, input: processed });调音参数
preferences 在启动时传入,也可经 session.update() 在线更新,只有传入的字段生效:
pitch、rms_mix_rate、f0_threshold、block_time、crossfade_time、extra_time、f0_autotune、f0_autotune_strength、proposed_pitch、proposed_pitch_threshold、enable_limiter、limiter_threshold、enable_lookahead、lookahead_time、formant、index_rate、protect、threshold。