mirror of
https://github.com/w-okada/voice-changer.git
synced 2025-02-03 00:33:57 +03:00
WIP:diffusion svc config
This commit is contained in:
parent
01291dc4e3
commit
2c4503ade8
15
client/demo/dist/index.js
vendored
15
client/demo/dist/index.js
vendored
File diff suppressed because one or more lines are too long
@ -0,0 +1,81 @@
|
|||||||
|
import React, { useMemo } from "react";
|
||||||
|
import { useAppState } from "../../../001_provider/001_AppStateProvider";
|
||||||
|
import { DiffusionSVCModelSlot } from "@dannadori/voice-changer-client-js";
|
||||||
|
|
||||||
|
export type DiffusionSVCSettingAreaProps = {};
|
||||||
|
|
||||||
|
export const DiffusionSVCSettingArea = (_props: DiffusionSVCSettingAreaProps) => {
|
||||||
|
const { serverSetting } = useAppState();
|
||||||
|
|
||||||
|
const selected = useMemo(() => {
|
||||||
|
if (serverSetting.serverSetting.modelSlotIndex == undefined) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
return serverSetting.serverSetting.modelSlots[serverSetting.serverSetting.modelSlotIndex];
|
||||||
|
}, [serverSetting.serverSetting.modelSlotIndex, serverSetting.serverSetting.modelSlots]);
|
||||||
|
|
||||||
|
const settingArea = useMemo(() => {
|
||||||
|
if (!selected) {
|
||||||
|
return <></>;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (selected.voiceChangerType != "Diffusion-SVC") {
|
||||||
|
return <></>;
|
||||||
|
}
|
||||||
|
|
||||||
|
const kStepRow = (
|
||||||
|
<div className="character-area-control">
|
||||||
|
<div className="character-area-control-title">k-step:</div>
|
||||||
|
<div className="character-area-control-field">
|
||||||
|
<div className="character-area-slider-control">
|
||||||
|
<span className="character-area-slider-control-kind"></span>
|
||||||
|
<span className="character-area-slider-control-slider">
|
||||||
|
<input
|
||||||
|
type="range"
|
||||||
|
min="0"
|
||||||
|
max={(selected as DiffusionSVCModelSlot).kStepMax}
|
||||||
|
step="1"
|
||||||
|
value={serverSetting.serverSetting.kStep}
|
||||||
|
onChange={(e) => {
|
||||||
|
serverSetting.updateServerSettings({ ...serverSetting.serverSetting, kStep: Number(e.target.value) });
|
||||||
|
}}
|
||||||
|
></input>
|
||||||
|
</span>
|
||||||
|
<span className="character-area-slider-control-val">{serverSetting.serverSetting.kStep}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
const speedUpRow = (
|
||||||
|
<div className="character-area-control">
|
||||||
|
<div className="character-area-control-title">speedup</div>
|
||||||
|
<div className="character-area-control-field">
|
||||||
|
<div className="character-area-slider-control">
|
||||||
|
<span className="character-area-slider-control-kind"></span>
|
||||||
|
<span className="character-area-slider-control-slider">
|
||||||
|
<input
|
||||||
|
type="range"
|
||||||
|
min="0"
|
||||||
|
max={serverSetting.serverSetting.kStep}
|
||||||
|
step="1"
|
||||||
|
value={serverSetting.serverSetting.speedUp}
|
||||||
|
onChange={(e) => {
|
||||||
|
serverSetting.updateServerSettings({ ...serverSetting.serverSetting, speedUp: Number(e.target.value) });
|
||||||
|
}}
|
||||||
|
></input>
|
||||||
|
</span>
|
||||||
|
<span className="character-area-slider-control-val">{serverSetting.serverSetting.speedUp}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{kStepRow}
|
||||||
|
{speedUpRow}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}, [serverSetting.serverSetting, serverSetting.updateServerSettings, selected]);
|
||||||
|
|
||||||
|
return settingArea;
|
||||||
|
};
|
@ -1,88 +1,95 @@
|
|||||||
import React, { useEffect, useMemo, useState } from "react"
|
import React, { useEffect, useMemo, useState } from "react";
|
||||||
import { useAppState } from "../../../001_provider/001_AppStateProvider"
|
import { useAppState } from "../../../001_provider/001_AppStateProvider";
|
||||||
import { useGuiState } from "../001_GuiStateProvider"
|
import { useGuiState } from "../001_GuiStateProvider";
|
||||||
import { OnnxExporterInfo } from "@dannadori/voice-changer-client-js"
|
import { OnnxExporterInfo } from "@dannadori/voice-changer-client-js";
|
||||||
import { useMessageBuilder } from "../../../hooks/useMessageBuilder"
|
import { useMessageBuilder } from "../../../hooks/useMessageBuilder";
|
||||||
import { TuningArea } from "./101-1_TuningArea"
|
import { TuningArea } from "./101-1_TuningArea";
|
||||||
import { IndexArea } from "./101-2_IndexArea"
|
import { IndexArea } from "./101-2_IndexArea";
|
||||||
import { SpeakerArea } from "./101-3_SpeakerArea"
|
import { SpeakerArea } from "./101-3_SpeakerArea";
|
||||||
import { F0FactorArea } from "./101-4_F0FactorArea"
|
import { F0FactorArea } from "./101-4_F0FactorArea";
|
||||||
import { SoVitsSVC40SettingArea } from "./101-5_so-vits-svc40SettingArea"
|
import { SoVitsSVC40SettingArea } from "./101-5_so-vits-svc40SettingArea";
|
||||||
import { DDSPSVC30SettingArea } from "./101-6_ddsp-svc30SettingArea"
|
import { DDSPSVC30SettingArea } from "./101-6_ddsp-svc30SettingArea";
|
||||||
|
import { DiffusionSVCSettingArea } from "./101-7_diffusion-svcSettingArea";
|
||||||
export type CharacterAreaProps = {
|
|
||||||
}
|
|
||||||
|
|
||||||
|
export type CharacterAreaProps = {};
|
||||||
|
|
||||||
export const CharacterArea = (_props: CharacterAreaProps) => {
|
export const CharacterArea = (_props: CharacterAreaProps) => {
|
||||||
const { serverSetting, initializedRef, volume, bufferingTime, performance, setting, setVoiceChangerClientSetting, start, stop } = useAppState()
|
const { serverSetting, initializedRef, volume, bufferingTime, performance, setting, setVoiceChangerClientSetting, start, stop } = useAppState();
|
||||||
const guiState = useGuiState()
|
const guiState = useGuiState();
|
||||||
const messageBuilderState = useMessageBuilder()
|
const messageBuilderState = useMessageBuilder();
|
||||||
|
|
||||||
useMemo(() => {
|
useMemo(() => {
|
||||||
messageBuilderState.setMessage(__filename, "terms_of_use", { "ja": "利用規約", "en": "terms of use" })
|
messageBuilderState.setMessage(__filename, "terms_of_use", { ja: "利用規約", en: "terms of use" });
|
||||||
messageBuilderState.setMessage(__filename, "export_to_onnx", { "ja": "onnx出力", "en": "export to onnx" })
|
messageBuilderState.setMessage(__filename, "export_to_onnx", { ja: "onnx出力", en: "export to onnx" });
|
||||||
messageBuilderState.setMessage(__filename, "save_default", { "ja": "設定保存", "en": "save setting" })
|
messageBuilderState.setMessage(__filename, "save_default", { ja: "設定保存", en: "save setting" });
|
||||||
messageBuilderState.setMessage(__filename, "alert_onnx", { "ja": "ボイチェン中はonnx出力できません", "en": "cannot export onnx when voice conversion is enabled" })
|
messageBuilderState.setMessage(__filename, "alert_onnx", { ja: "ボイチェン中はonnx出力できません", en: "cannot export onnx when voice conversion is enabled" });
|
||||||
}, [])
|
}, []);
|
||||||
|
|
||||||
const selected = useMemo(() => {
|
const selected = useMemo(() => {
|
||||||
if (serverSetting.serverSetting.modelSlotIndex == undefined) {
|
if (serverSetting.serverSetting.modelSlotIndex == undefined) {
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
return serverSetting.serverSetting.modelSlots[serverSetting.serverSetting.modelSlotIndex]
|
return serverSetting.serverSetting.modelSlots[serverSetting.serverSetting.modelSlotIndex];
|
||||||
}, [serverSetting.serverSetting.modelSlotIndex, serverSetting.serverSetting.modelSlots])
|
}, [serverSetting.serverSetting.modelSlotIndex, serverSetting.serverSetting.modelSlots]);
|
||||||
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const vol = document.getElementById("status-vol") as HTMLSpanElement
|
const vol = document.getElementById("status-vol") as HTMLSpanElement;
|
||||||
const buf = document.getElementById("status-buf") as HTMLSpanElement
|
const buf = document.getElementById("status-buf") as HTMLSpanElement;
|
||||||
const res = document.getElementById("status-res") as HTMLSpanElement
|
const res = document.getElementById("status-res") as HTMLSpanElement;
|
||||||
if (!vol || !buf || !res) {
|
if (!vol || !buf || !res) {
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
vol.innerText = volume.toFixed(4)
|
vol.innerText = volume.toFixed(4);
|
||||||
buf.innerText = bufferingTime.toString()
|
buf.innerText = bufferingTime.toString();
|
||||||
res.innerText = performance.responseTime.toString()
|
res.innerText = performance.responseTime.toString();
|
||||||
|
}, [volume, bufferingTime, performance]);
|
||||||
}, [volume, bufferingTime, performance])
|
|
||||||
|
|
||||||
const portrait = useMemo(() => {
|
const portrait = useMemo(() => {
|
||||||
if (!selected) {
|
if (!selected) {
|
||||||
return <></>
|
return <></>;
|
||||||
}
|
}
|
||||||
|
|
||||||
const icon = selected.iconFile.length > 0 ? selected.iconFile : "./assets/icons/human.png"
|
const icon = selected.iconFile.length > 0 ? selected.iconFile : "./assets/icons/human.png";
|
||||||
const selectedTermOfUseUrlLink = selected.termsOfUseUrl ? <a href={selected.termsOfUseUrl} target="_blank" rel="noopener noreferrer" className="portrait-area-terms-of-use-link">[{messageBuilderState.getMessage(__filename, "terms_of_use")}]</a> : <></>
|
const selectedTermOfUseUrlLink = selected.termsOfUseUrl ? (
|
||||||
|
<a href={selected.termsOfUseUrl} target="_blank" rel="noopener noreferrer" className="portrait-area-terms-of-use-link">
|
||||||
|
[{messageBuilderState.getMessage(__filename, "terms_of_use")}]
|
||||||
|
</a>
|
||||||
|
) : (
|
||||||
|
<></>
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="portrait-area">
|
<div className="portrait-area">
|
||||||
<div className="portrait-container">
|
<div className="portrait-container">
|
||||||
<img className="portrait" src={icon} alt={selected.name} />
|
<img className="portrait" src={icon} alt={selected.name} />
|
||||||
<div className="portrait-area-status">
|
<div className="portrait-area-status">
|
||||||
<p><span className="portrait-area-status-vctype">{selected.voiceChangerType}</span></p>
|
<p>
|
||||||
<p>vol: <span id="status-vol">0</span></p>
|
<span className="portrait-area-status-vctype">{selected.voiceChangerType}</span>
|
||||||
<p>buf: <span id="status-buf">0</span> ms</p>
|
</p>
|
||||||
<p>res: <span id="status-res">0</span> ms</p>
|
<p>
|
||||||
|
vol: <span id="status-vol">0</span>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
buf: <span id="status-buf">0</span> ms
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
res: <span id="status-res">0</span> ms
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="portrait-area-terms-of-use">
|
<div className="portrait-area-terms-of-use">{selectedTermOfUseUrlLink}</div>
|
||||||
{selectedTermOfUseUrlLink}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
);
|
||||||
)
|
}, [selected]);
|
||||||
}, [selected])
|
|
||||||
|
|
||||||
|
const [startWithAudioContextCreate, setStartWithAudioContextCreate] = useState<boolean>(false);
|
||||||
const [startWithAudioContextCreate, setStartWithAudioContextCreate] = useState<boolean>(false)
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!startWithAudioContextCreate) {
|
if (!startWithAudioContextCreate) {
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
guiState.setIsConverting(true)
|
guiState.setIsConverting(true);
|
||||||
start()
|
start();
|
||||||
}, [startWithAudioContextCreate])
|
}, [startWithAudioContextCreate]);
|
||||||
|
|
||||||
const startControl = useMemo(() => {
|
const startControl = useMemo(() => {
|
||||||
const onStartClicked = async () => {
|
const onStartClicked = async () => {
|
||||||
@ -90,82 +97,86 @@ export const CharacterArea = (_props: CharacterAreaProps) => {
|
|||||||
if (!initializedRef.current) {
|
if (!initializedRef.current) {
|
||||||
while (true) {
|
while (true) {
|
||||||
await new Promise<void>((resolve) => {
|
await new Promise<void>((resolve) => {
|
||||||
setTimeout(resolve, 500)
|
setTimeout(resolve, 500);
|
||||||
})
|
});
|
||||||
if (initializedRef.current) {
|
if (initializedRef.current) {
|
||||||
break
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setStartWithAudioContextCreate(true)
|
setStartWithAudioContextCreate(true);
|
||||||
} else {
|
} else {
|
||||||
guiState.setIsConverting(true)
|
guiState.setIsConverting(true);
|
||||||
await start()
|
await start();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
serverSetting.updateServerSettings({ ...serverSetting.serverSetting, serverAudioStated: 1 })
|
serverSetting.updateServerSettings({ ...serverSetting.serverSetting, serverAudioStated: 1 });
|
||||||
guiState.setIsConverting(true)
|
guiState.setIsConverting(true);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
};
|
||||||
const onStopClicked = async () => {
|
const onStopClicked = async () => {
|
||||||
if (serverSetting.serverSetting.enableServerAudio == 0) {
|
if (serverSetting.serverSetting.enableServerAudio == 0) {
|
||||||
guiState.setIsConverting(false)
|
guiState.setIsConverting(false);
|
||||||
await stop()
|
await stop();
|
||||||
} else {
|
} else {
|
||||||
guiState.setIsConverting(false)
|
guiState.setIsConverting(false);
|
||||||
serverSetting.updateServerSettings({ ...serverSetting.serverSetting, serverAudioStated: 0 })
|
serverSetting.updateServerSettings({ ...serverSetting.serverSetting, serverAudioStated: 0 });
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
const startClassName = guiState.isConverting ? "character-area-control-button-active" : "character-area-control-button-stanby"
|
const startClassName = guiState.isConverting ? "character-area-control-button-active" : "character-area-control-button-stanby";
|
||||||
const stopClassName = guiState.isConverting ? "character-area-control-button-stanby" : "character-area-control-button-active"
|
const stopClassName = guiState.isConverting ? "character-area-control-button-stanby" : "character-area-control-button-active";
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="character-area-control">
|
<div className="character-area-control">
|
||||||
<div className="character-area-control-buttons">
|
<div className="character-area-control-buttons">
|
||||||
<div onClick={onStartClicked} className={startClassName}>start</div>
|
<div onClick={onStartClicked} className={startClassName}>
|
||||||
<div onClick={onStopClicked} className={stopClassName}>stop</div>
|
start
|
||||||
|
</div>
|
||||||
|
<div onClick={onStopClicked} className={stopClassName}>
|
||||||
|
stop
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)
|
</div>
|
||||||
}, [
|
);
|
||||||
guiState.isConverting,
|
}, [guiState.isConverting, start, stop, serverSetting.serverSetting, serverSetting.updateServerSettings]);
|
||||||
start,
|
|
||||||
stop,
|
|
||||||
serverSetting.serverSetting,
|
|
||||||
serverSetting.updateServerSettings
|
|
||||||
])
|
|
||||||
|
|
||||||
const gainControl = useMemo(() => {
|
const gainControl = useMemo(() => {
|
||||||
const currentInputGain = serverSetting.serverSetting.enableServerAudio == 0 ? setting.voiceChangerClientSetting.inputGain : serverSetting.serverSetting.serverInputAudioGain
|
const currentInputGain = serverSetting.serverSetting.enableServerAudio == 0 ? setting.voiceChangerClientSetting.inputGain : serverSetting.serverSetting.serverInputAudioGain;
|
||||||
const inputValueUpdatedAction = serverSetting.serverSetting.enableServerAudio == 0 ?
|
const inputValueUpdatedAction =
|
||||||
async (val: number) => {
|
serverSetting.serverSetting.enableServerAudio == 0
|
||||||
await setVoiceChangerClientSetting({ ...setting.voiceChangerClientSetting, inputGain: val })
|
? async (val: number) => {
|
||||||
} :
|
await setVoiceChangerClientSetting({ ...setting.voiceChangerClientSetting, inputGain: val });
|
||||||
async (val: number) => {
|
|
||||||
await serverSetting.updateServerSettings({ ...serverSetting.serverSetting, serverInputAudioGain: val })
|
|
||||||
}
|
}
|
||||||
|
: async (val: number) => {
|
||||||
|
await serverSetting.updateServerSettings({ ...serverSetting.serverSetting, serverInputAudioGain: val });
|
||||||
|
};
|
||||||
|
|
||||||
const currentOutputGain = serverSetting.serverSetting.enableServerAudio == 0 ? setting.voiceChangerClientSetting.outputGain : serverSetting.serverSetting.serverOutputAudioGain
|
const currentOutputGain = serverSetting.serverSetting.enableServerAudio == 0 ? setting.voiceChangerClientSetting.outputGain : serverSetting.serverSetting.serverOutputAudioGain;
|
||||||
const outputValueUpdatedAction = serverSetting.serverSetting.enableServerAudio == 0 ?
|
const outputValueUpdatedAction =
|
||||||
async (val: number) => {
|
serverSetting.serverSetting.enableServerAudio == 0
|
||||||
await setVoiceChangerClientSetting({ ...setting.voiceChangerClientSetting, outputGain: val })
|
? async (val: number) => {
|
||||||
} :
|
await setVoiceChangerClientSetting({ ...setting.voiceChangerClientSetting, outputGain: val });
|
||||||
async (val: number) => {
|
|
||||||
await serverSetting.updateServerSettings({ ...serverSetting.serverSetting, serverOutputAudioGain: val })
|
|
||||||
}
|
}
|
||||||
|
: async (val: number) => {
|
||||||
|
await serverSetting.updateServerSettings({ ...serverSetting.serverSetting, serverOutputAudioGain: val });
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="character-area-control">
|
<div className="character-area-control">
|
||||||
<div className="character-area-control-title">
|
<div className="character-area-control-title">GAIN:</div>
|
||||||
GAIN:
|
|
||||||
</div>
|
|
||||||
<div className="character-area-control-field">
|
<div className="character-area-control-field">
|
||||||
<div className="character-area-slider-control">
|
<div className="character-area-slider-control">
|
||||||
<span className="character-area-slider-control-kind">in</span>
|
<span className="character-area-slider-control-kind">in</span>
|
||||||
<span className="character-area-slider-control-slider">
|
<span className="character-area-slider-control-slider">
|
||||||
<input type="range" min="0.1" max="10.0" step="0.1" value={currentInputGain} onChange={(e) => {
|
<input
|
||||||
inputValueUpdatedAction(Number(e.target.value))
|
type="range"
|
||||||
}}></input>
|
min="0.1"
|
||||||
|
max="10.0"
|
||||||
|
step="0.1"
|
||||||
|
value={currentInputGain}
|
||||||
|
onChange={(e) => {
|
||||||
|
inputValueUpdatedAction(Number(e.target.value));
|
||||||
|
}}
|
||||||
|
></input>
|
||||||
</span>
|
</span>
|
||||||
<span className="character-area-slider-control-val">{currentInputGain}</span>
|
<span className="character-area-slider-control-val">{currentInputGain}</span>
|
||||||
</div>
|
</div>
|
||||||
@ -173,64 +184,72 @@ export const CharacterArea = (_props: CharacterAreaProps) => {
|
|||||||
<div className="character-area-slider-control">
|
<div className="character-area-slider-control">
|
||||||
<span className="character-area-slider-control-kind">out</span>
|
<span className="character-area-slider-control-kind">out</span>
|
||||||
<span className="character-area-slider-control-slider">
|
<span className="character-area-slider-control-slider">
|
||||||
<input type="range" min="0.1" max="10.0" step="0.1" value={currentOutputGain} onChange={(e) => {
|
<input
|
||||||
outputValueUpdatedAction(Number(e.target.value))
|
type="range"
|
||||||
}}></input>
|
min="0.1"
|
||||||
|
max="10.0"
|
||||||
|
step="0.1"
|
||||||
|
value={currentOutputGain}
|
||||||
|
onChange={(e) => {
|
||||||
|
outputValueUpdatedAction(Number(e.target.value));
|
||||||
|
}}
|
||||||
|
></input>
|
||||||
</span>
|
</span>
|
||||||
<span className="character-area-slider-control-val">{currentOutputGain}</span>
|
<span className="character-area-slider-control-val">{currentOutputGain}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)
|
);
|
||||||
}, [serverSetting.serverSetting, setting, setVoiceChangerClientSetting, serverSetting.updateServerSettings])
|
}, [serverSetting.serverSetting, setting, setVoiceChangerClientSetting, serverSetting.updateServerSettings]);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const modelSlotControl = useMemo(() => {
|
const modelSlotControl = useMemo(() => {
|
||||||
if (!selected) {
|
if (!selected) {
|
||||||
return <></>
|
return <></>;
|
||||||
}
|
}
|
||||||
const onUpdateDefaultClicked = async () => {
|
const onUpdateDefaultClicked = async () => {
|
||||||
await serverSetting.updateModelDefault()
|
await serverSetting.updateModelDefault();
|
||||||
}
|
};
|
||||||
|
|
||||||
const onnxExportButtonAction = async () => {
|
const onnxExportButtonAction = async () => {
|
||||||
if (guiState.isConverting) {
|
if (guiState.isConverting) {
|
||||||
alert(messageBuilderState.getMessage(__filename, "alert_onnx"))
|
alert(messageBuilderState.getMessage(__filename, "alert_onnx"));
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
document.getElementById("dialog")?.classList.add("dialog-container-show")
|
document.getElementById("dialog")?.classList.add("dialog-container-show");
|
||||||
guiState.stateControls.showWaitingCheckbox.updateState(true)
|
guiState.stateControls.showWaitingCheckbox.updateState(true);
|
||||||
const res = await serverSetting.getOnnx() as OnnxExporterInfo
|
const res = (await serverSetting.getOnnx()) as OnnxExporterInfo;
|
||||||
const a = document.createElement("a")
|
const a = document.createElement("a");
|
||||||
a.href = res.path
|
a.href = res.path;
|
||||||
a.download = res.filename;
|
a.download = res.filename;
|
||||||
document.body.appendChild(a);
|
document.body.appendChild(a);
|
||||||
a.click();
|
a.click();
|
||||||
document.body.removeChild(a);
|
document.body.removeChild(a);
|
||||||
guiState.stateControls.showWaitingCheckbox.updateState(false)
|
guiState.stateControls.showWaitingCheckbox.updateState(false);
|
||||||
|
};
|
||||||
|
|
||||||
}
|
const exportOnnx =
|
||||||
|
selected.voiceChangerType == "RVC" && selected.modelFile.endsWith("pth") ? (
|
||||||
const exportOnnx = selected.voiceChangerType == "RVC" && selected.modelFile.endsWith("pth") ? (
|
<div className="character-area-button" onClick={onnxExportButtonAction}>
|
||||||
<div className="character-area-button" onClick={onnxExportButtonAction}>{messageBuilderState.getMessage(__filename, "export_to_onnx")}</div>
|
{messageBuilderState.getMessage(__filename, "export_to_onnx")}
|
||||||
) : <></>
|
</div>
|
||||||
|
) : (
|
||||||
|
<></>
|
||||||
|
);
|
||||||
return (
|
return (
|
||||||
<div className="character-area-control">
|
<div className="character-area-control">
|
||||||
<div className="character-area-control-title">
|
<div className="character-area-control-title"></div>
|
||||||
|
|
||||||
</div>
|
|
||||||
<div className="character-area-control-field">
|
<div className="character-area-control-field">
|
||||||
<div className="character-area-buttons">
|
<div className="character-area-buttons">
|
||||||
<div className="character-area-button" onClick={onUpdateDefaultClicked}>{messageBuilderState.getMessage(__filename, "save_default")}</div>
|
<div className="character-area-button" onClick={onUpdateDefaultClicked}>
|
||||||
|
{messageBuilderState.getMessage(__filename, "save_default")}
|
||||||
|
</div>
|
||||||
{exportOnnx}
|
{exportOnnx}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)
|
);
|
||||||
}, [selected, serverSetting.getOnnx, serverSetting.updateModelDefault])
|
}, [selected, serverSetting.getOnnx, serverSetting.updateModelDefault]);
|
||||||
|
|
||||||
const characterArea = useMemo(() => {
|
const characterArea = useMemo(() => {
|
||||||
return (
|
return (
|
||||||
@ -245,11 +264,12 @@ export const CharacterArea = (_props: CharacterAreaProps) => {
|
|||||||
<F0FactorArea />
|
<F0FactorArea />
|
||||||
<SoVitsSVC40SettingArea />
|
<SoVitsSVC40SettingArea />
|
||||||
<DDSPSVC30SettingArea />
|
<DDSPSVC30SettingArea />
|
||||||
|
<DiffusionSVCSettingArea />
|
||||||
{modelSlotControl}
|
{modelSlotControl}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)
|
);
|
||||||
}, [portrait, startControl, gainControl, modelSlotControl])
|
}, [portrait, startControl, gainControl, modelSlotControl]);
|
||||||
|
|
||||||
return characterArea
|
return characterArea;
|
||||||
}
|
};
|
||||||
|
@ -122,6 +122,8 @@ export const ServerSettingKey = {
|
|||||||
"kStep": "kStep",
|
"kStep": "kStep",
|
||||||
"threshold": "threshold",
|
"threshold": "threshold",
|
||||||
|
|
||||||
|
"speedUp": "speedUp",
|
||||||
|
|
||||||
"inputSampleRate": "inputSampleRate",
|
"inputSampleRate": "inputSampleRate",
|
||||||
"enableDirectML": "enableDirectML",
|
"enableDirectML": "enableDirectML",
|
||||||
} as const
|
} as const
|
||||||
@ -181,6 +183,9 @@ export type VoiceChangerServerSetting = {
|
|||||||
kStep: number// DDSP-SVC
|
kStep: number// DDSP-SVC
|
||||||
threshold: number// DDSP-SVC
|
threshold: number// DDSP-SVC
|
||||||
|
|
||||||
|
speedUp: number // Diffusion-SVC
|
||||||
|
|
||||||
|
|
||||||
inputSampleRate: InputSampleRate
|
inputSampleRate: InputSampleRate
|
||||||
enableDirectML: number
|
enableDirectML: number
|
||||||
}
|
}
|
||||||
@ -260,7 +265,21 @@ export type DDSPSVCModelSlot = ModelSlot & {
|
|||||||
speakers: { [key: number]: string }
|
speakers: { [key: number]: string }
|
||||||
}
|
}
|
||||||
|
|
||||||
export type ModelSlotUnion = RVCModelSlot | MMVCv13ModelSlot | MMVCv15ModelSlot | SoVitsSvc40ModelSlot | DDSPSVCModelSlot
|
|
||||||
|
export type DiffusionSVCModelSlot = ModelSlot & {
|
||||||
|
modelFile: string
|
||||||
|
dstId: number
|
||||||
|
|
||||||
|
samplingRate: number
|
||||||
|
|
||||||
|
defaultTune: number
|
||||||
|
defaultKstep : number
|
||||||
|
defaultSpeedup: number
|
||||||
|
kStepMax: number
|
||||||
|
speakers: { [key: number]: string }
|
||||||
|
}
|
||||||
|
|
||||||
|
export type ModelSlotUnion = RVCModelSlot | MMVCv13ModelSlot | MMVCv15ModelSlot | SoVitsSvc40ModelSlot | DDSPSVCModelSlot | DiffusionSVCModelSlot
|
||||||
|
|
||||||
type ServerAudioDevice = {
|
type ServerAudioDevice = {
|
||||||
kind: "audioinput" | "audiooutput",
|
kind: "audioinput" | "audiooutput",
|
||||||
@ -362,6 +381,8 @@ export const DefaultServerSetting: ServerInfo = {
|
|||||||
kStep: 120,
|
kStep: 120,
|
||||||
threshold: -45,
|
threshold: -45,
|
||||||
|
|
||||||
|
speedUp: 10,
|
||||||
|
|
||||||
enableDirectML: 0,
|
enableDirectML: 0,
|
||||||
//
|
//
|
||||||
status: "ok",
|
status: "ok",
|
||||||
|
@ -146,6 +146,8 @@ class DiffusionSVC(VoiceChangerModel):
|
|||||||
f0_up_key = self.settings.tran
|
f0_up_key = self.settings.tran
|
||||||
protect = 0
|
protect = 0
|
||||||
|
|
||||||
|
kStep = self.settings.kStep
|
||||||
|
speedUp = self.settings.speedUp
|
||||||
embOutputLayer = 12
|
embOutputLayer = 12
|
||||||
useFinalProj = False
|
useFinalProj = False
|
||||||
silenceFrontSec = self.settings.extraConvertSize / self.slotInfo.samplingRate if self.settings.silenceFront else 0. # extaraConvertSize(既にモデルのサンプリングレートにリサンプリング済み)の秒数。モデルのサンプリングレートで処理(★1)。
|
silenceFrontSec = self.settings.extraConvertSize / self.slotInfo.samplingRate if self.settings.silenceFront else 0. # extaraConvertSize(既にモデルのサンプリングレートにリサンプリング済み)の秒数。モデルのサンプリングレートで処理(★1)。
|
||||||
@ -157,6 +159,8 @@ class DiffusionSVC(VoiceChangerModel):
|
|||||||
pitchf,
|
pitchf,
|
||||||
feature,
|
feature,
|
||||||
f0_up_key,
|
f0_up_key,
|
||||||
|
kStep,
|
||||||
|
speedUp,
|
||||||
silenceFrontSec,
|
silenceFrontSec,
|
||||||
embOutputLayer,
|
embOutputLayer,
|
||||||
useFinalProj,
|
useFinalProj,
|
||||||
|
@ -11,8 +11,8 @@ class DiffusionSVCSettings:
|
|||||||
silentThreshold: float = 0.00001
|
silentThreshold: float = 0.00001
|
||||||
extraConvertSize: int = 1024 * 4
|
extraConvertSize: int = 1024 * 4
|
||||||
|
|
||||||
kstep: int = 20
|
kStep: int = 20
|
||||||
speedup: int = 10
|
speedUp: int = 10
|
||||||
|
|
||||||
silenceFront: int = 1 # 0:off, 1:on
|
silenceFront: int = 1 # 0:off, 1:on
|
||||||
modelSamplingRate: int = 44100
|
modelSamplingRate: int = 44100
|
||||||
@ -26,7 +26,8 @@ class DiffusionSVCSettings:
|
|||||||
"dstId",
|
"dstId",
|
||||||
"tran",
|
"tran",
|
||||||
"extraConvertSize",
|
"extraConvertSize",
|
||||||
"kstep",
|
"kStep",
|
||||||
|
"speedUp",
|
||||||
"silenceFront",
|
"silenceFront",
|
||||||
]
|
]
|
||||||
floatData = ["silentThreshold"]
|
floatData = ["silentThreshold"]
|
||||||
|
@ -105,8 +105,8 @@ class DiffusionSVCInferencer(Inferencer):
|
|||||||
volume: torch.Tensor,
|
volume: torch.Tensor,
|
||||||
mask: torch.Tensor,
|
mask: torch.Tensor,
|
||||||
sid: torch.Tensor,
|
sid: torch.Tensor,
|
||||||
infer_speedup: int,
|
|
||||||
k_step: int,
|
k_step: int,
|
||||||
|
infer_speedup: int,
|
||||||
silence_front: float,
|
silence_front: float,
|
||||||
) -> torch.Tensor:
|
) -> torch.Tensor:
|
||||||
gt_spec = self.naive_model_call(feats, pitch, volume, spk_id=sid, spk_mix_dict=None, aug_shift=0, spk_emb=None)
|
gt_spec = self.naive_model_call(feats, pitch, volume, spk_id=sid, spk_mix_dict=None, aug_shift=0, spk_emb=None)
|
||||||
|
@ -105,6 +105,8 @@ class Pipeline(object):
|
|||||||
pitchf, # np.array [m]
|
pitchf, # np.array [m]
|
||||||
feature, # np.array [m, feat]
|
feature, # np.array [m, feat]
|
||||||
f0_up_key,
|
f0_up_key,
|
||||||
|
k_step,
|
||||||
|
infer_speedup,
|
||||||
silence_front,
|
silence_front,
|
||||||
embOutputLayer,
|
embOutputLayer,
|
||||||
useFinalProj,
|
useFinalProj,
|
||||||
@ -164,8 +166,8 @@ class Pipeline(object):
|
|||||||
volume,
|
volume,
|
||||||
mask,
|
mask,
|
||||||
sid,
|
sid,
|
||||||
infer_speedup=10,
|
k_step,
|
||||||
k_step=20,
|
infer_speedup,
|
||||||
silence_front=silence_front
|
silence_front=silence_front
|
||||||
).to(dtype=torch.float32),
|
).to(dtype=torch.float32),
|
||||||
-1.0,
|
-1.0,
|
||||||
|
Loading…
Reference in New Issue
Block a user