johnliontw
move all project files to root for Hugging Face Space
610dd27
import { useCallback, useEffect, useState } from "react";
import Select from "react-select";
import { useLiveAPIContext } from "../../contexts/LiveAPIContext";
const voiceOptions = [
{ value: "Puck", label: "Puck" },
{ value: "Charon", label: "Charon" },
{ value: "Kore", label: "Kore" },
{ value: "Fenrir", label: "Fenrir" },
{ value: "Aoede", label: "Aoede" },
];
export default function VoiceSelector() {
const { config, setConfig } = useLiveAPIContext();
useEffect(() => {
const voiceName =
config.generationConfig?.speechConfig?.voiceConfig?.prebuiltVoiceConfig
?.voiceName || "Atari02";
const voiceOption = { value: voiceName, label: voiceName };
setSelectedOption(voiceOption);
}, [config]);
const [selectedOption, setSelectedOption] = useState<{
value: string;
label: string;
} | null>(voiceOptions[5]);
const updateConfig = useCallback(
(voiceName: string) => {
setConfig({
...config,
generationConfig: {
...config.generationConfig,
speechConfig: {
voiceConfig: {
prebuiltVoiceConfig: {
voiceName: voiceName,
},
},
},
},
});
},
[config, setConfig]
);
return (
<div className="select-group">
<label htmlFor="voice-selector">Voice</label>
<Select
id="voice-selector"
className="react-select"
classNamePrefix="react-select"
styles={{
control: (baseStyles) => ({
...baseStyles,
background: "var(--Neutral-15)",
color: "var(--Neutral-90)",
minHeight: "33px",
maxHeight: "33px",
border: 0,
}),
option: (styles, { isFocused, isSelected }) => ({
...styles,
backgroundColor: isFocused
? "var(--Neutral-30)"
: isSelected
? "var(--Neutral-20)"
: undefined,
}),
}}
value={selectedOption}
defaultValue={selectedOption}
options={voiceOptions}
onChange={(e) => {
setSelectedOption(e);
if (e) {
updateConfig(e.value);
}
}}
/>
</div>
);
}