feat: 添加 TTS 引擎配置,更新阿里巴巴语音接口,支持实时语音合成

This commit is contained in:
EvanWu
2025-07-30 21:30:49 +08:00
parent 557a2cce35
commit 9990a89698
9 changed files with 241 additions and 45 deletions

View File

@@ -1293,14 +1293,15 @@ function _Chat() {
setSpeechStatus(false);
} else {
var api: ClientApi;
api = new ClientApi(ModelProvider.GPT);
const config = useAppConfig.getState();
api = new ClientApi(config.ttsConfig.modelProvider);
setSpeechLoading(true);
ttsPlayer.init();
let audioBuffer: ArrayBuffer;
const { markdownToTxt } = require("markdown-to-txt");
const textContent = markdownToTxt(text);
if (config.ttsConfig.engine !== DEFAULT_TTS_ENGINE) {
console.log("[OpenAI Speech] textContent: ", config, textContent);
if (config.ttsConfig.engine === "Edge") {
const edgeVoiceName = accessStore.edgeVoiceName();
const tts = new MsEdgeTTS();
await tts.setMetadata(

View File

@@ -5,13 +5,13 @@ import { ListItem, Select, PasswordInput } from "@/app/components/ui-lib";
import { InputRange } from "@/app/components/input-range";
import { Voice } from "rt-client";
import { ServiceProvider } from "@/app/constant";
import { REALTIME_TTS_MODELS, ServiceProvider } from "@/app/constant";
const providers = [ServiceProvider.OpenAI, ServiceProvider.Azure];
const providers = Object.keys(REALTIME_TTS_MODELS) as ServiceProvider[];
const models = ["gpt-4o-realtime-preview-2024-10-01"];
const models = ["gpt-4o-realtime-preview-2024-10-01", "qwen-tts-realtime"];
const voice = ["alloy", "shimmer", "echo"];
const voice = ["alloy", "shimmer", "echo","Chelsie"];
export function RealtimeConfigList(props: {
realtimeConfig: RealtimeConfig;

View File

@@ -3,10 +3,9 @@ import { TTSConfig, TTSConfigValidator } from "../store";
import Locale from "../locales";
import { ListItem, Select } from "./ui-lib";
import {
DEFAULT_TTS_ENGINE,
DEFAULT_TTS_ENGINES,
DEFAULT_TTS_MODELS,
DEFAULT_TTS_VOICES,
ServiceProvider,
TTS_CONFIGS,
TTSEngineType
} from "../constant";
import { InputRange } from "./input-range";
@@ -48,22 +47,33 @@ export function TTSConfigList(props: {
<Select
value={props.ttsConfig.engine}
onChange={(e) => {
const newEngine = e.currentTarget.value as TTSEngineType;
props.updateConfig(
(config) =>
(config.engine = TTSConfigValidator.engine(
e.currentTarget.value,
)),
(config) => {
config.engine = TTSConfigValidator.engine(newEngine);
const engineConfig = TTS_CONFIGS[newEngine];
config.model = TTSConfigValidator.model(
engineConfig.Model[0] || ""
);
config.voice = TTSConfigValidator.voice(
engineConfig.Voices[0] || ""
);
config.modelProvider = TTSConfigValidator.modelProvider(
engineConfig.ModelProvider
);
}
);
}}
>
{DEFAULT_TTS_ENGINES.map((v, i) => (
{Object.keys(TTS_CONFIGS).map((v, i) => (
<option value={v} key={i}>
{v}
{v}-TTS
</option>
))}
</Select>
</ListItem>
{props.ttsConfig.engine === DEFAULT_TTS_ENGINE && (
{(props.ttsConfig.engine === ServiceProvider.OpenAI ||
props.ttsConfig.engine === ServiceProvider.Alibaba) && (
<>
<ListItem title={Locale.Settings.TTS.Model}>
<Select
@@ -77,7 +87,7 @@ export function TTSConfigList(props: {
);
}}
>
{DEFAULT_TTS_MODELS.map((v, i) => (
{TTS_CONFIGS[props.ttsConfig.engine]!.Model.map((v, i) => (
<option value={v} key={i}>
{v}
</option>
@@ -99,7 +109,7 @@ export function TTSConfigList(props: {
);
}}
>
{DEFAULT_TTS_VOICES.map((v, i) => (
{TTS_CONFIGS[props.ttsConfig.engine]!.Voices.map((v, i) => (
<option value={v} key={i}>
{v}
</option>