增加语音对话功能
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
import { getPref, setPref } from "../../utils/prefs";
|
||||
import { getString } from "../../utils/locale";
|
||||
import { getHostPlatform } from "../lecture/infrastructure/platform/os";
|
||||
import {
|
||||
TTS_PROVIDER_ORDER,
|
||||
TTS_PROVIDER_PRESETS,
|
||||
getDefaultTtsProviderId,
|
||||
isTtsProviderAvailable,
|
||||
} from "../lecture/infrastructure/tts/providers";
|
||||
|
||||
export function registerLecturePrefsScripts(win: Window) {
|
||||
const doc = win.document;
|
||||
const providerSelect = doc.getElementById(
|
||||
"chatpapers-pref-tts-provider",
|
||||
) as HTMLSelectElement | null;
|
||||
const voiceInput = doc.getElementById(
|
||||
"chatpapers-pref-tts-voice",
|
||||
) as HTMLInputElement | null;
|
||||
const piperPathInput = doc.getElementById(
|
||||
"chatpapers-pref-piper-path",
|
||||
) as HTMLInputElement | null;
|
||||
const piperModelInput = doc.getElementById(
|
||||
"chatpapers-pref-piper-model",
|
||||
) as HTMLInputElement | null;
|
||||
const mineruPathInput = doc.getElementById(
|
||||
"chatpapers-pref-mineru-path",
|
||||
) as HTMLInputElement | null;
|
||||
const hint = doc.getElementById("chatpapers-pref-tts-hint");
|
||||
const piperBox = doc.getElementById("chatpapers-pref-piper-box");
|
||||
|
||||
if (providerSelect && providerSelect.options.length === 0) {
|
||||
for (const id of TTS_PROVIDER_ORDER) {
|
||||
const preset = TTS_PROVIDER_PRESETS[id];
|
||||
if (!isTtsProviderAvailable(preset)) continue;
|
||||
const opt = doc.createElement("option");
|
||||
opt.value = id;
|
||||
opt.textContent = preset.label;
|
||||
providerSelect.appendChild(opt);
|
||||
}
|
||||
const current = getPref("ttsProvider") || getDefaultTtsProviderId();
|
||||
providerSelect.value = current;
|
||||
if (!getPref("ttsProvider")) setPref("ttsProvider", current);
|
||||
}
|
||||
|
||||
const updateHint = () => {
|
||||
const id = providerSelect?.value || getPref("ttsProvider") || "";
|
||||
const preset = TTS_PROVIDER_PRESETS[id as keyof typeof TTS_PROVIDER_PRESETS];
|
||||
if (hint) {
|
||||
hint.textContent = preset?.description || getString("prefs-tts-hint-empty");
|
||||
}
|
||||
if (piperBox) {
|
||||
(piperBox as HTMLElement).hidden = id !== "piper";
|
||||
}
|
||||
if (voiceInput) {
|
||||
const platform = getHostPlatform();
|
||||
voiceInput.placeholder =
|
||||
platform === "mac"
|
||||
? "Ting-Ting(中文)/ Samantha(英文)"
|
||||
: platform === "win"
|
||||
? "Microsoft Huihui Desktop"
|
||||
: "";
|
||||
}
|
||||
};
|
||||
|
||||
providerSelect?.addEventListener("change", () => {
|
||||
setPref("ttsProvider", providerSelect.value);
|
||||
updateHint();
|
||||
});
|
||||
|
||||
voiceInput?.addEventListener("change", () => {
|
||||
setPref("ttsVoice", voiceInput.value);
|
||||
});
|
||||
|
||||
piperPathInput?.addEventListener("change", () => {
|
||||
setPref("piperPath", piperPathInput.value);
|
||||
});
|
||||
|
||||
piperModelInput?.addEventListener("change", () => {
|
||||
setPref("piperModelPath", piperModelInput.value);
|
||||
});
|
||||
|
||||
mineruPathInput?.addEventListener("change", () => {
|
||||
setPref("mineruPath", mineruPathInput.value);
|
||||
});
|
||||
|
||||
updateHint();
|
||||
}
|
||||
Reference in New Issue
Block a user