From 83a450788a8368ccdc8f4a6160bd7cf339a1cc22 Mon Sep 17 00:00:00 2001 From: olivicmic Date: Wed, 16 Aug 2023 17:33:25 -0700 Subject: [PATCH 01/10] added react-spring --- package.json | 1 + packages/fakeyou.com/package.json | 1 + .../common/AudioInput/AudioInput.tsx | 13 +- .../common/ImageInput/ImageInput.tsx | 16 +- packages/fakeyou.com/src/hooks/index.tsx | 3 +- .../fakeyou.com/src/hooks/useHover/index.tsx | 1 + .../src/hooks/useHover/useHover.tsx | 12 ++ .../fakeyou.com/src/resources/baseColors.tsx | 6 + packages/fakeyou.com/src/resources/index.tsx | 3 + .../lipsync/LipsyncEditor/DynamicButton.scss | 0 .../lipsync/LipsyncEditor/DynamicButton.tsx | 26 +++ .../lipsync/LipsyncEditor/LipsyncEditor.scss | 14 +- .../lipsync/LipsyncEditor/LipsyncEditor.tsx | 162 ++++++++++++------ yarn.lock | 60 +++++++ 14 files changed, 259 insertions(+), 59 deletions(-) create mode 100644 packages/fakeyou.com/src/hooks/useHover/index.tsx create mode 100644 packages/fakeyou.com/src/hooks/useHover/useHover.tsx create mode 100644 packages/fakeyou.com/src/resources/baseColors.tsx create mode 100644 packages/fakeyou.com/src/resources/index.tsx create mode 100644 packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/DynamicButton.scss create mode 100644 packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/DynamicButton.tsx diff --git a/package.json b/package.json index f3af4b7f7a..0438a61c5d 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "lerna": "^4.0.0" }, "dependencies": { + "@react-spring/types": "^9.7.3", "yarn": "^1.22.19" }, "packageManager": "yarn@3.3.1" diff --git a/packages/fakeyou.com/package.json b/packages/fakeyou.com/package.json index 5922ec1760..9fc4e93e93 100644 --- a/packages/fakeyou.com/package.json +++ b/packages/fakeyou.com/package.json @@ -15,6 +15,7 @@ "@fortawesome/pro-regular-svg-icons": "^6.2.1", "@fortawesome/pro-solid-svg-icons": "^6.2.1", "@fortawesome/react-fontawesome": "^0.2.0", + "@react-spring/web": "^9.7.3", "@storyteller/components": "0.1.0", "@testing-library/jest-dom": "^4.2.4", "@testing-library/react": "^9.5.0", diff --git a/packages/fakeyou.com/src/components/common/AudioInput/AudioInput.tsx b/packages/fakeyou.com/src/components/common/AudioInput/AudioInput.tsx index 7e90e4312b..7832a388db 100644 --- a/packages/fakeyou.com/src/components/common/AudioInput/AudioInput.tsx +++ b/packages/fakeyou.com/src/components/common/AudioInput/AudioInput.tsx @@ -1,4 +1,5 @@ import React from "react"; +import { a, useSpring } from '@react-spring/web'; import { InputVcAudioPlayer } from "v2/view/_common/InputVcAudioPlayer"; import { FileActions, FileDetails, FileLabel, FileWrapper } from 'components/common'; import { faFileAudio } from "@fortawesome/pro-solid-svg-icons"; @@ -13,6 +14,7 @@ interface Props { hideActions?: boolean; hideClearDetails?: boolean; inputProps?: any; + onRest?: () => void; success?: boolean; submit?: () => void; working?: boolean; @@ -21,16 +23,21 @@ interface Props { const n = () => {}; -export default function AudioInput({ blob = "", clear = n, file, hideActions, hideClearDetails, inputProps, success = false, submit = n, working = false, ...rest }: Props) { +export default function AudioInput({ blob = "", clear = n, file, hideActions, hideClearDetails, inputProps, onRest = n, success = false, submit = n, working = false, ...rest }: Props) { + const style = useSpring({ + config: { mass: 1, tension: 120, friction: 14 }, + onRest, + opacity: file ? 1 : 0 + }); return
{ file ? : } { file && <> -
+ -
+ { !hideActions && } }
; diff --git a/packages/fakeyou.com/src/components/common/ImageInput/ImageInput.tsx b/packages/fakeyou.com/src/components/common/ImageInput/ImageInput.tsx index da03a47a36..a5ec1b2c81 100644 --- a/packages/fakeyou.com/src/components/common/ImageInput/ImageInput.tsx +++ b/packages/fakeyou.com/src/components/common/ImageInput/ImageInput.tsx @@ -1,4 +1,5 @@ -import React from "react"; +import React, { useState } from "react"; +import { a, useSpring } from '@react-spring/web'; import { FileDetails, FileWrapper, FileLabel } from "components/common"; import "./ImageInput.scss"; @@ -11,6 +12,7 @@ interface Props { hideActions?: boolean; hideClearDetails?: boolean; inputProps?: any; + onRest?: () => void; success?: boolean; submit?: () => void; working?: boolean; @@ -19,11 +21,19 @@ interface Props { const n = () => {}; -export default function ImageInput({ blob = "", clear = n, file, hideActions, hideClearDetails, inputProps, success = false, submit = n, working = false, ...rest }: Props) { +export default function ImageInput({ blob = "", clear = n, file, hideActions, hideClearDetails, inputProps, onRest = n, success = false, submit = n, working = false, ...rest }: Props) { + const [loaded,loadedSet] = useState(); + const onLoad = () => loadedSet(1); + const style = useSpring({ + config: { mass: 1, tension: 120, friction: 14 }, + onRest, + opacity: loaded ? 1 : 0 + }); + return
{ file ? <> - + : <> diff --git a/packages/fakeyou.com/src/hooks/index.tsx b/packages/fakeyou.com/src/hooks/index.tsx index bf9bef4f63..cdb304c903 100644 --- a/packages/fakeyou.com/src/hooks/index.tsx +++ b/packages/fakeyou.com/src/hooks/index.tsx @@ -1,5 +1,6 @@ import useFile from './useFile'; +import useHover from './useHover'; import useId from './useId'; import useIdempotency from './useIdempotency'; -export { useFile, useId, useIdempotency }; \ No newline at end of file +export { useFile, useHover, useId, useIdempotency }; \ No newline at end of file diff --git a/packages/fakeyou.com/src/hooks/useHover/index.tsx b/packages/fakeyou.com/src/hooks/useHover/index.tsx new file mode 100644 index 0000000000..fe4049453f --- /dev/null +++ b/packages/fakeyou.com/src/hooks/useHover/index.tsx @@ -0,0 +1 @@ +export { default } from './useHover'; diff --git a/packages/fakeyou.com/src/hooks/useHover/useHover.tsx b/packages/fakeyou.com/src/hooks/useHover/useHover.tsx new file mode 100644 index 0000000000..1b7253eed2 --- /dev/null +++ b/packages/fakeyou.com/src/hooks/useHover/useHover.tsx @@ -0,0 +1,12 @@ +import { useState } from 'react'; + +interface Props { + onMouseEnter?: (e?: any) => void; + onMouseLeave?: (e?: any) => void; +} + +export default function useHover({ onMouseEnter = () => {}, onMouseLeave = () => {} }: Props) { + const [ hover, hoverSet ] = useState(false); + const onHover = (x:boolean) => (e: any) => { hoverSet(x); x ? onMouseEnter(e) : onMouseLeave(e) }; + return [ hover, { onMouseEnter: onHover(true), onMouseLeave: onHover(false)}]; +}; diff --git a/packages/fakeyou.com/src/resources/baseColors.tsx b/packages/fakeyou.com/src/resources/baseColors.tsx new file mode 100644 index 0000000000..173e9de3eb --- /dev/null +++ b/packages/fakeyou.com/src/resources/baseColors.tsx @@ -0,0 +1,6 @@ +const baseColors = { + primary: "#ea7a78", + another: "#e66462", +}; + +export default baseColors; \ No newline at end of file diff --git a/packages/fakeyou.com/src/resources/index.tsx b/packages/fakeyou.com/src/resources/index.tsx new file mode 100644 index 0000000000..5175f238fc --- /dev/null +++ b/packages/fakeyou.com/src/resources/index.tsx @@ -0,0 +1,3 @@ +import baseColors from './baseColors'; + +export { baseColors } \ No newline at end of file diff --git a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/DynamicButton.scss b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/DynamicButton.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/DynamicButton.tsx b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/DynamicButton.tsx new file mode 100644 index 0000000000..0f31513675 --- /dev/null +++ b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/DynamicButton.tsx @@ -0,0 +1,26 @@ +import React from "react"; +import { animated, useSpring } from "@react-spring/web"; +import { useHover } from "hooks"; +import { baseColors } from "resources"; +import "./DynamicButton.scss" + +interface Props { + children?: string|JSX.Element|JSX.Element[]; + className?: string; + disabled?: boolean; + key?: boolean; + [x:string]: any; +} + +export default function DynamicButton({ children, className, disabled, key, ...rest }: Props) { + const [hover, hoverProps = {}] = useHover({}); + const style = useSpring({ + backgroundColor: hover ? baseColors.primary : baseColors.another, + config: { mass: 1, tension: 160, friction: 5 }, + opacity: disabled ? .5 : 1 + }); + + return + { children } + ; +}; \ No newline at end of file diff --git a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.scss b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.scss index dc0825c225..8756df33b1 100644 --- a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.scss +++ b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.scss @@ -47,8 +47,10 @@ .progress-header { display: flex; + flex-wrap: wrap; align-items: center; - margin-bottom: 1rem; + margin: 1rem 0; + // padding: 1rem; .progress-heading { display: inline-block; @@ -70,8 +72,9 @@ } svg { - border: 2px solid #fff; - border-radius: 50%; + // background-color: red; + // border: 2px solid #fff; + // border-radius: 50%; margin-right: .5rem; height: 2rem; width: 2rem; @@ -79,6 +82,11 @@ } } + .progress-description { + margin-top: 1rem; + width: 100%; + } + button { margin: 0 0 0 auto; background-color: #ccccff; diff --git a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx index 17e71c5862..238a3c7bb3 100644 --- a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx +++ b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx @@ -1,75 +1,139 @@ -import React from "react"; +import React, { useState } from "react"; +import { animated, useChain, useSpring, useSpringRef, useTransition } from '@react-spring/web'; import { useFile } from "hooks"; import { AudioInput, ImageInput } from "components/common"; -import { PageHeader } from "components/layout"; +import DynamicButton from './DynamicButton'; import './LipsyncEditor.scss'; -// interface Props { -// audioFile?: any; -// imageFile?: any; -// } +interface LipSyncProps { audioProps: any, imageProps: any, ready: any, style: any }; -const ProgressCheck = ({ disabled = false }: {disabled?: boolean}) => - { !disabled && } -; +const SuccessPage = ({ audioProps, imageProps, style }: LipSyncProps ) => +

+ Lipsync Result +

+ +; + +const InputPage = ({ audioProps, imageProps, ready, style }: LipSyncProps ) => +
+
Image
+
+
+
Audio
+
+
+ ready.image(imageProps.file ? true : false) }}/> +
+
+ ready.audio(audioProps.file ? true : false), hideActions: true } }/> +
+
; + +const WorkingPage = ({ audioProps, imageProps, style }: LipSyncProps ) => + Hi smile :) +; + +const ProgressCheck = ({ disabled = false, refB }: {disabled?: boolean, refB: any }) => { + const style = useSpring({ + config: { mass: 1, tension: 160, friction: 5 }, + // opacity: disabled ? .25 : 1 + }); + return + + { } + ; +}; + +const ProgressLi = ({ children, disabled = false }: { children?: any, disabled?: boolean}) => { + const refA = useSpringRef(); + const refB = useSpringRef(); + useChain([refA, refB]); + const style = useSpring({ + config: { mass: 1, tension: 80, friction: 10 }, + opacity: disabled ? .25 : 1 + }); + return + + { children } + +}; const Title = ({ ...rest }) => { - const { audioFile, imageFile } = rest; - + const { audioProps, audioReady, imageProps, imageReady, submit } = rest; + const noAudio = !audioReady || !audioProps.file; + const noImg = !imageReady || !imageProps.file; + const incomplete = noAudio || noImg; return

- Generate a lipsync + Lip Service

    -
  • - + Image -
  • -
  • - + + Audio -
  • +
- + Generate +

+ Select an image with a clear face, or one of our existing templates, then choose either text to speech or uploaded audio(eg. music). Then you can generate a beautifully lipsynced video. +

}; export default function LipsyncEditor({ ...rest }) { - const audioProps = useFile({ debug: 'audio useFile' }); - const imageProps = useFile({}); - - const subText = "Select an image with a clear face, or one of our existing templates, then choose either text to speech or uploaded audio(eg. music). Then you can generate a beautifully lipsynced video."; + const [imageReady,imageReadySet] = useState(false); + const [audioReady,audioReadySet] = useState(false); + const readyMedia = (m:number,t:boolean) => () => { + console.log("🥒",m,t); + [imageReadySet,audioReadySet][m](t)}; + const onSubmit = async () => true; + const audioProps = useFile({ debug: 'audio useFile',onClear: () => readyMedia(1,false), onSubmit }); + const imageProps = useFile({ onClear: () => readyMedia(0,false), onSubmit }); + console.log("😎",imageReady,audioReady); const headerProps = { - childProps: { audioFile: !audioProps.file, imageFile: !imageProps.file }, - titleComponent: Title, - subText, - showButtons: false + audioProps, + audioReady, + imageProps, + imageReady, + submit: () => { + audioProps.submit(); imageProps.submit(); + } }; + const index = imageProps.success && audioProps.success ? 2 : imageProps.working && audioProps.working ? 1 : 0; + + const transitions = useTransition(index, { + config: { tension: 130, friction: 20 }, + from: { opacity: 0 }, + enter: { opacity: 1 }, + leave: { opacity: 0 }, + }); + return
-
-
-
-
Image
-
-
-
Audio
-
-
- -
-
- -
+ + <div {...{ className: "panel" }}> + { transitions((style, i) => { + const Page = [InputPage,WorkingPage,SuccessPage][i]; + return <Page {...{ + audioProps, + imageProps, + ready: { audio: readyMedia(1,true), image: readyMedia(0,true) }, + style + }}/> + }) } </div> </div> </div>; diff --git a/yarn.lock b/yarn.lock index 9367db1e64..cb19d8d764 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4197,6 +4197,64 @@ __metadata: languageName: node linkType: hard +"@react-spring/animated@npm:~9.7.3": + version: 9.7.3 + resolution: "@react-spring/animated@npm:9.7.3" + dependencies: + "@react-spring/shared": ~9.7.3 + "@react-spring/types": ~9.7.3 + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 468942ca3a11c02c3e56def26b2da9dd10ddbed548004245c4ac309cce00b58d971e781abed67db0d652f72737eaa73766ea9a43b8ef3b08a7ed2eddc04d4c39 + languageName: node + linkType: hard + +"@react-spring/core@npm:~9.7.3": + version: 9.7.3 + resolution: "@react-spring/core@npm:9.7.3" + dependencies: + "@react-spring/animated": ~9.7.3 + "@react-spring/shared": ~9.7.3 + "@react-spring/types": ~9.7.3 + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 8a80a07276458fd14099320eda824e58a11ce3a9b03a5c9cd3f4252adb4d26da04ee5caf5cbc961199f55c2d58a99638d5ea292cdb6aa029208dbab741b5c531 + languageName: node + linkType: hard + +"@react-spring/shared@npm:~9.7.3": + version: 9.7.3 + resolution: "@react-spring/shared@npm:9.7.3" + dependencies: + "@react-spring/types": ~9.7.3 + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 912b5e567eb5345c9a6c8e8c0c2d69b1f411af72a0685b95831809c267c89846a31341ca071f284ace98b3cb5de647054dc76f6ace81d6379513eaf96b52f195 + languageName: node + linkType: hard + +"@react-spring/types@npm:^9.7.3, @react-spring/types@npm:~9.7.3": + version: 9.7.3 + resolution: "@react-spring/types@npm:9.7.3" + checksum: f47b81fe556464aa54a78603311cb584d6a0f03088522229afb058265bbe2ade2095a55ec7f4e960c3b9cceaa5d47865bc41fc6643c0f5f4bd3d8650203d8389 + languageName: node + linkType: hard + +"@react-spring/web@npm:^9.7.3": + version: 9.7.3 + resolution: "@react-spring/web@npm:9.7.3" + dependencies: + "@react-spring/animated": ~9.7.3 + "@react-spring/core": ~9.7.3 + "@react-spring/shared": ~9.7.3 + "@react-spring/types": ~9.7.3 + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 7f5cd05b2314b7f2f715e1926abcf9aa0a539399b222ab34e989144f48350adfcd2edab65d41425570f72c57f602fc6994d6730fbeed902171ac527b630a8a9b + languageName: node + linkType: hard + "@rollup/plugin-babel@npm:^5.2.0": version: 5.3.0 resolution: "@rollup/plugin-babel@npm:5.3.0" @@ -4353,6 +4411,7 @@ __metadata: "@fortawesome/pro-regular-svg-icons": ^6.2.1 "@fortawesome/pro-solid-svg-icons": ^6.2.1 "@fortawesome/react-fontawesome": ^0.2.0 + "@react-spring/web": ^9.7.3 "@storyteller/components": 0.1.0 "@testing-library/jest-dom": ^4.2.4 "@testing-library/react": ^9.5.0 @@ -4498,6 +4557,7 @@ __metadata: version: 0.0.0-use.local resolution: "@storyteller/root@workspace:." dependencies: + "@react-spring/types": ^9.7.3 craco: ^0.0.3 lerna: ^4.0.0 yarn: ^1.22.19 From 5ea62c71c17082c7fa13457772767e87ce6e13c9 Mon Sep 17 00:00:00 2001 From: olivicmic <vic@vics.pics> Date: Fri, 25 Aug 2023 12:28:59 -0700 Subject: [PATCH 02/10] added transitions and spinner --- .../common/AudioInput/AudioInput.scss | 3 + .../common/AudioInput/AudioInput.tsx | 19 +++-- .../common/FileDetails/FileDetails.scss | 1 + .../components/common/Spinner/Spinner.scss | 42 +++++++++++ .../src/components/common/Spinner/Spinner.tsx | 75 +++++++++++++++++++ .../src/components/common/Spinner/index.tsx | 1 + .../src/components/common/index.tsx | 4 +- .../fakeyou.com/src/hooks/useFile/useFile.tsx | 4 +- .../lipsync/LipsyncEditor/LipsyncEditor.tsx | 41 ++++++---- 9 files changed, 163 insertions(+), 27 deletions(-) create mode 100644 packages/fakeyou.com/src/components/common/Spinner/Spinner.scss create mode 100644 packages/fakeyou.com/src/components/common/Spinner/Spinner.tsx create mode 100644 packages/fakeyou.com/src/components/common/Spinner/index.tsx diff --git a/packages/fakeyou.com/src/components/common/AudioInput/AudioInput.scss b/packages/fakeyou.com/src/components/common/AudioInput/AudioInput.scss index 73d95b4aad..4b3be6ba31 100644 --- a/packages/fakeyou.com/src/components/common/AudioInput/AudioInput.scss +++ b/packages/fakeyou.com/src/components/common/AudioInput/AudioInput.scss @@ -1 +1,4 @@ +.fy-audio-uploader { + // .audio-details { position: absolute; } +} .fy-audio-uploader > div { margin-bottom: 1rem } \ No newline at end of file diff --git a/packages/fakeyou.com/src/components/common/AudioInput/AudioInput.tsx b/packages/fakeyou.com/src/components/common/AudioInput/AudioInput.tsx index 7832a388db..5531fbe7af 100644 --- a/packages/fakeyou.com/src/components/common/AudioInput/AudioInput.tsx +++ b/packages/fakeyou.com/src/components/common/AudioInput/AudioInput.tsx @@ -1,5 +1,5 @@ import React from "react"; -import { a, useSpring } from '@react-spring/web'; +import { a, useSpring, useTransition } from '@react-spring/web'; import { InputVcAudioPlayer } from "v2/view/_common/InputVcAudioPlayer"; import { FileActions, FileDetails, FileLabel, FileWrapper } from 'components/common'; import { faFileAudio } from "@fortawesome/pro-solid-svg-icons"; @@ -24,21 +24,24 @@ interface Props { const n = () => {}; export default function AudioInput({ blob = "", clear = n, file, hideActions, hideClearDetails, inputProps, onRest = n, success = false, submit = n, working = false, ...rest }: Props) { - const style = useSpring({ - config: { mass: 1, tension: 120, friction: 14 }, + + const transitions = useTransition(file, { + config: { tension: 120, friction: 15 }, + from: { opacity: 0 }, + enter: { opacity: 1 }, + leave: { opacity: 0 }, onRest, - opacity: file ? 1 : 0 }); return <div {...{ className: "fy-audio-uploader" }}> <FileWrapper {...{ fileTypes, ...inputProps, panelClass: "p-3", ...rest }}> { file ? <FileDetails {...{ clear, hideClearDetails, icon: faFileAudio, file }}/> : <FileLabel {...{ fileTypes }}/> } </FileWrapper> - { file && <> - <a.div {...{ className: "panel panel-inner rounded p-3", style }}> + { transitions((style, i) => i ? <a.div {...{ className: "audio-details", style }}> + <div {...{ className: "panel panel-inner rounded p-3" }}> <InputVcAudioPlayer {...{ filename: blob as string }}/> - </a.div> + </div> { !hideActions && <FileActions {...{ clear, success, submit, working }}/> } - </> } + </a.div> : null ) } </div>; }; \ No newline at end of file diff --git a/packages/fakeyou.com/src/components/common/FileDetails/FileDetails.scss b/packages/fakeyou.com/src/components/common/FileDetails/FileDetails.scss index 1f5d412f66..2ad348abd1 100644 --- a/packages/fakeyou.com/src/components/common/FileDetails/FileDetails.scss +++ b/packages/fakeyou.com/src/components/common/FileDetails/FileDetails.scss @@ -1,4 +1,5 @@ .upload-details { + position: relative; width: 100%; .upload-details-clear { diff --git a/packages/fakeyou.com/src/components/common/Spinner/Spinner.scss b/packages/fakeyou.com/src/components/common/Spinner/Spinner.scss new file mode 100644 index 0000000000..eeed408dbd --- /dev/null +++ b/packages/fakeyou.com/src/components/common/Spinner/Spinner.scss @@ -0,0 +1,42 @@ +@mixin rtl($which, $step) { + &:nth-child($which) { animation-delay: $step;} +} + + +.fy-spinner { + stroke: white; + stroke-width: 2px; + + polyline { + transform-origin: 16px 16px; + animation: feder 1s linear infinite; + + &:nth-child(2) { animation-delay: .0833s;} + &:nth-child(3) { animation-delay: .1667s;} + &:nth-child(4) { animation-delay: .25s;} + &:nth-child(5) { animation-delay: .33s;} + &:nth-child(6) { animation-delay: .4167s;} + &:nth-child(7) { animation-delay: .5s;} + &:nth-child(8) { animation-delay: .5833s;} + &:nth-child(9) { animation-delay: .66s;} + &:nth-child(10) { animation-delay: .75s;} + &:nth-child(11) { animation-delay: .833s;} + &:nth-child(12) { animation-delay: .9167s;} + } +} + +@keyframes feder { + 0% { + opacity: 0; + } + 10% { + opacity: 1; + } + 35% { + opacity: .25; + } + 100% { + opacity: 0; + } +} + diff --git a/packages/fakeyou.com/src/components/common/Spinner/Spinner.tsx b/packages/fakeyou.com/src/components/common/Spinner/Spinner.tsx new file mode 100644 index 0000000000..51ae5310d7 --- /dev/null +++ b/packages/fakeyou.com/src/components/common/Spinner/Spinner.tsx @@ -0,0 +1,75 @@ +import React, { useEffect } from "react"; + +import { a, useTrail, useSprings, SpringValue } from '@react-spring/web'; +import "./Spinner.scss"; + +const allCoords = [ + [16,8,16,2], + [20,9.0718,23,3.8756], + [22.9282,12,28.1244,9], + [24,16,30,16], + [22.9282,20,28.1244,23], + [20,22.9282,23,28.1244], + [16,24,16,30], + [12,22.9282,9,28.1244], + [9.0718,20,3.8756,23], + [9,16,2,16], + [9.0718,12,3.8756,9], + [12,9.0718,9,3.8756], +]; + +// const Line = ({ style, yah }:{ style: any, yah: any }) => { +// const { base, opacity, coords } = style; +// const jam = opacity.to((x: any) => { console.log("😎", x); return `16 8 16 ${ 2 * x }`; }); +// console.log("😎", opacity); +// return <a.polyline {...{ +// fill: 'none', +// points: jam, +// strokeLinecap: 'round', +// strokeLinejoin: 'round', +// strokeWidth: '3', +// style: { opacity: opacity.to((x: any) => x < .5 ? x : .5 - (x - .5) )}, +// transform: `rotate(${ 30 * yah })`, +// }}/> +// }; + + +const Line = ({ style, yah }:{ style: any, yah: any }) => { + console.log("😎", yah); + return <a.polyline {...{ + fill: 'none', + points: `16 8 16 2`, + strokeLinecap: 'round', + strokeLinejoin: 'round', + strokeWidth: '3', + transform: `rotate(${ 30 * yah })`, + }}/> +}; + +export default function Spinner() { + const yah = (s: number) => ({ + base: s ? 0 : 1000, + coords: `16 8 16 ${2 + s}`, + opacity: s ? 0 : 1 + }); + const [ spinLines, api ] = useTrail(12, (num: any, telpe) => { + return { + config: { duration: 250 }, + delay: 0, + loop: { reverse: true, delay: 250 * num }, + reset: true, + from: yah(5), + to: yah(0), + onRest: () => console.log('🔥',telpe) + } + }); + + // api.start(); + + return <svg {...{ className: "fy-spinner", height: 32, viewBox: "0 0 32 32", width: 32 }}> + { spinLines.map((style: any, key: number) => { + console.log("👤",style,key,style[key]); + return <Line {...{ key, yah: key, style: style }}/> + }) } +</svg>; +}; \ No newline at end of file diff --git a/packages/fakeyou.com/src/components/common/Spinner/index.tsx b/packages/fakeyou.com/src/components/common/Spinner/index.tsx new file mode 100644 index 0000000000..f90663a519 --- /dev/null +++ b/packages/fakeyou.com/src/components/common/Spinner/index.tsx @@ -0,0 +1 @@ +export { default } from './Spinner'; diff --git a/packages/fakeyou.com/src/components/common/index.tsx b/packages/fakeyou.com/src/components/common/index.tsx index 5e570e82e2..fc02269cf2 100644 --- a/packages/fakeyou.com/src/components/common/index.tsx +++ b/packages/fakeyou.com/src/components/common/index.tsx @@ -4,6 +4,7 @@ import FileActions from './FileActions'; import FileDetails from './FileDetails'; import FileWrapper from './FileWrapper'; import FileLabel from './FileLabel'; +import Spinner from './Spinner'; export { AudioInput, @@ -11,5 +12,6 @@ export { FileActions, FileDetails, FileWrapper, - FileLabel + FileLabel, + Spinner }; \ No newline at end of file diff --git a/packages/fakeyou.com/src/hooks/useFile/useFile.tsx b/packages/fakeyou.com/src/hooks/useFile/useFile.tsx index 97f94ca62f..a513bccd89 100644 --- a/packages/fakeyou.com/src/hooks/useFile/useFile.tsx +++ b/packages/fakeyou.com/src/hooks/useFile/useFile.tsx @@ -6,7 +6,7 @@ interface Props { debug?: any; onChange?: (file: any) => void; onClear?: (x?: any) => void; - onSubmit?: (file: any) => Promise<boolean>; + onSubmit?: (file: any) => Promise<boolean | undefined> | Promise<void>; } export default function useFile({ debug, onChange = n, onClear = n, onSubmit = n }: Props) { @@ -18,8 +18,8 @@ export default function useFile({ debug, onChange = n, onClear = n, onSubmit = n const submit = async () => { if (file === undefined) { return false; } - const onUploadResult = await onSubmit(file); workingSet(true); + const onUploadResult = await onSubmit(file); if (onUploadResult) { successSet(true); } else successSet(false); }; diff --git a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx index 238a3c7bb3..9e1f147c23 100644 --- a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx +++ b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx @@ -1,11 +1,11 @@ import React, { useState } from "react"; import { animated, useChain, useSpring, useSpringRef, useTransition } from '@react-spring/web'; import { useFile } from "hooks"; -import { AudioInput, ImageInput } from "components/common"; +import { AudioInput, ImageInput, Spinner } from "components/common"; import DynamicButton from './DynamicButton'; import './LipsyncEditor.scss'; -interface LipSyncProps { audioProps: any, imageProps: any, ready: any, style: any }; +interface LipSyncProps { audioProps: any, imageProps: any, toggle: any, style: any }; const SuccessPage = ({ audioProps, imageProps, style }: LipSyncProps ) => <animated.div {...{ className: "lipsync-success", style }}> <h1 className=" fw-bold text-center text-lg-start"> @@ -17,7 +17,9 @@ const SuccessPage = ({ audioProps, imageProps, style }: LipSyncProps ) => <anim </video> </animated.div>; -const InputPage = ({ audioProps, imageProps, ready, style }: LipSyncProps ) => <animated.div {...{ className: "lipsync-editor", style }}> +const InputPage = ({ audioProps, imageProps, toggle, style }: LipSyncProps ) => { + + return <animated.div {...{ className: "lipsync-editor", style }}> <div {...{ className: "grid-heading" }}> <h5>Image</h5> </div> @@ -25,15 +27,19 @@ const InputPage = ({ audioProps, imageProps, ready, style }: LipSyncProps ) => <h5>Audio</h5> </div> <div {...{ className: "grid-square lipsync-audio" }}> - <ImageInput {...{ ...imageProps, onRest: () => ready.image(imageProps.file ? true : false) }}/> + <ImageInput {...{ ...imageProps, onRest: () => toggle.image(imageProps.file ? true : false) }}/> </div> <div {...{ className: "grid-square" }}> - <AudioInput {...{ ...audioProps, onRest: () => ready.audio(audioProps.file ? true : false), hideActions: true } }/> + <AudioInput {...{ ...audioProps, onRest: (p:any,c:any,item:any,l:any) => { + console.log("🍑",!!audioProps.file); + toggle.audio(!!audioProps.file); + }, hideActions: true } }/> + <Spinner /> </div> -</animated.div>; +</animated.div>}; const WorkingPage = ({ audioProps, imageProps, style }: LipSyncProps ) => <animated.div {...{ className: "lipsync-editor", style }}> - Hi smile :) + <Spinner/> </animated.div>; const ProgressCheck = ({ disabled = false, refB }: {disabled?: boolean, refB: any }) => { @@ -45,7 +51,6 @@ const ProgressCheck = ({ disabled = false, refB }: {disabled?: boolean, refB: an <circle {...{ cx: 16, cy: 16, r: 15, strokeWidth: "2", }}/> { <polyline {...{ fill: 'none', - // points: '7 16 12 20 20 10', points: '9.5 18 14.5 22 22.5 12', strokeLinecap: 'round', strokeLinejoin: 'round', @@ -95,13 +100,17 @@ const Title = ({ ...rest }) => { export default function LipsyncEditor({ ...rest }) { const [imageReady,imageReadySet] = useState<boolean>(false); const [audioReady,audioReadySet] = useState<boolean>(false); - const readyMedia = (m:number,t:boolean) => () => { - console.log("🥒",m,t); - [imageReadySet,audioReadySet][m](t)}; - const onSubmit = async () => true; - const audioProps = useFile({ debug: 'audio useFile',onClear: () => readyMedia(1,false), onSubmit }); - const imageProps = useFile({ onClear: () => readyMedia(0,false), onSubmit }); - console.log("😎",imageReady,audioReady); + const readyMedia = (m:number) => (t:boolean) => [imageReadySet,audioReadySet][m](t); + const onSubmit = async () => { + await new Promise(resolve => { + setTimeout(function () { + resolve(); + }, 6000); + }); + return true; + }; + const audioProps = useFile({ debug: 'audio useFile', onSubmit }); + const imageProps = useFile({ onSubmit }); const headerProps = { audioProps, audioReady, @@ -130,7 +139,7 @@ export default function LipsyncEditor({ ...rest }) { return <Page {...{ audioProps, imageProps, - ready: { audio: readyMedia(1,true), image: readyMedia(0,true) }, + toggle: { audio: readyMedia(1), image: readyMedia(0) }, style }}/> }) } From 78dadbf026a04b318ce57c7daf1676273f663e9d Mon Sep 17 00:00:00 2001 From: olivicmic <vic@vics.pics> Date: Tue, 29 Aug 2023 11:33:46 -0700 Subject: [PATCH 03/10] transitions over entire flow working --- .../common/ImageInput/ImageInput.scss | 7 +- .../components/common/Spinner/Spinner.scss | 5 +- .../src/components/common/Spinner/Spinner.tsx | 66 +------------- .../fakeyou.com/src/hooks/useFile/useFile.tsx | 17 ++-- .../lipsync/LipsyncEditor/DynamicButton.scss | 15 ++++ .../lipsync/LipsyncEditor/DynamicButton.tsx | 23 +++-- .../lipsync/LipsyncEditor/LipsyncEditor.scss | 37 +++++--- .../lipsync/LipsyncEditor/LipsyncEditor.tsx | 90 ++++++++++--------- 8 files changed, 123 insertions(+), 137 deletions(-) diff --git a/packages/fakeyou.com/src/components/common/ImageInput/ImageInput.scss b/packages/fakeyou.com/src/components/common/ImageInput/ImageInput.scss index 1ed9219673..aec912d70b 100644 --- a/packages/fakeyou.com/src/components/common/ImageInput/ImageInput.scss +++ b/packages/fakeyou.com/src/components/common/ImageInput/ImageInput.scss @@ -27,9 +27,10 @@ } .upload-details { - top: 1rem; - left: 1rem; - width: calc(100% - 2rem); + top: 0; + width: 100%; + padding: 1rem; + border-radius: 0; } .image-placeholder { diff --git a/packages/fakeyou.com/src/components/common/Spinner/Spinner.scss b/packages/fakeyou.com/src/components/common/Spinner/Spinner.scss index eeed408dbd..798e721bab 100644 --- a/packages/fakeyou.com/src/components/common/Spinner/Spinner.scss +++ b/packages/fakeyou.com/src/components/common/Spinner/Spinner.scss @@ -7,9 +7,10 @@ stroke: white; stroke-width: 2px; - polyline { + polyline { transform-origin: 16px 16px; animation: feder 1s linear infinite; + stroke-dasharray: 6; &:nth-child(2) { animation-delay: .0833s;} &:nth-child(3) { animation-delay: .1667s;} @@ -27,6 +28,7 @@ @keyframes feder { 0% { + stroke-dashoffset: 0; opacity: 0; } 10% { @@ -36,6 +38,7 @@ opacity: .25; } 100% { + stroke-dashoffset: 6; opacity: 0; } } diff --git a/packages/fakeyou.com/src/components/common/Spinner/Spinner.tsx b/packages/fakeyou.com/src/components/common/Spinner/Spinner.tsx index 51ae5310d7..e6ffa715e8 100644 --- a/packages/fakeyou.com/src/components/common/Spinner/Spinner.tsx +++ b/packages/fakeyou.com/src/components/common/Spinner/Spinner.tsx @@ -1,75 +1,17 @@ -import React, { useEffect } from "react"; - -import { a, useTrail, useSprings, SpringValue } from '@react-spring/web'; +import React from "react"; import "./Spinner.scss"; -const allCoords = [ - [16,8,16,2], - [20,9.0718,23,3.8756], - [22.9282,12,28.1244,9], - [24,16,30,16], - [22.9282,20,28.1244,23], - [20,22.9282,23,28.1244], - [16,24,16,30], - [12,22.9282,9,28.1244], - [9.0718,20,3.8756,23], - [9,16,2,16], - [9.0718,12,3.8756,9], - [12,9.0718,9,3.8756], -]; - -// const Line = ({ style, yah }:{ style: any, yah: any }) => { -// const { base, opacity, coords } = style; -// const jam = opacity.to((x: any) => { console.log("😎", x); return `16 8 16 ${ 2 * x }`; }); -// console.log("😎", opacity); -// return <a.polyline {...{ -// fill: 'none', -// points: jam, -// strokeLinecap: 'round', -// strokeLinejoin: 'round', -// strokeWidth: '3', -// style: { opacity: opacity.to((x: any) => x < .5 ? x : .5 - (x - .5) )}, -// transform: `rotate(${ 30 * yah })`, -// }}/> -// }; - - -const Line = ({ style, yah }:{ style: any, yah: any }) => { - console.log("😎", yah); - return <a.polyline {...{ +const Line = ({ yah }:{ yah: any }) => <polyline {...{ fill: 'none', points: `16 8 16 2`, strokeLinecap: 'round', strokeLinejoin: 'round', strokeWidth: '3', transform: `rotate(${ 30 * yah })`, - }}/> -}; + }}/>; export default function Spinner() { - const yah = (s: number) => ({ - base: s ? 0 : 1000, - coords: `16 8 16 ${2 + s}`, - opacity: s ? 0 : 1 - }); - const [ spinLines, api ] = useTrail(12, (num: any, telpe) => { - return { - config: { duration: 250 }, - delay: 0, - loop: { reverse: true, delay: 250 * num }, - reset: true, - from: yah(5), - to: yah(0), - onRest: () => console.log('🔥',telpe) - } - }); - - // api.start(); - return <svg {...{ className: "fy-spinner", height: 32, viewBox: "0 0 32 32", width: 32 }}> - { spinLines.map((style: any, key: number) => { - console.log("👤",style,key,style[key]); - return <Line {...{ key, yah: key, style: style }}/> - }) } + { [...Array(12)].map((l,key) => <Line {...{ key, yah: key }}/>) } </svg>; }; \ No newline at end of file diff --git a/packages/fakeyou.com/src/hooks/useFile/useFile.tsx b/packages/fakeyou.com/src/hooks/useFile/useFile.tsx index a513bccd89..82b84c39bb 100644 --- a/packages/fakeyou.com/src/hooks/useFile/useFile.tsx +++ b/packages/fakeyou.com/src/hooks/useFile/useFile.tsx @@ -12,22 +12,21 @@ interface Props { export default function useFile({ debug, onChange = n, onClear = n, onSubmit = n }: Props) { const [file, fileSet] = useState<any>(undefined); const [blob, blobSet] = useState<string>(); - const [working, workingSet] = useState(false); - const [success, successSet] = useState<boolean>(false); + const [status, statusSet] = useState<number>(0); const inputRef = useRef<HTMLInputElement>(null); const submit = async () => { if (file === undefined) { return false; } - workingSet(true); + statusSet(1); const onUploadResult = await onSubmit(file); - if (onUploadResult) { successSet(true); } - else successSet(false); + if (onUploadResult) { statusSet(2); } + else { statusSet(3); } }; const fileChange = (inputFile?: any) => { onChange(file); fileSet(inputFile || null); blobSet(inputFile ? URL.createObjectURL(inputFile) : ""); - successSet(false); + statusSet(0); }; const inputChange = ({ target = {} }: { target: any }) => { fileChange(target.value); @@ -36,6 +35,7 @@ export default function useFile({ debug, onChange = n, onClear = n, onSubmit = n if (inputRef?.current?.value) inputRef.current.value = ''; fileChange(); onClear(); + statusSet(0); }; return { @@ -46,8 +46,9 @@ export default function useFile({ debug, onChange = n, onClear = n, onSubmit = n onChange: inputChange, inputRef }, + status, submit, - success, - working, + success: status === 2, + working: status === 1, }; }; \ No newline at end of file diff --git a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/DynamicButton.scss b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/DynamicButton.scss index e69de29bb2..2717fc499d 100644 --- a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/DynamicButton.scss +++ b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/DynamicButton.scss @@ -0,0 +1,15 @@ +.fy-dynamic-button { + height: 3rem; + appearance: none; + border-radius: 0.5rem; + border: none; + color: #fff; + outline: none; + padding: 10px 20px; + position: relative; + + .button-slide { + // position: absolute; + width: fit-content; + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/DynamicButton.tsx b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/DynamicButton.tsx index 0f31513675..ed4ba08426 100644 --- a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/DynamicButton.tsx +++ b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/DynamicButton.tsx @@ -1,5 +1,5 @@ import React from "react"; -import { animated, useSpring } from "@react-spring/web"; +import { a, useSpring, useTransition } from "@react-spring/web"; import { useHover } from "hooks"; import { baseColors } from "resources"; import "./DynamicButton.scss" @@ -7,20 +7,29 @@ import "./DynamicButton.scss" interface Props { children?: string|JSX.Element|JSX.Element[]; className?: string; - disabled?: boolean; +disabled?: boolean; key?: boolean; [x:string]: any; } -export default function DynamicButton({ children, className, disabled, key, ...rest }: Props) { +export default function DynamicButton({ children, className, disabled, index = 0, key, slides = [], ...rest }: Props) { const [hover, hoverProps = {}] = useHover({}); const style = useSpring({ backgroundColor: hover ? baseColors.primary : baseColors.another, - config: { mass: 1, tension: 160, friction: 5 }, + config: { tension: 130, friction: 20 }, opacity: disabled ? .5 : 1 }); - return <animated.button {...{ className: `btn`, disabled, style, ...hoverProps, ...rest }}> - { children } - </animated.button>; + const transitions = useTransition(slides, { + config: { tension: 130, friction: 20 }, + from: { opacity: 0 }, + enter: { opacity: 1 }, + leave: { opacity: 0 }, + }); + + return <a.button {...{ className: `fy-dynamic-button`, disabled, style, ...hoverProps, ...rest }}> + { transitions((contentStyle, content, s, i) => + index === i ? <a.div {...{ className: `button-slide ${i}`, style: contentStyle }}>{ content }</a.div> : null + ) } + </a.button>; }; \ No newline at end of file diff --git a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.scss b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.scss index 8756df33b1..ee3a9dfe82 100644 --- a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.scss +++ b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.scss @@ -27,18 +27,10 @@ .grid-square { aspect-ratio: 1; padding-bottom: 1rem; - // &:nth-child(odd) { - // padding-left: 1rem; - // } - // &:nth-child(even) { - // padding-right: 1rem; - // } + + .fy-uploader { height: 100% } } - - - - // div.grid-square { aspect-ratio: 1 } .fy-image-uploader { height: 100%; } .lipsync-audio { label { height: 100% } @@ -49,8 +41,8 @@ display: flex; flex-wrap: wrap; align-items: center; - margin: 1rem 0; - // padding: 1rem; + // margin: 1rem 0; + padding: 1rem; .progress-heading { display: inline-block; @@ -93,4 +85,25 @@ // flex-grow: 1; width: fit-content; } +} + +.lipsync-panel { position: relative; height: fit-content; } + +// .lipsync-editor, .lipsync-working, .lipsync-success { +// position: absolute; +// } + +.lipsync-working, .lipsync-working-notice { + display: flex; + align-items: center; + justify-content: center; +} + +.lipsync-working-notice { + flex-direction: column; + margin: 5rem; +} + +.lipsync-success { + padding: .5rem 1rem 1rem; } \ No newline at end of file diff --git a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx index 9e1f147c23..e0874cc5ff 100644 --- a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx +++ b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx @@ -1,5 +1,5 @@ import React, { useState } from "react"; -import { animated, useChain, useSpring, useSpringRef, useTransition } from '@react-spring/web'; +import { animated, useSpring, useTransition } from '@react-spring/web'; import { useFile } from "hooks"; import { AudioInput, ImageInput, Spinner } from "components/common"; import DynamicButton from './DynamicButton'; @@ -7,10 +7,12 @@ import './LipsyncEditor.scss'; interface LipSyncProps { audioProps: any, imageProps: any, toggle: any, style: any }; +const softSpring = { config: { mass: 1, tension: 80, friction: 10 } } + const SuccessPage = ({ audioProps, imageProps, style }: LipSyncProps ) => <animated.div {...{ className: "lipsync-success", style }}> - <h1 className=" fw-bold text-center text-lg-start"> - Lipsync Result - </h1> + <h3 className=" fw-bold text-center text-lg-start"> + Result + </h3> <video width="100%" height="auto" controls={true} className="rounded"> <source src="https://pics.vics.pics/3027969248.mp4" /> Your device doesn't support video. @@ -31,53 +33,53 @@ const InputPage = ({ audioProps, imageProps, toggle, style }: LipSyncProps ) => </div> <div {...{ className: "grid-square" }}> <AudioInput {...{ ...audioProps, onRest: (p:any,c:any,item:any,l:any) => { - console.log("🍑",!!audioProps.file); toggle.audio(!!audioProps.file); }, hideActions: true } }/> - <Spinner /> </div> </animated.div>}; -const WorkingPage = ({ audioProps, imageProps, style }: LipSyncProps ) => <animated.div {...{ className: "lipsync-editor", style }}> - <Spinner/> +const WorkingPage = ({ audioProps, imageProps, style }: LipSyncProps ) => <animated.div {...{ className: "lipsync-working", style }}> + <div {...{ className: "lipsync-working-notice" }}> + <h2>Working ...</h2> + <Spinner /> + </div> </animated.div>; -const ProgressCheck = ({ disabled = false, refB }: {disabled?: boolean, refB: any }) => { +const ProgressLi = ({ children, disabled = false }: { children?: any, disabled?: boolean }) => { const style = useSpring({ - config: { mass: 1, tension: 160, friction: 5 }, - // opacity: disabled ? .25 : 1 - }); - return <animated.svg {...{ style }}> - <circle {...{ cx: 16, cy: 16, r: 15, strokeWidth: "2", }}/> - { <polyline {...{ - fill: 'none', - points: '9.5 18 14.5 22 22.5 12', - strokeLinecap: 'round', - strokeLinejoin: 'round', - strokeWidth: '4', - }}/> } - </animated.svg>; -}; - -const ProgressLi = ({ children, disabled = false }: { children?: any, disabled?: boolean}) => { - const refA = useSpringRef(); - const refB = useSpringRef(); - useChain([refA, refB]); - const style = useSpring({ - config: { mass: 1, tension: 80, friction: 10 }, + ...softSpring, opacity: disabled ? .25 : 1 }); return <animated.li {...{ style }}> - <ProgressCheck {...{ disabled, refB }}/> + <svg> + <circle {...{ cx: 16, cy: 16, r: 15, strokeWidth: "2", }}/> + { <polyline {...{ + fill: 'none', + points: '9.5 18 14.5 22 22.5 12', + strokeLinecap: 'round', + strokeLinejoin: 'round', + strokeWidth: '4', + }}/> } + </svg> { children } </animated.li> }; const Title = ({ ...rest }) => { - const { audioProps, audioReady, imageProps, imageReady, submit } = rest; + const { audioProps, audioReady, imageProps, imageReady, index, submit } = rest; const noAudio = !audioReady || !audioProps.file; const noImg = !imageReady || !imageProps.file; const incomplete = noAudio || noImg; + const working = imageProps.working && audioProps.working; + + const slides = ["Generate",<Spinner />,"Make another"]; + + const onClick = () => { + if (imageProps.success && audioProps.success) { + imageProps.clear(); audioProps.clear(); + } else if (!incomplete && !working) submit(); + }; + return <div {...{ className: 'progress-header' }}> <h1 {...{ className: "fw-bold text-center text-md-start progress-heading" }}> Lip Service @@ -90,9 +92,9 @@ const Title = ({ ...rest }) => { Audio </ProgressLi> </ul> - <DynamicButton {...{ disabled: incomplete || (imageProps.success && audioProps.success), onClick: submit }}>Generate</DynamicButton> + <DynamicButton {...{ disabled: incomplete || working, onClick, slides, index }}/> <p {...{ className: 'progress-description' }}> - Select an image with a clear face, or one of our existing templates, then choose either text to speech or uploaded audio(eg. music). Then you can generate a beautifully lipsynced video. + Select and image with a clear face, and an audio sample, and generate a lipsynced video. </p> </div> }; @@ -111,37 +113,37 @@ export default function LipsyncEditor({ ...rest }) { }; const audioProps = useFile({ debug: 'audio useFile', onSubmit }); const imageProps = useFile({ onSubmit }); + const index = audioProps.status === imageProps.status ? audioProps.status : -1; const headerProps = { audioProps, audioReady, imageProps, imageReady, + index, submit: () => { audioProps.submit(); imageProps.submit(); } }; - const index = imageProps.success && audioProps.success ? 2 : imageProps.working && audioProps.working ? 1 : 0; - const transitions = useTransition(index, { - config: { tension: 130, friction: 20 }, - from: { opacity: 0 }, - enter: { opacity: 1 }, - leave: { opacity: 0 }, + ...softSpring, + from: { opacity: 0, position: "absolute" }, + enter: { opacity: 1, position: "relative" }, + leave: { opacity: 0, position: "absolute" }, }); return <div> <div {...{ className: "container" }}> - <Title { ...headerProps }/> - <div {...{ className: "panel" }}> + <div {...{ className: "panel lipsync-panel" }}> + <Title { ...headerProps }/> { transitions((style, i) => { const Page = [InputPage,WorkingPage,SuccessPage][i]; - return <Page {...{ + return i > -1 ? <Page {...{ audioProps, imageProps, toggle: { audio: readyMedia(1), image: readyMedia(0) }, style - }}/> + }}/> : null }) } </div> </div> From 05fc58da6cae859ad33bcbc4051844342c6454cc Mon Sep 17 00:00:00 2001 From: olivicmic <vic@vics.pics> Date: Fri, 8 Sep 2023 11:56:19 -0700 Subject: [PATCH 04/10] face animation editor with audio > image > animation > to job workflow --- packages/components/src/api/ApiConfig.ts | 8 ++ packages/components/src/api/upload/upload.ts | 54 ++++++++ packages/components/src/jobs/InferenceJob.ts | 1 + .../common/AudioInput/AudioInput.tsx | 2 +- .../fakeyou.com/src/v2/view/PageContainer.tsx | 7 +- .../lipsync/LipsyncEditor/LipsyncEditor.scss | 11 +- .../lipsync/LipsyncEditor/LipsyncEditor.tsx | 129 ++++++++++++------ .../src/v2/view/pages/media/index.tsx | 3 + .../src/v2/view/pages/media/media.tsx | 11 ++ 9 files changed, 184 insertions(+), 42 deletions(-) create mode 100644 packages/components/src/api/upload/upload.ts create mode 100644 packages/fakeyou.com/src/v2/view/pages/media/index.tsx create mode 100644 packages/fakeyou.com/src/v2/view/pages/media/media.tsx diff --git a/packages/components/src/api/ApiConfig.ts b/packages/components/src/api/ApiConfig.ts index 4a670ad06b..b98dcd4d0d 100644 --- a/packages/components/src/api/ApiConfig.ts +++ b/packages/components/src/api/ApiConfig.ts @@ -402,6 +402,14 @@ class ApiConfig { return `${this.getApiOrigin()}/v1/media_uploads/upload_audio`; } + uploadImage(): string { + return `${this.getApiOrigin()}/v1/media_uploads/upload_image`; + } + + uploadVideo(): string { + return `${this.getApiOrigin()}/v1/media_uploads/upload_video`; + } + uploadMedia(): string { return `${this.getApiOrigin()}/v1/media_uploads/upload`; } diff --git a/packages/components/src/api/upload/upload.ts b/packages/components/src/api/upload/upload.ts new file mode 100644 index 0000000000..fb0b23ee60 --- /dev/null +++ b/packages/components/src/api/upload/upload.ts @@ -0,0 +1,54 @@ +import { ApiConfig } from "../ApiConfig"; + +export interface UploadRequest { + uuid_idempotency_token: string, + source?: string, // eg. "device", "file" + type: string, // "audio", "image", "video" + file: any, +}; + +export interface UploadResponse { + success: boolean, + upload_token?: string, +} + +const { uploadAudio, uploadImage, uploadVideo } = new ApiConfig(); + +const audio = new ApiConfig().uploadAudio(); +const image = new ApiConfig().uploadImage(); +const video = new ApiConfig().uploadVideo(); + +const endpoints = { audio, image, video }; + +export async function Upload(request: UploadRequest) : Promise<UploadResponse> +{ + + const formData = new FormData(); + + formData.append('uuid_idempotency_token', request.uuid_idempotency_token); + formData.append('file', request.file); + + if (request.source !== undefined) { + formData.append('source', request.source); + } + + return fetch(endpoints[request.type as keyof typeof endpoints], { + method: 'POST', + credentials: 'include', + headers: { + 'Accept': 'application/json', + }, + body: formData, + }) + .then(res => res.json()) + .then(res => { + if (res && 'success' in res) { + return res; + } else { + return { success : false }; + } + }) + .catch(e => { + return { success : false }; + }); +} \ No newline at end of file diff --git a/packages/components/src/jobs/InferenceJob.ts b/packages/components/src/jobs/InferenceJob.ts index 4700206e3c..586126aa83 100644 --- a/packages/components/src/jobs/InferenceJob.ts +++ b/packages/components/src/jobs/InferenceJob.ts @@ -3,6 +3,7 @@ import { JobState, jobStateFromString } from "./JobStates"; // Type of inference job (specified by the frontend, not backend) export enum FrontendInferenceJobType { + FaceAnimation, TextToSpeech, VoiceConversion, } diff --git a/packages/fakeyou.com/src/components/common/AudioInput/AudioInput.tsx b/packages/fakeyou.com/src/components/common/AudioInput/AudioInput.tsx index 5531fbe7af..9466897ab9 100644 --- a/packages/fakeyou.com/src/components/common/AudioInput/AudioInput.tsx +++ b/packages/fakeyou.com/src/components/common/AudioInput/AudioInput.tsx @@ -1,5 +1,5 @@ import React from "react"; -import { a, useSpring, useTransition } from '@react-spring/web'; +import { a, useTransition } from '@react-spring/web'; import { InputVcAudioPlayer } from "v2/view/_common/InputVcAudioPlayer"; import { FileActions, FileDetails, FileLabel, FileWrapper } from 'components/common'; import { faFileAudio } from "@fortawesome/pro-solid-svg-icons"; diff --git a/packages/fakeyou.com/src/v2/view/PageContainer.tsx b/packages/fakeyou.com/src/v2/view/PageContainer.tsx index 10dc7ec360..800c452614 100644 --- a/packages/fakeyou.com/src/v2/view/PageContainer.tsx +++ b/packages/fakeyou.com/src/v2/view/PageContainer.tsx @@ -6,6 +6,7 @@ import { LoginPage } from "./pages/login/LoginPage"; import { ModerationFc } from "./pages/moderation/moderation_main/ModerationFc"; import { ModerationIpBanListFc } from "./pages/moderation/moderation_ip_ban_list/ModerationIpBanListFc"; import { ModerationViewIpBanFc } from "./pages/moderation/moderation_view_ip_ban/ModerationViewIpBanFc"; +import { Media } from "./pages/media"; import { LipsyncEditor } from "./pages/lipsync"; import { FooterNav } from "./nav/FooterNav"; import { TopNav } from "./nav/TopNav"; @@ -431,7 +432,11 @@ class PageContainer extends React.Component<Props, State> { </Route> <Route path="/dev-lipsync"> - <LipsyncEditor /> + <LipsyncEditor {...{ enqueueInferenceJob: this.props.enqueueInferenceJob }} /> + </Route> + + <Route path="/media/:token"> + <Media/> </Route> <Route path="/moderation/user/list"> diff --git a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.scss b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.scss index ee3a9dfe82..3bfe8558ae 100644 --- a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.scss +++ b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.scss @@ -87,7 +87,7 @@ } } -.lipsync-panel { position: relative; height: fit-content; } +.lipsync-panel { position: relative; height: fit-content; overflow: hidden; } // .lipsync-editor, .lipsync-working, .lipsync-success { // position: absolute; @@ -97,8 +97,17 @@ display: flex; align-items: center; justify-content: center; + width: 100%; } +// .lipsync-working-notice { +// background-color: red; +// } + +// .lipsync-working { +// background-color: green; +// } + .lipsync-working-notice { flex-direction: column; margin: 5rem; diff --git a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx index e0874cc5ff..1afbbc1555 100644 --- a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx +++ b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx @@ -1,11 +1,17 @@ import React, { useState } from "react"; import { animated, useSpring, useTransition } from '@react-spring/web'; -import { useFile } from "hooks"; +import { useFile, useIdempotency } from "hooks"; import { AudioInput, ImageInput, Spinner } from "components/common"; import DynamicButton from './DynamicButton'; +import { Upload } from "@storyteller/components/src/api/upload/upload"; +import { FrontendInferenceJobType } from "@storyteller/components/src/jobs/InferenceJob"; import './LipsyncEditor.scss'; -interface LipSyncProps { audioProps: any, imageProps: any, toggle: any, style: any }; +interface LipSyncProps { audioProps: any, children?: any, imageProps: any, toggle: any, style: any }; +interface EditorProps { enqueueInferenceJob: ( + jobToken: string, + frontendInferenceJobType: FrontendInferenceJobType + ) => void }; const softSpring = { config: { mass: 1, tension: 80, friction: 10 } } @@ -13,10 +19,7 @@ const SuccessPage = ({ audioProps, imageProps, style }: LipSyncProps ) => <anim <h3 className=" fw-bold text-center text-lg-start"> Result </h3> - <video width="100%" height="auto" controls={true} className="rounded"> - <source src="https://pics.vics.pics/3027969248.mp4" /> - Your device doesn't support video. - </video> + Your animation is in progress. </animated.div>; const InputPage = ({ audioProps, imageProps, toggle, style }: LipSyncProps ) => { @@ -38,13 +41,17 @@ const InputPage = ({ audioProps, imageProps, toggle, style }: LipSyncProps ) => </div> </animated.div>}; -const WorkingPage = ({ audioProps, imageProps, style }: LipSyncProps ) => <animated.div {...{ className: "lipsync-working", style }}> +const Working = ({ audioProps, children = "", imageProps, style }: LipSyncProps ) => <animated.div {...{ className: "lipsync-working", style }}> <div {...{ className: "lipsync-working-notice" }}> - <h2>Working ...</h2> + <h2>{ children }</h2> <Spinner /> </div> </animated.div>; +const AudioWorking = (props: any) => <Working { ...props }>Uploading Audio ...</Working>; +const ImageWorking = (props: any) => <Working { ...props }>Uploading Image ...</Working>; +const AniWorking = (props: any) => <Working { ...props }>Starting animation ...</Working>; + const ProgressLi = ({ children, disabled = false }: { children?: any, disabled?: boolean }) => { const style = useSpring({ ...softSpring, @@ -54,11 +61,11 @@ const ProgressLi = ({ children, disabled = false }: { children?: any, disabled?: <svg> <circle {...{ cx: 16, cy: 16, r: 15, strokeWidth: "2", }}/> { <polyline {...{ - fill: 'none', - points: '9.5 18 14.5 22 22.5 12', - strokeLinecap: 'round', - strokeLinejoin: 'round', - strokeWidth: '4', + fill: "none", + points: "9.5 18 14.5 22 22.5 12", + strokeLinecap: "round", + strokeLinejoin: "round", + strokeWidth: "4", }}/> } </svg> { children } @@ -72,7 +79,7 @@ const Title = ({ ...rest }) => { const incomplete = noAudio || noImg; const working = imageProps.working && audioProps.working; - const slides = ["Generate",<Spinner />,"Make another"]; + const slides = ["Generate",<Spinner />,<Spinner />,<Spinner />,"Make another"]; const onClick = () => { if (imageProps.success && audioProps.success) { @@ -80,7 +87,7 @@ const Title = ({ ...rest }) => { } else if (!incomplete && !working) submit(); }; - return <div {...{ className: 'progress-header' }}> + return <div {...{ className: "progress-header" }}> <h1 {...{ className: "fw-bold text-center text-md-start progress-heading" }}> Lip Service </h1> @@ -93,38 +100,82 @@ const Title = ({ ...rest }) => { </ProgressLi> </ul> <DynamicButton {...{ disabled: incomplete || working, onClick, slides, index }}/> - <p {...{ className: 'progress-description' }}> + <p {...{ className: "progress-description" }}> Select and image with a clear face, and an audio sample, and generate a lipsynced video. </p> </div> }; -export default function LipsyncEditor({ ...rest }) { +const fakeAPI = async (anything: any) => { // this just simulates the unifinished apis + await new Promise(resolve => { + setTimeout(() => resolve({ success: true }), 3000); + }); + return { success: true, inference_job_token: "fake", upload_token: "also fake", }; +}; + +export default function LipsyncEditor({ enqueueInferenceJob, ...rest }: EditorProps) { + + // the ready states are set by functions which run after the upload input animation is completed, which then illuminates the respective checkmark in a staggered way to draw attention to the workflow, and reduces concurrent animations + const [imageReady,imageReadySet] = useState<boolean>(false); const [audioReady,audioReadySet] = useState<boolean>(false); const readyMedia = (m:number) => (t:boolean) => [imageReadySet,audioReadySet][m](t); - const onSubmit = async () => { - await new Promise(resolve => { - setTimeout(function () { - resolve(); - }, 6000); + + const idempotency = useIdempotency(); + const audioProps = useFile({}); // contains upload inout state and controls, see docs + const imageProps = useFile({}); // contains upload inout state and controls, see docs + const [index,indexSet] = useState<number>(0); // index = slideshow slide position + const [audioUploadToken,audioUploadTokenSet] = useState<string>(); + const [imageUploadToken,imageUploadTokenSet] = useState<string>(); + + const makeRequest = (mode: number) => ({ + uuid_idempotency_token: idempotency.token, + file: mode ? imageProps.file : audioProps.file, + source: "file", + type: mode ? "image" : "audio" + }); + + const submit = async () => { + if (!audioProps.file) return false; + + indexSet(1); // set audio working page + + Upload(makeRequest(0)) // start audio (0) upload + .then(res => { + if ("success" in res) { + audioUploadTokenSet(res.upload_token); // audio token stored + idempotency.reset(); // reset token for new request, I don't know if this needs to happen + indexSet(2); // set image working page + } + return fakeAPI(makeRequest(1)); // start image (1) upload, replace with Upload(imageRequest) + }) + .then(res => { + if ("success" in res) { + imageUploadTokenSet(res.upload_token); // image token stored + idempotency.reset(); + indexSet(3); // set face animator API working page + } + return fakeAPI({ + source_audio_media_upload_token: audioUploadToken, + source_image_media_upload_token: imageUploadToken, + uuid_idempotency_token: idempotency.token + }); + }) + .then(res => { + if ("success" in res) { + // this breaks because I don't get a real token + // enqueueInferenceJob(res.inference_job_token,FrontendInferenceJobType.FaceAnimation); + idempotency.reset(); + indexSet(4); // set face animator API working page + } + }) + .catch(e => { + return { success : false }; }); - return true; - }; - const audioProps = useFile({ debug: 'audio useFile', onSubmit }); - const imageProps = useFile({ onSubmit }); - const index = audioProps.status === imageProps.status ? audioProps.status : -1; - const headerProps = { - audioProps, - audioReady, - imageProps, - imageReady, - index, - submit: () => { - audioProps.submit(); imageProps.submit(); - } }; + const headerProps = { audioProps, audioReady, imageProps, imageReady, index, submit }; + const transitions = useTransition(index, { ...softSpring, from: { opacity: 0, position: "absolute" }, @@ -137,13 +188,13 @@ export default function LipsyncEditor({ ...rest }) { <div {...{ className: "panel lipsync-panel" }}> <Title { ...headerProps }/> { transitions((style, i) => { - const Page = [InputPage,WorkingPage,SuccessPage][i]; - return i > -1 ? <Page {...{ + const Page = [InputPage,AudioWorking,ImageWorking,AniWorking,SuccessPage][i]; + return Page ? <Page {...{ audioProps, imageProps, toggle: { audio: readyMedia(1), image: readyMedia(0) }, style - }}/> : null + }}/> : <></> }) } </div> </div> diff --git a/packages/fakeyou.com/src/v2/view/pages/media/index.tsx b/packages/fakeyou.com/src/v2/view/pages/media/index.tsx new file mode 100644 index 0000000000..f7c67981af --- /dev/null +++ b/packages/fakeyou.com/src/v2/view/pages/media/index.tsx @@ -0,0 +1,3 @@ +import media from './media'; + +export { media as Media }; diff --git a/packages/fakeyou.com/src/v2/view/pages/media/media.tsx b/packages/fakeyou.com/src/v2/view/pages/media/media.tsx new file mode 100644 index 0000000000..ddc4db1725 --- /dev/null +++ b/packages/fakeyou.com/src/v2/view/pages/media/media.tsx @@ -0,0 +1,11 @@ +import React from 'react'; + +interface Props { + value?: any; +} + +export default function media({ value }: Props) { + return <div> + <h1>Media</h1> + </div>; +}; \ No newline at end of file From 536bb6fa72a89c1eeaab0ef99b9b2a9a046be994 Mon Sep 17 00:00:00 2001 From: olivicmic <vic@vics.pics> Date: Wed, 20 Sep 2023 15:17:40 -0700 Subject: [PATCH 05/10] integrated new api pieces --- .../hooks/useIdempotency/useIdempotency.tsx | 2 +- .../lipsync/LipsyncEditor/LipsyncEditor.tsx | 74 ++++++++++--------- 2 files changed, 41 insertions(+), 35 deletions(-) diff --git a/packages/fakeyou.com/src/hooks/useIdempotency/useIdempotency.tsx b/packages/fakeyou.com/src/hooks/useIdempotency/useIdempotency.tsx index 0f264b57a0..0bd2925f29 100644 --- a/packages/fakeyou.com/src/hooks/useIdempotency/useIdempotency.tsx +++ b/packages/fakeyou.com/src/hooks/useIdempotency/useIdempotency.tsx @@ -3,5 +3,5 @@ import { v4 as uuidv4 } from "uuid"; export default function useIdempotency() { const [token, set] = useState(uuidv4()); - return { reset: () => set(uuidv4()), set, token }; + return { reset: () => set(uuidv4()), create: uuidv4, set, token }; }; \ No newline at end of file diff --git a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx index 1afbbc1555..05df6d16a4 100644 --- a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx +++ b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx @@ -1,9 +1,24 @@ import React, { useState } from "react"; import { animated, useSpring, useTransition } from '@react-spring/web'; -import { useFile, useIdempotency } from "hooks"; +import { v4 as uuidv4 } from "uuid"; +import { useFile } from "hooks"; import { AudioInput, ImageInput, Spinner } from "components/common"; import DynamicButton from './DynamicButton'; -import { Upload } from "@storyteller/components/src/api/upload/upload"; +import { + UploadAudio, + // UploadAudioIsOk, + // UploadAudioRequest, +} from "@storyteller/components/src/api/upload/UploadAudio"; +import { + UploadImage, + // UploadImageIsOk, + // UploadImageRequest, +} from "@storyteller/components/src/api/upload/UploadImage"; +import { + EnqueueFaceAnimation, + // EnqueueFaceAnimationIsSuccess, + // EnqueueFaceAnimationRequest, +} from "@storyteller/components/src/api/face_animation/EnqueueFaceAnimation"; import { FrontendInferenceJobType } from "@storyteller/components/src/jobs/InferenceJob"; import './LipsyncEditor.scss'; @@ -106,13 +121,6 @@ const Title = ({ ...rest }) => { </div> }; -const fakeAPI = async (anything: any) => { // this just simulates the unifinished apis - await new Promise(resolve => { - setTimeout(() => resolve({ success: true }), 3000); - }); - return { success: true, inference_job_token: "fake", upload_token: "also fake", }; -}; - export default function LipsyncEditor({ enqueueInferenceJob, ...rest }: EditorProps) { // the ready states are set by functions which run after the upload input animation is completed, which then illuminates the respective checkmark in a staggered way to draw attention to the workflow, and reduces concurrent animations @@ -120,54 +128,52 @@ export default function LipsyncEditor({ enqueueInferenceJob, ...rest }: EditorPr const [imageReady,imageReadySet] = useState<boolean>(false); const [audioReady,audioReadySet] = useState<boolean>(false); const readyMedia = (m:number) => (t:boolean) => [imageReadySet,audioReadySet][m](t); - - const idempotency = useIdempotency(); const audioProps = useFile({}); // contains upload inout state and controls, see docs const imageProps = useFile({}); // contains upload inout state and controls, see docs const [index,indexSet] = useState<number>(0); // index = slideshow slide position - const [audioUploadToken,audioUploadTokenSet] = useState<string>(); - const [imageUploadToken,imageUploadTokenSet] = useState<string>(); const makeRequest = (mode: number) => ({ - uuid_idempotency_token: idempotency.token, + uuid_idempotency_token: uuidv4(), file: mode ? imageProps.file : audioProps.file, source: "file", type: mode ? "image" : "audio" }); + const upImageAndMerge = async (audio: any) => ({ audio, image: await UploadImage(makeRequest(1)) }); + const submit = async () => { if (!audioProps.file) return false; indexSet(1); // set audio working page - Upload(makeRequest(0)) // start audio (0) upload + UploadAudio(makeRequest(0)) // start audio (0) upload .then(res => { - if ("success" in res) { - audioUploadTokenSet(res.upload_token); // audio token stored - idempotency.reset(); // reset token for new request, I don't know if this needs to happen + if ("upload_token" in res) { indexSet(2); // set image working page } - return fakeAPI(makeRequest(1)); // start image (1) upload, replace with Upload(imageRequest) + return upImageAndMerge(res); // start image (1) upload, replace with Upload(imageRequest) }) - .then(res => { - if ("success" in res) { - imageUploadTokenSet(res.upload_token); // image token stored - idempotency.reset(); + .then(responses => { + console.log("🌅",responses); + if ("upload_token" in responses.image) { indexSet(3); // set face animator API working page + return EnqueueFaceAnimation({ + uuid_idempotency_token: uuidv4(), + audio_source: { + maybe_media_upload_token: responses.audio.upload_token, + }, + image_source: { + maybe_media_upload_token: responses.image.upload_token, + }, + }); } - return fakeAPI({ - source_audio_media_upload_token: audioUploadToken, - source_image_media_upload_token: imageUploadToken, - uuid_idempotency_token: idempotency.token - }); }) .then(res => { - if ("success" in res) { - // this breaks because I don't get a real token - // enqueueInferenceJob(res.inference_job_token,FrontendInferenceJobType.FaceAnimation); - idempotency.reset(); - indexSet(4); // set face animator API working page - } + console.log("🎆",res); + // if ("success" in res) { + // console.log("💒",res); + // indexSet(4); // set face animator API working page + // } }) .catch(e => { return { success : false }; From 85c5d31e9954886fdbb36087b561ad46fc7f21b3 Mon Sep 17 00:00:00 2001 From: olivicmic <vic@vics.pics> Date: Sat, 23 Sep 2023 15:19:47 -0700 Subject: [PATCH 06/10] results list upon success --- .../face_animation/EnqueueFaceAnimation.ts | 36 +++-- packages/fakeyou.com/src/resources/index.tsx | 3 +- packages/fakeyou.com/src/resources/springs.ts | 5 + .../fakeyou.com/src/v2/view/PageContainer.tsx | 7 +- .../lipsync/LipsyncEditor/DynamicButton.scss | 2 + .../lipsync/LipsyncEditor/DynamicButton.tsx | 18 +-- .../LipsyncEditor/FaceAnimatorSuccess.tsx | 90 ++++++++++++ .../LipsyncEditor/FaceAnimatorTitle.js | 59 ++++++++ .../lipsync/LipsyncEditor/LipsyncEditor.scss | 11 ++ .../lipsync/LipsyncEditor/LipsyncEditor.tsx | 133 +++++++----------- .../src/v2/view/pages/testing/TestingPage.tsx | 2 +- 11 files changed, 258 insertions(+), 108 deletions(-) create mode 100644 packages/fakeyou.com/src/resources/springs.ts create mode 100644 packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/FaceAnimatorSuccess.tsx create mode 100644 packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/FaceAnimatorTitle.js diff --git a/packages/components/src/api/face_animation/EnqueueFaceAnimation.ts b/packages/components/src/api/face_animation/EnqueueFaceAnimation.ts index 8fac2d2c61..0beae23e82 100644 --- a/packages/components/src/api/face_animation/EnqueueFaceAnimation.ts +++ b/packages/components/src/api/face_animation/EnqueueFaceAnimation.ts @@ -20,24 +20,36 @@ export interface EnqueueFaceAnimationRequest { image_source: ImageSource, } -export interface EnqueueFaceAnimationSuccessResponse { +// export interface EnqueueFaceAnimationSuccessResponse { +// success: boolean, +// inference_job_token: string, +// } + +// export interface EnqueueFaceAnimationErrorResponse { +// success: boolean, +// } + +export interface EnqueueFaceAnimationResponse { success: boolean, - inference_job_token: string, + inference_job_token?: string, } -export interface EnqueueFaceAnimationErrorResponse { - success: boolean, -} -type EnqueueFaceAnimationResponse = EnqueueFaceAnimationSuccessResponse | EnqueueFaceAnimationErrorResponse; +const EnqueueFaceAnimationIsSuccess = (response: EnqueueFaceAnimationResponse) => response.inference_job_token; +const EnqueueFaceAnimationIsError = (response: EnqueueFaceAnimationResponse) => !response.inference_job_token; -export function EnqueueFaceAnimationIsSuccess(response: EnqueueFaceAnimationResponse): response is EnqueueFaceAnimationSuccessResponse { - return response?.success === true; -} +export { EnqueueFaceAnimationIsSuccess, EnqueueFaceAnimationIsError }; +// export EnqueueFaceAnimationIsSuccess; +// export EnqueueFaceAnimationIsError; -export function EnqueueFaceAnimationIsError(response: EnqueueFaceAnimationResponse): response is EnqueueFaceAnimationErrorResponse { - return response?.success === false; -} + +// export function EnqueueFaceAnimationIsSuccess(response: EnqueueFaceAnimationResponse): response is EnqueueFaceAnimationSuccessResponse { +// return response?.success === true; +// } + +// export function EnqueueFaceAnimationIsError(response: EnqueueFaceAnimationResponse): response is EnqueueFaceAnimationErrorResponse { +// return response?.success === false; +// } export async function EnqueueFaceAnimation(request: EnqueueFaceAnimationRequest) : Promise<EnqueueFaceAnimationResponse> { diff --git a/packages/fakeyou.com/src/resources/index.tsx b/packages/fakeyou.com/src/resources/index.tsx index 5175f238fc..c3c6b78fe4 100644 --- a/packages/fakeyou.com/src/resources/index.tsx +++ b/packages/fakeyou.com/src/resources/index.tsx @@ -1,3 +1,4 @@ import baseColors from './baseColors'; +import springs from './springs'; -export { baseColors } \ No newline at end of file +export { baseColors, springs } \ No newline at end of file diff --git a/packages/fakeyou.com/src/resources/springs.ts b/packages/fakeyou.com/src/resources/springs.ts new file mode 100644 index 0000000000..96200a5621 --- /dev/null +++ b/packages/fakeyou.com/src/resources/springs.ts @@ -0,0 +1,5 @@ +const springs = { + soft: { mass: 1, tension: 80, friction: 10 } +}; + +export default springs; \ No newline at end of file diff --git a/packages/fakeyou.com/src/v2/view/PageContainer.tsx b/packages/fakeyou.com/src/v2/view/PageContainer.tsx index d4b5bd9cfb..79b9d7d6e7 100644 --- a/packages/fakeyou.com/src/v2/view/PageContainer.tsx +++ b/packages/fakeyou.com/src/v2/view/PageContainer.tsx @@ -433,7 +433,12 @@ class PageContainer extends React.Component<Props, State> { </Route> <Route path="/dev-lipsync"> - <LipsyncEditor {...{ enqueueInferenceJob: this.props.enqueueInferenceJob }} /> + <LipsyncEditor {...{ + enqueueInferenceJob: this.props.enqueueInferenceJob, + sessionSubscriptionsWrapper: this.props.sessionSubscriptionsWrapper, + inferenceJobs: this.props.inferenceJobs, + inferenceJobsByCategory: this.props.inferenceJobsByCategory + }} /> </Route> <Route path="/media/:token"> diff --git a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/DynamicButton.scss b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/DynamicButton.scss index 2717fc499d..f4f866a0e3 100644 --- a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/DynamicButton.scss +++ b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/DynamicButton.scss @@ -7,6 +7,8 @@ outline: none; padding: 10px 20px; position: relative; + width: fit-content; + overflow: hidden; .button-slide { // position: absolute; diff --git a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/DynamicButton.tsx b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/DynamicButton.tsx index ed4ba08426..27d8f29f14 100644 --- a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/DynamicButton.tsx +++ b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/DynamicButton.tsx @@ -7,7 +7,7 @@ import "./DynamicButton.scss" interface Props { children?: string|JSX.Element|JSX.Element[]; className?: string; -disabled?: boolean; + disabled?: boolean; key?: boolean; [x:string]: any; } @@ -20,16 +20,18 @@ export default function DynamicButton({ children, className, disabled, index = 0 opacity: disabled ? .5 : 1 }); - const transitions = useTransition(slides, { + const transitions = useTransition(index, { config: { tension: 130, friction: 20 }, - from: { opacity: 0 }, - enter: { opacity: 1 }, - leave: { opacity: 0 }, + from: { opacity: 0, position: "absolute" }, + enter: { opacity: 1, position: "relative" }, + leave: { opacity: 0, position: "absolute" }, }); return <a.button {...{ className: `fy-dynamic-button`, disabled, style, ...hoverProps, ...rest }}> - { transitions((contentStyle, content, s, i) => - index === i ? <a.div {...{ className: `button-slide ${i}`, style: contentStyle }}>{ content }</a.div> : null - ) } + { transitions(({ opacity, position }, content, s, i) => { + return <a.div {...{ className: `button-slide ${i}`, style: { opacity, position: position as any } }}> + { slides[content] } + </a.div>; + }) } </a.button>; }; \ No newline at end of file diff --git a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/FaceAnimatorSuccess.tsx b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/FaceAnimatorSuccess.tsx new file mode 100644 index 0000000000..8d1c338c12 --- /dev/null +++ b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/FaceAnimatorSuccess.tsx @@ -0,0 +1,90 @@ +import React, { useEffect, useState } from 'react'; +import { animated } from '@react-spring/web'; +import { + GetPendingTtsJobCount, + GetPendingTtsJobCountIsOk, + GetPendingTtsJobCountSuccessResponse, +} from "@storyteller/components/src/api/tts/GetPendingTtsJobCount"; +import { FrontendInferenceJobType, InferenceJob } from "@storyteller/components/src/jobs/InferenceJob"; +import { BucketConfig } from "@storyteller/components/src/api/BucketConfig"; +import { JobState } from "@storyteller/components/src/jobs/JobStates"; +import { Analytics } from "common/Analytics"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faDownload } from "@fortawesome/free-solid-svg-icons"; + +interface Props { + audioProps: any; + imageProps: any; + style: any; + enqueueInferenceJob: any; + sessionSubscriptionsWrapper: any; + inferenceJobsByCategory: any; +} + +const DEFAULT_QUEUE_REFRESH_INTERVAL_MILLIS = 15000; + +export default function FaceAnimatorSuccess({ audioProps, imageProps, style, enqueueInferenceJob, sessionSubscriptionsWrapper, inferenceJobsByCategory }: Props) { + const [pending, pendingSet] = useState<GetPendingTtsJobCountSuccessResponse>({ + success: true, + pending_job_count: 0, + cache_time: new Date(0), // NB: Epoch is used for vector clock's initial state + refresh_interval_millis: DEFAULT_QUEUE_REFRESH_INTERVAL_MILLIS, + }); + const inferenceJobs = inferenceJobsByCategory.get(FrontendInferenceJobType.FaceAnimation)!; + const mediaLink = (path: string) => new BucketConfig().getGcsUrl(path); + const processStatus = (job: InferenceJob) => { + switch (job.jobState) { + case JobState.PENDING: + case JobState.UNKNOWN: return "Animation pending ..."; + case JobState.STARTED: return "Animation in progress"; + case JobState.ATTEMPT_FAILED: return `Animation failed ${job.attemptCount} attempt(s). Will retry...`; + case JobState.COMPLETE_FAILURE: + case JobState.DEAD: return "Animation request dead."; + case JobState.COMPLETE_SUCCESS: return "Animation successful"; + } + }; + + useEffect(() => { + const fetch = async () => { + const response = await GetPendingTtsJobCount(); + if (GetPendingTtsJobCountIsOk(response)) { + if ( + response.cache_time.getTime() > pending.cache_time.getTime() + ) { + pendingSet(response); + } + } + }; + // TODO: We're having an outage and need to lower this. + //const interval = setInterval(async () => fetch(), 15000); + const refreshInterval = Math.max( + DEFAULT_QUEUE_REFRESH_INTERVAL_MILLIS, + pending.refresh_interval_millis + ); + const interval = setInterval(async () => fetch(), refreshInterval); + fetch(); + return () => clearInterval(interval); + }, [pending]); + + return <animated.div {...{ className: "lipsync-success", style }}> + <div {...{ className: "face-animator-results" }}>{ + inferenceJobs.map((job: any) => !job.maybeResultToken ? + <div> + <h3>{ processStatus(job) }</h3> + <span {...{ className: "job-id" }}>id: { job.jobToken }</span> + </div> : <div> + <h3>Animation complete!</h3> + <span {...{ className: "job-id" }}>id: { job.jobToken }</span> + <a {...{ + className: "btn btn-primary w-100 mt-4", + download: `fakeyou-${job.jobToken}.mp4`, + href: mediaLink(job.maybeResultPublicBucketMediaPath), + onClick:() => Analytics.voiceConversionClickDownload() + }}> + <FontAwesomeIcon icon={faDownload} className="me-2" /> + Download File{" "} + </a> + </div>).reverse() + }</div> + </animated.div>; +}; \ No newline at end of file diff --git a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/FaceAnimatorTitle.js b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/FaceAnimatorTitle.js new file mode 100644 index 0000000000..49a8b1b2c6 --- /dev/null +++ b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/FaceAnimatorTitle.js @@ -0,0 +1,59 @@ +import React from 'react'; +import { animated, useSpring } from '@react-spring/web'; +import { Spinner } from "components/common"; +import { springs } from "resources"; +import DynamicButton from './DynamicButton'; + +const ProgressLi = ({ children, disabled = false }: { children?: any, disabled?: boolean }) => { + const style = useSpring({ + ...springs.soft, + opacity: disabled ? .25 : 1 + }); + return <animated.li {...{ style }}> + <svg> + <circle {...{ cx: 16, cy: 16, r: 15, strokeWidth: "2", }}/> + { <polyline {...{ + fill: "none", + points: "9.5 18 14.5 22 22.5 12", + strokeLinecap: "round", + strokeLinejoin: "round", + strokeWidth: "4", + }}/> } + </svg> + { children } + </animated.li> +}; + +export default function FaceAnimatorTitle({ ...rest }) { + const { audioProps, audioReady, imageProps, imageReady, indexSet, page, submit } = rest; + const noAudio = !audioReady || !audioProps.file; + const noImg = !imageReady || !imageProps.file; + const incomplete = noAudio || noImg; + const working = imageProps.working && audioProps.working; + + const slides = ["Generate",<Spinner />,"Make another"]; + + const onClick = () => { + if (page === 2) { + imageProps.clear(); audioProps.clear(); indexSet(0); + } else if (!incomplete && !working) submit(); + }; + + return <div {...{ className: "progress-header" }}> + <h1 {...{ className: "fw-bold text-center text-md-start progress-heading" }}> + Face Animator + </h1> + <ul {...{ className: 'async-progress-tracker' }}> + <ProgressLi {...{ disabled: noImg }}> + Image + </ProgressLi> + <ProgressLi {...{ disabled: noAudio }}> + Audio + </ProgressLi> + </ul> + <DynamicButton {...{ disabled: incomplete || working, onClick, slides, index: page }}/> + <p {...{ className: "progress-description" }}> + Select and image with a clear face, and an audio sample, and generate a lipsynced video. + </p> + </div> +}; \ No newline at end of file diff --git a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.scss b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.scss index 3bfe8558ae..3d31871fa9 100644 --- a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.scss +++ b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.scss @@ -111,8 +111,19 @@ .lipsync-working-notice { flex-direction: column; margin: 5rem; + + .working-title { + white-space: nowrap; + } } .lipsync-success { padding: .5rem 1rem 1rem; + + h3 { margin: 1rem auto 0 0; } + + .job-id { + color: rgba(#fff, .66); + font-size: .75rem; + } } \ No newline at end of file diff --git a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx index 05df6d16a4..57248f3163 100644 --- a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx +++ b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx @@ -1,9 +1,9 @@ import React, { useState } from "react"; -import { animated, useSpring, useTransition } from '@react-spring/web'; +import { animated, useTransition } from '@react-spring/web'; import { v4 as uuidv4 } from "uuid"; import { useFile } from "hooks"; import { AudioInput, ImageInput, Spinner } from "components/common"; -import DynamicButton from './DynamicButton'; +import { springs } from "resources"; import { UploadAudio, // UploadAudioIsOk, @@ -19,24 +19,27 @@ import { // EnqueueFaceAnimationIsSuccess, // EnqueueFaceAnimationRequest, } from "@storyteller/components/src/api/face_animation/EnqueueFaceAnimation"; -import { FrontendInferenceJobType } from "@storyteller/components/src/jobs/InferenceJob"; +// import { FrontendInferenceJobType } from "@storyteller/components/src/jobs/InferenceJob"; +import FaceAnimatorTitle from './FaceAnimatorTitle'; +import FaceAnimatorSuccess from './FaceAnimatorSuccess'; import './LipsyncEditor.scss'; +import { SessionSubscriptionsWrapper } from "@storyteller/components/src/session/SessionSubscriptionsWrapper"; +import { FrontendInferenceJobType, InferenceJob } from "@storyteller/components/src/jobs/InferenceJob"; -interface LipSyncProps { audioProps: any, children?: any, imageProps: any, toggle: any, style: any }; -interface EditorProps { enqueueInferenceJob: ( + +interface LipSyncProps { audioProps: any, children?: any, imageProps: any, index: number, toggle: any, style: any, enqueueInferenceJob: any, sessionSubscriptionsWrapper: any, inferenceJobsByCategory: any, }; +interface EditorProps { + sessionSubscriptionsWrapper: SessionSubscriptionsWrapper; + enqueueInferenceJob: ( jobToken: string, frontendInferenceJobType: FrontendInferenceJobType - ) => void }; + ) => void; + inferenceJobs: Array<InferenceJob>; + inferenceJobsByCategory: Map<FrontendInferenceJobType, Array<InferenceJob>>; +}; const softSpring = { config: { mass: 1, tension: 80, friction: 10 } } -const SuccessPage = ({ audioProps, imageProps, style }: LipSyncProps ) => <animated.div {...{ className: "lipsync-success", style }}> - <h3 className=" fw-bold text-center text-lg-start"> - Result - </h3> - Your animation is in progress. -</animated.div>; - const InputPage = ({ audioProps, imageProps, toggle, style }: LipSyncProps ) => { return <animated.div {...{ className: "lipsync-editor", style }}> @@ -56,72 +59,27 @@ const InputPage = ({ audioProps, imageProps, toggle, style }: LipSyncProps ) => </div> </animated.div>}; -const Working = ({ audioProps, children = "", imageProps, style }: LipSyncProps ) => <animated.div {...{ className: "lipsync-working", style }}> - <div {...{ className: "lipsync-working-notice" }}> - <h2>{ children }</h2> - <Spinner /> - </div> -</animated.div>; +const workStatus = ["","Uploading Audio","Uploading Image","Starting animation",""]; +// const jammy = ko => -const AudioWorking = (props: any) => <Working { ...props }>Uploading Audio ...</Working>; -const ImageWorking = (props: any) => <Working { ...props }>Uploading Image ...</Working>; -const AniWorking = (props: any) => <Working { ...props }>Starting animation ...</Working>; - -const ProgressLi = ({ children, disabled = false }: { children?: any, disabled?: boolean }) => { - const style = useSpring({ - ...softSpring, - opacity: disabled ? .25 : 1 +const Working = ({ audioProps, imageProps, index, style }: LipSyncProps ) => { + const transitions = useTransition(index, { + ...springs.soft, + from: { opacity: 0, position: "absolute" }, + enter: { opacity: 1, position: "relative" }, + leave: { opacity: 0, position: "absolute" }, }); - return <animated.li {...{ style }}> - <svg> - <circle {...{ cx: 16, cy: 16, r: 15, strokeWidth: "2", }}/> - { <polyline {...{ - fill: "none", - points: "9.5 18 14.5 22 22.5 12", - strokeLinecap: "round", - strokeLinejoin: "round", - strokeWidth: "4", - }}/> } - </svg> - { children } - </animated.li> + return <animated.div {...{ className: "lipsync-working", style }}> + <div {...{ className: "lipsync-working-notice" }}> + <h2 {...{ className: "working-title" }}> { transitions(({ opacity, position }, i) => { + return <animated.span {...{ className: "working-title-text", style: { opacity, position: position as any} }}>{ workStatus[index] } ...</animated.span>; + }) }</h2> + <Spinner /> + </div> + </animated.div>; }; -const Title = ({ ...rest }) => { - const { audioProps, audioReady, imageProps, imageReady, index, submit } = rest; - const noAudio = !audioReady || !audioProps.file; - const noImg = !imageReady || !imageProps.file; - const incomplete = noAudio || noImg; - const working = imageProps.working && audioProps.working; - - const slides = ["Generate",<Spinner />,<Spinner />,<Spinner />,"Make another"]; - - const onClick = () => { - if (imageProps.success && audioProps.success) { - imageProps.clear(); audioProps.clear(); - } else if (!incomplete && !working) submit(); - }; - - return <div {...{ className: "progress-header" }}> - <h1 {...{ className: "fw-bold text-center text-md-start progress-heading" }}> - Lip Service - </h1> - <ul {...{ className: 'async-progress-tracker' }}> - <ProgressLi {...{ disabled: noImg }}> - Image - </ProgressLi> - <ProgressLi {...{ disabled: noAudio }}> - Audio - </ProgressLi> - </ul> - <DynamicButton {...{ disabled: incomplete || working, onClick, slides, index }}/> - <p {...{ className: "progress-description" }}> - Select and image with a clear face, and an audio sample, and generate a lipsynced video. - </p> - </div> -}; - -export default function LipsyncEditor({ enqueueInferenceJob, ...rest }: EditorProps) { +export default function LipsyncEditor({ enqueueInferenceJob, sessionSubscriptionsWrapper, inferenceJobsByCategory, ...rest }: EditorProps) { // the ready states are set by functions which run after the upload input animation is completed, which then illuminates the respective checkmark in a staggered way to draw attention to the workflow, and reduces concurrent animations @@ -154,7 +112,6 @@ export default function LipsyncEditor({ enqueueInferenceJob, ...rest }: EditorPr return upImageAndMerge(res); // start image (1) upload, replace with Upload(imageRequest) }) .then(responses => { - console.log("🌅",responses); if ("upload_token" in responses.image) { indexSet(3); // set face animator API working page return EnqueueFaceAnimation({ @@ -169,18 +126,20 @@ export default function LipsyncEditor({ enqueueInferenceJob, ...rest }: EditorPr } }) .then(res => { - console.log("🎆",res); - // if ("success" in res) { - // console.log("💒",res); - // indexSet(4); // set face animator API working page - // } + if (res && res.inference_job_token) { + enqueueInferenceJob( + res.inference_job_token, + FrontendInferenceJobType.FaceAnimation + ); + indexSet(4); // set face animator API working page + } }) .catch(e => { return { success : false }; }); }; - - const headerProps = { audioProps, audioReady, imageProps, imageReady, index, submit }; + const page = index === 0 ? 0 : index === 4 ? 2 : 1; + const headerProps = { audioProps, audioReady, imageProps, imageReady, indexSet, page, submit }; const transitions = useTransition(index, { ...softSpring, @@ -192,12 +151,16 @@ export default function LipsyncEditor({ enqueueInferenceJob, ...rest }: EditorPr return <div> <div {...{ className: "container" }}> <div {...{ className: "panel lipsync-panel" }}> - <Title { ...headerProps }/> + <FaceAnimatorTitle { ...headerProps }/> { transitions((style, i) => { - const Page = [InputPage,AudioWorking,ImageWorking,AniWorking,SuccessPage][i]; + const Page = [InputPage,Working,FaceAnimatorSuccess][page]; return Page ? <Page {...{ audioProps, imageProps, + enqueueInferenceJob, + sessionSubscriptionsWrapper, + inferenceJobsByCategory, + index, toggle: { audio: readyMedia(1), image: readyMedia(0) }, style }}/> : <></> diff --git a/packages/fakeyou.com/src/v2/view/pages/testing/TestingPage.tsx b/packages/fakeyou.com/src/v2/view/pages/testing/TestingPage.tsx index 2d30e30415..88a7996089 100644 --- a/packages/fakeyou.com/src/v2/view/pages/testing/TestingPage.tsx +++ b/packages/fakeyou.com/src/v2/view/pages/testing/TestingPage.tsx @@ -48,7 +48,7 @@ function TestingPage(props: Props) { let result = await EnqueueFaceAnimation(request); - if (EnqueueFaceAnimationIsSuccess(result)) { + if (EnqueueFaceAnimationIsSuccess(result) && result.inference_job_token) { props.enqueueInferenceJob( result.inference_job_token, FrontendInferenceJobType.FaceAnimation From bf1ca5c70e5244d296c2938e333c55226e6e7cb2 Mon Sep 17 00:00:00 2001 From: olivicmic <vic@vics.pics> Date: Sat, 23 Sep 2023 16:10:29 -0700 Subject: [PATCH 07/10] added localization --- .../public/locales/bn/FaceAnimation.json | 5 ++++ .../public/locales/bn/FaceAnimator.json | 24 +++++++++++++++++++ .../fakeyou.com/public/locales/bn/Footer.json | 17 +++++++++++++ .../public/locales/bn/LandingPage.json | 12 ++++++++++ .../fakeyou.com/public/locales/bn/Rating.json | 9 +++++++ .../public/locales/bn/RecordComponent.json | 7 ++++++ .../bn/SessionTtsInferenceResultList.json | 13 ++++++++++ .../bn/SessionVoiceConversionResultsList.json | 13 ++++++++++ .../fakeyou.com/public/locales/bn/TopNav.json | 20 ++++++++++++++++ .../public/locales/bn/TtsModelListPage.json | 24 +++++++++++++++++++ .../public/locales/bn/UploadComponent.json | 8 +++++++ .../public/locales/bn/VcModelListPage.json | 18 ++++++++++++++ .../public/locales/de/FaceAnimation.json | 5 ++++ .../public/locales/de/FaceAnimator.json | 24 +++++++++++++++++++ .../fakeyou.com/public/locales/de/Footer.json | 17 +++++++++++++ .../public/locales/de/LandingPage.json | 12 ++++++++++ .../fakeyou.com/public/locales/de/Rating.json | 9 +++++++ .../public/locales/de/RecordComponent.json | 7 ++++++ .../de/SessionTtsInferenceResultList.json | 13 ++++++++++ .../de/SessionVoiceConversionResultsList.json | 13 ++++++++++ .../fakeyou.com/public/locales/de/TopNav.json | 20 ++++++++++++++++ .../public/locales/de/TtsModelListPage.json | 24 +++++++++++++++++++ .../public/locales/de/UploadComponent.json | 8 +++++++ .../public/locales/de/VcModelListPage.json | 18 ++++++++++++++ .../public/locales/en/FaceAnimation.json | 5 ++++ .../public/locales/en/FaceAnimator.json | 24 +++++++++++++++++++ .../fakeyou.com/public/locales/en/Footer.json | 18 ++++++++++++++ .../fakeyou.com/public/locales/en/Rating.json | 9 +++++++ .../public/locales/en/RecordComponent.json | 7 ++++++ .../en/SessionTtsInferenceResultList.json | 13 ++++++++++ .../en/SessionVoiceConversionResultsList.json | 13 ++++++++++ .../fakeyou.com/public/locales/en/TopNav.json | 21 ++++++++++++++++ .../public/locales/en/TtsModelListPage.json | 24 +++++++++++++++++++ .../public/locales/en/UploadComponent.json | 8 +++++++ .../public/locales/en/VcModelListPage.json | 18 ++++++++++++++ .../public/locales/es/FaceAnimation.json | 5 ++++ .../public/locales/es/FaceAnimator.json | 24 +++++++++++++++++++ .../fakeyou.com/public/locales/es/Footer.json | 17 +++++++++++++ .../public/locales/es/LandingPage.json | 8 +++---- .../fakeyou.com/public/locales/es/Rating.json | 9 +++++++ .../public/locales/es/RecordComponent.json | 7 ++++++ .../es/SessionTtsInferenceResultList.json | 13 ++++++++++ .../es/SessionVoiceConversionResultsList.json | 13 ++++++++++ .../fakeyou.com/public/locales/es/TopNav.json | 20 ++++++++++++++++ .../public/locales/es/TtsModelListPage.json | 24 +++++++++++++++++++ .../public/locales/es/UploadComponent.json | 8 +++++++ .../public/locales/es/VcModelListPage.json | 18 ++++++++++++++ .../public/locales/fr/FaceAnimation.json | 5 ++++ .../public/locales/fr/FaceAnimator.json | 24 +++++++++++++++++++ .../fakeyou.com/public/locales/fr/Footer.json | 17 +++++++++++++ .../public/locales/fr/LandingPage.json | 12 ++++++++++ .../fakeyou.com/public/locales/fr/Rating.json | 9 +++++++ .../public/locales/fr/RecordComponent.json | 7 ++++++ .../fr/SessionTtsInferenceResultList.json | 13 ++++++++++ .../fr/SessionVoiceConversionResultsList.json | 13 ++++++++++ .../fakeyou.com/public/locales/fr/TopNav.json | 20 ++++++++++++++++ .../public/locales/fr/TtsModelListPage.json | 24 +++++++++++++++++++ .../public/locales/fr/UploadComponent.json | 8 +++++++ .../public/locales/fr/VcModelListPage.json | 18 ++++++++++++++ .../public/locales/hi/FaceAnimation.json | 5 ++++ .../public/locales/hi/FaceAnimator.json | 24 +++++++++++++++++++ .../fakeyou.com/public/locales/hi/Footer.json | 17 +++++++++++++ .../public/locales/hi/LandingPage.json | 12 ++++++++++ .../fakeyou.com/public/locales/hi/Rating.json | 9 +++++++ .../public/locales/hi/RecordComponent.json | 7 ++++++ .../hi/SessionTtsInferenceResultList.json | 13 ++++++++++ .../hi/SessionVoiceConversionResultsList.json | 13 ++++++++++ .../fakeyou.com/public/locales/hi/TopNav.json | 20 ++++++++++++++++ .../public/locales/hi/TtsModelListPage.json | 24 +++++++++++++++++++ .../public/locales/hi/UploadComponent.json | 8 +++++++ .../public/locales/hi/VcModelListPage.json | 18 ++++++++++++++ .../public/locales/id/FaceAnimation.json | 5 ++++ .../public/locales/id/FaceAnimator.json | 24 +++++++++++++++++++ .../fakeyou.com/public/locales/id/Footer.json | 17 +++++++++++++ .../public/locales/id/LandingPage.json | 12 ++++++++++ .../fakeyou.com/public/locales/id/Rating.json | 9 +++++++ .../public/locales/id/RecordComponent.json | 7 ++++++ .../id/SessionTtsInferenceResultList.json | 13 ++++++++++ .../id/SessionVoiceConversionResultsList.json | 13 ++++++++++ .../fakeyou.com/public/locales/id/TopNav.json | 20 ++++++++++++++++ .../public/locales/id/TtsModelListPage.json | 24 +++++++++++++++++++ .../public/locales/id/UploadComponent.json | 8 +++++++ .../public/locales/id/VcModelListPage.json | 18 ++++++++++++++ .../public/locales/it/FaceAnimation.json | 5 ++++ .../public/locales/it/FaceAnimator.json | 24 +++++++++++++++++++ .../fakeyou.com/public/locales/it/Footer.json | 17 +++++++++++++ .../public/locales/it/LandingPage.json | 12 ++++++++++ .../fakeyou.com/public/locales/it/Rating.json | 9 +++++++ .../public/locales/it/RecordComponent.json | 7 ++++++ .../it/SessionTtsInferenceResultList.json | 13 ++++++++++ .../it/SessionVoiceConversionResultsList.json | 13 ++++++++++ .../fakeyou.com/public/locales/it/TopNav.json | 20 ++++++++++++++++ .../public/locales/it/TtsModelListPage.json | 24 +++++++++++++++++++ .../public/locales/it/UploadComponent.json | 8 +++++++ .../public/locales/it/VcModelListPage.json | 18 ++++++++++++++ .../public/locales/ja/FaceAnimation.json | 5 ++++ .../public/locales/ja/FaceAnimator.json | 24 +++++++++++++++++++ .../fakeyou.com/public/locales/ja/Footer.json | 17 +++++++++++++ .../public/locales/ja/LandingPage.json | 6 ++--- .../fakeyou.com/public/locales/ja/Rating.json | 9 +++++++ .../public/locales/ja/RecordComponent.json | 7 ++++++ .../ja/SessionTtsInferenceResultList.json | 13 ++++++++++ .../ja/SessionVoiceConversionResultsList.json | 13 ++++++++++ .../fakeyou.com/public/locales/ja/TopNav.json | 20 ++++++++++++++++ .../public/locales/ja/TtsModelListPage.json | 24 +++++++++++++++++++ .../public/locales/ja/UploadComponent.json | 8 +++++++ .../public/locales/ja/VcModelListPage.json | 18 ++++++++++++++ .../public/locales/ko/FaceAnimation.json | 5 ++++ .../public/locales/ko/FaceAnimator.json | 24 +++++++++++++++++++ .../fakeyou.com/public/locales/ko/Footer.json | 17 +++++++++++++ .../public/locales/ko/LandingPage.json | 12 ++++++++++ .../fakeyou.com/public/locales/ko/Rating.json | 9 +++++++ .../public/locales/ko/RecordComponent.json | 7 ++++++ .../ko/SessionTtsInferenceResultList.json | 13 ++++++++++ .../ko/SessionVoiceConversionResultsList.json | 13 ++++++++++ .../fakeyou.com/public/locales/ko/TopNav.json | 20 ++++++++++++++++ .../public/locales/ko/TtsModelListPage.json | 24 +++++++++++++++++++ .../public/locales/ko/UploadComponent.json | 8 +++++++ .../public/locales/ko/VcModelListPage.json | 18 ++++++++++++++ .../public/locales/pt/FaceAnimation.json | 5 ++++ .../public/locales/pt/FaceAnimator.json | 24 +++++++++++++++++++ .../fakeyou.com/public/locales/pt/Footer.json | 17 +++++++++++++ .../public/locales/pt/LandingPage.json | 2 +- .../fakeyou.com/public/locales/pt/Rating.json | 9 +++++++ .../public/locales/pt/RecordComponent.json | 7 ++++++ .../pt/SessionTtsInferenceResultList.json | 13 ++++++++++ .../pt/SessionVoiceConversionResultsList.json | 13 ++++++++++ .../fakeyou.com/public/locales/pt/TopNav.json | 20 ++++++++++++++++ .../public/locales/pt/TtsModelListPage.json | 24 +++++++++++++++++++ .../public/locales/pt/UploadComponent.json | 8 +++++++ .../public/locales/pt/VcModelListPage.json | 18 ++++++++++++++ .../public/locales/ru/FaceAnimation.json | 5 ++++ .../public/locales/ru/FaceAnimator.json | 24 +++++++++++++++++++ .../fakeyou.com/public/locales/ru/Footer.json | 17 +++++++++++++ .../public/locales/ru/LandingPage.json | 12 ++++++++++ .../fakeyou.com/public/locales/ru/Rating.json | 9 +++++++ .../public/locales/ru/RecordComponent.json | 7 ++++++ .../ru/SessionTtsInferenceResultList.json | 13 ++++++++++ .../ru/SessionVoiceConversionResultsList.json | 13 ++++++++++ .../fakeyou.com/public/locales/ru/TopNav.json | 20 ++++++++++++++++ .../public/locales/ru/TtsModelListPage.json | 24 +++++++++++++++++++ .../public/locales/ru/UploadComponent.json | 8 +++++++ .../public/locales/ru/VcModelListPage.json | 18 ++++++++++++++ .../public/locales/th/FaceAnimation.json | 5 ++++ .../public/locales/th/FaceAnimator.json | 24 +++++++++++++++++++ .../fakeyou.com/public/locales/th/Footer.json | 17 +++++++++++++ .../public/locales/th/LandingPage.json | 12 ++++++++++ .../fakeyou.com/public/locales/th/Rating.json | 9 +++++++ .../public/locales/th/RecordComponent.json | 7 ++++++ .../th/SessionTtsInferenceResultList.json | 13 ++++++++++ .../th/SessionVoiceConversionResultsList.json | 13 ++++++++++ .../fakeyou.com/public/locales/th/TopNav.json | 20 ++++++++++++++++ .../public/locales/th/TtsModelListPage.json | 24 +++++++++++++++++++ .../public/locales/th/UploadComponent.json | 8 +++++++ .../public/locales/th/VcModelListPage.json | 19 +++++++++++++++ .../public/locales/tr/FaceAnimation.json | 5 ++++ .../public/locales/tr/FaceAnimator.json | 24 +++++++++++++++++++ .../fakeyou.com/public/locales/tr/Footer.json | 17 +++++++++++++ .../public/locales/tr/LandingPage.json | 12 ++++++++++ .../fakeyou.com/public/locales/tr/Rating.json | 9 +++++++ .../public/locales/tr/RecordComponent.json | 7 ++++++ .../tr/SessionTtsInferenceResultList.json | 13 ++++++++++ .../tr/SessionVoiceConversionResultsList.json | 13 ++++++++++ .../fakeyou.com/public/locales/tr/TopNav.json | 20 ++++++++++++++++ .../public/locales/tr/TtsModelListPage.json | 24 +++++++++++++++++++ .../public/locales/tr/UploadComponent.json | 8 +++++++ .../public/locales/tr/VcModelListPage.json | 18 ++++++++++++++ .../public/locales/vi/FaceAnimation.json | 5 ++++ .../public/locales/vi/FaceAnimator.json | 24 +++++++++++++++++++ .../fakeyou.com/public/locales/vi/Footer.json | 17 +++++++++++++ .../public/locales/vi/LandingPage.json | 12 ++++++++++ .../fakeyou.com/public/locales/vi/Rating.json | 9 +++++++ .../public/locales/vi/RecordComponent.json | 7 ++++++ .../vi/SessionTtsInferenceResultList.json | 13 ++++++++++ .../vi/SessionVoiceConversionResultsList.json | 13 ++++++++++ .../fakeyou.com/public/locales/vi/TopNav.json | 20 ++++++++++++++++ .../public/locales/vi/TtsModelListPage.json | 24 +++++++++++++++++++ .../public/locales/vi/UploadComponent.json | 8 +++++++ .../public/locales/vi/VcModelListPage.json | 18 ++++++++++++++ .../public/locales/zh-Hans/FaceAnimation.json | 5 ++++ .../public/locales/zh-Hans/FaceAnimator.json | 24 +++++++++++++++++++ .../public/locales/zh-Hans/Footer.json | 17 +++++++++++++ .../public/locales/zh-Hans/LandingPage.json | 12 ++++++++++ .../public/locales/zh-Hans/Rating.json | 9 +++++++ .../locales/zh-Hans/RecordComponent.json | 7 ++++++ .../SessionTtsInferenceResultList.json | 13 ++++++++++ .../SessionVoiceConversionResultsList.json | 13 ++++++++++ .../public/locales/zh-Hans/TopNav.json | 20 ++++++++++++++++ .../locales/zh-Hans/TtsModelListPage.json | 24 +++++++++++++++++++ .../locales/zh-Hans/UploadComponent.json | 8 +++++++ .../locales/zh-Hans/VcModelListPage.json | 18 ++++++++++++++ .../LipsyncEditor/FaceAnimatorSuccess.tsx | 17 ++++++------- .../LipsyncEditor/FaceAnimatorTitle.js | 12 +++++----- .../lipsync/LipsyncEditor/LipsyncEditor.tsx | 19 ++++++++------- 194 files changed, 2708 insertions(+), 31 deletions(-) create mode 100644 packages/fakeyou.com/public/locales/bn/FaceAnimation.json create mode 100644 packages/fakeyou.com/public/locales/bn/FaceAnimator.json create mode 100644 packages/fakeyou.com/public/locales/bn/Footer.json create mode 100644 packages/fakeyou.com/public/locales/bn/LandingPage.json create mode 100644 packages/fakeyou.com/public/locales/bn/Rating.json create mode 100644 packages/fakeyou.com/public/locales/bn/RecordComponent.json create mode 100644 packages/fakeyou.com/public/locales/bn/SessionTtsInferenceResultList.json create mode 100644 packages/fakeyou.com/public/locales/bn/SessionVoiceConversionResultsList.json create mode 100644 packages/fakeyou.com/public/locales/bn/TopNav.json create mode 100644 packages/fakeyou.com/public/locales/bn/TtsModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/bn/UploadComponent.json create mode 100644 packages/fakeyou.com/public/locales/bn/VcModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/de/FaceAnimation.json create mode 100644 packages/fakeyou.com/public/locales/de/FaceAnimator.json create mode 100644 packages/fakeyou.com/public/locales/de/Footer.json create mode 100644 packages/fakeyou.com/public/locales/de/LandingPage.json create mode 100644 packages/fakeyou.com/public/locales/de/Rating.json create mode 100644 packages/fakeyou.com/public/locales/de/RecordComponent.json create mode 100644 packages/fakeyou.com/public/locales/de/SessionTtsInferenceResultList.json create mode 100644 packages/fakeyou.com/public/locales/de/SessionVoiceConversionResultsList.json create mode 100644 packages/fakeyou.com/public/locales/de/TopNav.json create mode 100644 packages/fakeyou.com/public/locales/de/TtsModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/de/UploadComponent.json create mode 100644 packages/fakeyou.com/public/locales/de/VcModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/en/FaceAnimation.json create mode 100644 packages/fakeyou.com/public/locales/en/FaceAnimator.json create mode 100644 packages/fakeyou.com/public/locales/en/Footer.json create mode 100644 packages/fakeyou.com/public/locales/en/Rating.json create mode 100644 packages/fakeyou.com/public/locales/en/RecordComponent.json create mode 100644 packages/fakeyou.com/public/locales/en/SessionTtsInferenceResultList.json create mode 100644 packages/fakeyou.com/public/locales/en/SessionVoiceConversionResultsList.json create mode 100644 packages/fakeyou.com/public/locales/en/TopNav.json create mode 100644 packages/fakeyou.com/public/locales/en/TtsModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/en/UploadComponent.json create mode 100644 packages/fakeyou.com/public/locales/en/VcModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/es/FaceAnimation.json create mode 100644 packages/fakeyou.com/public/locales/es/FaceAnimator.json create mode 100644 packages/fakeyou.com/public/locales/es/Footer.json create mode 100644 packages/fakeyou.com/public/locales/es/Rating.json create mode 100644 packages/fakeyou.com/public/locales/es/RecordComponent.json create mode 100644 packages/fakeyou.com/public/locales/es/SessionTtsInferenceResultList.json create mode 100644 packages/fakeyou.com/public/locales/es/SessionVoiceConversionResultsList.json create mode 100644 packages/fakeyou.com/public/locales/es/TopNav.json create mode 100644 packages/fakeyou.com/public/locales/es/TtsModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/es/UploadComponent.json create mode 100644 packages/fakeyou.com/public/locales/es/VcModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/fr/FaceAnimation.json create mode 100644 packages/fakeyou.com/public/locales/fr/FaceAnimator.json create mode 100644 packages/fakeyou.com/public/locales/fr/Footer.json create mode 100644 packages/fakeyou.com/public/locales/fr/LandingPage.json create mode 100644 packages/fakeyou.com/public/locales/fr/Rating.json create mode 100644 packages/fakeyou.com/public/locales/fr/RecordComponent.json create mode 100644 packages/fakeyou.com/public/locales/fr/SessionTtsInferenceResultList.json create mode 100644 packages/fakeyou.com/public/locales/fr/SessionVoiceConversionResultsList.json create mode 100644 packages/fakeyou.com/public/locales/fr/TopNav.json create mode 100644 packages/fakeyou.com/public/locales/fr/TtsModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/fr/UploadComponent.json create mode 100644 packages/fakeyou.com/public/locales/fr/VcModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/hi/FaceAnimation.json create mode 100644 packages/fakeyou.com/public/locales/hi/FaceAnimator.json create mode 100644 packages/fakeyou.com/public/locales/hi/Footer.json create mode 100644 packages/fakeyou.com/public/locales/hi/LandingPage.json create mode 100644 packages/fakeyou.com/public/locales/hi/Rating.json create mode 100644 packages/fakeyou.com/public/locales/hi/RecordComponent.json create mode 100644 packages/fakeyou.com/public/locales/hi/SessionTtsInferenceResultList.json create mode 100644 packages/fakeyou.com/public/locales/hi/SessionVoiceConversionResultsList.json create mode 100644 packages/fakeyou.com/public/locales/hi/TopNav.json create mode 100644 packages/fakeyou.com/public/locales/hi/TtsModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/hi/UploadComponent.json create mode 100644 packages/fakeyou.com/public/locales/hi/VcModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/id/FaceAnimation.json create mode 100644 packages/fakeyou.com/public/locales/id/FaceAnimator.json create mode 100644 packages/fakeyou.com/public/locales/id/Footer.json create mode 100644 packages/fakeyou.com/public/locales/id/LandingPage.json create mode 100644 packages/fakeyou.com/public/locales/id/Rating.json create mode 100644 packages/fakeyou.com/public/locales/id/RecordComponent.json create mode 100644 packages/fakeyou.com/public/locales/id/SessionTtsInferenceResultList.json create mode 100644 packages/fakeyou.com/public/locales/id/SessionVoiceConversionResultsList.json create mode 100644 packages/fakeyou.com/public/locales/id/TopNav.json create mode 100644 packages/fakeyou.com/public/locales/id/TtsModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/id/UploadComponent.json create mode 100644 packages/fakeyou.com/public/locales/id/VcModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/it/FaceAnimation.json create mode 100644 packages/fakeyou.com/public/locales/it/FaceAnimator.json create mode 100644 packages/fakeyou.com/public/locales/it/Footer.json create mode 100644 packages/fakeyou.com/public/locales/it/LandingPage.json create mode 100644 packages/fakeyou.com/public/locales/it/Rating.json create mode 100644 packages/fakeyou.com/public/locales/it/RecordComponent.json create mode 100644 packages/fakeyou.com/public/locales/it/SessionTtsInferenceResultList.json create mode 100644 packages/fakeyou.com/public/locales/it/SessionVoiceConversionResultsList.json create mode 100644 packages/fakeyou.com/public/locales/it/TopNav.json create mode 100644 packages/fakeyou.com/public/locales/it/TtsModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/it/UploadComponent.json create mode 100644 packages/fakeyou.com/public/locales/it/VcModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/ja/FaceAnimation.json create mode 100644 packages/fakeyou.com/public/locales/ja/FaceAnimator.json create mode 100644 packages/fakeyou.com/public/locales/ja/Footer.json create mode 100644 packages/fakeyou.com/public/locales/ja/Rating.json create mode 100644 packages/fakeyou.com/public/locales/ja/RecordComponent.json create mode 100644 packages/fakeyou.com/public/locales/ja/SessionTtsInferenceResultList.json create mode 100644 packages/fakeyou.com/public/locales/ja/SessionVoiceConversionResultsList.json create mode 100644 packages/fakeyou.com/public/locales/ja/TopNav.json create mode 100644 packages/fakeyou.com/public/locales/ja/TtsModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/ja/UploadComponent.json create mode 100644 packages/fakeyou.com/public/locales/ja/VcModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/ko/FaceAnimation.json create mode 100644 packages/fakeyou.com/public/locales/ko/FaceAnimator.json create mode 100644 packages/fakeyou.com/public/locales/ko/Footer.json create mode 100644 packages/fakeyou.com/public/locales/ko/LandingPage.json create mode 100644 packages/fakeyou.com/public/locales/ko/Rating.json create mode 100644 packages/fakeyou.com/public/locales/ko/RecordComponent.json create mode 100644 packages/fakeyou.com/public/locales/ko/SessionTtsInferenceResultList.json create mode 100644 packages/fakeyou.com/public/locales/ko/SessionVoiceConversionResultsList.json create mode 100644 packages/fakeyou.com/public/locales/ko/TopNav.json create mode 100644 packages/fakeyou.com/public/locales/ko/TtsModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/ko/UploadComponent.json create mode 100644 packages/fakeyou.com/public/locales/ko/VcModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/pt/FaceAnimation.json create mode 100644 packages/fakeyou.com/public/locales/pt/FaceAnimator.json create mode 100644 packages/fakeyou.com/public/locales/pt/Footer.json create mode 100644 packages/fakeyou.com/public/locales/pt/Rating.json create mode 100644 packages/fakeyou.com/public/locales/pt/RecordComponent.json create mode 100644 packages/fakeyou.com/public/locales/pt/SessionTtsInferenceResultList.json create mode 100644 packages/fakeyou.com/public/locales/pt/SessionVoiceConversionResultsList.json create mode 100644 packages/fakeyou.com/public/locales/pt/TopNav.json create mode 100644 packages/fakeyou.com/public/locales/pt/TtsModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/pt/UploadComponent.json create mode 100644 packages/fakeyou.com/public/locales/pt/VcModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/ru/FaceAnimation.json create mode 100644 packages/fakeyou.com/public/locales/ru/FaceAnimator.json create mode 100644 packages/fakeyou.com/public/locales/ru/Footer.json create mode 100644 packages/fakeyou.com/public/locales/ru/LandingPage.json create mode 100644 packages/fakeyou.com/public/locales/ru/Rating.json create mode 100644 packages/fakeyou.com/public/locales/ru/RecordComponent.json create mode 100644 packages/fakeyou.com/public/locales/ru/SessionTtsInferenceResultList.json create mode 100644 packages/fakeyou.com/public/locales/ru/SessionVoiceConversionResultsList.json create mode 100644 packages/fakeyou.com/public/locales/ru/TopNav.json create mode 100644 packages/fakeyou.com/public/locales/ru/TtsModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/ru/UploadComponent.json create mode 100644 packages/fakeyou.com/public/locales/ru/VcModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/th/FaceAnimation.json create mode 100644 packages/fakeyou.com/public/locales/th/FaceAnimator.json create mode 100644 packages/fakeyou.com/public/locales/th/Footer.json create mode 100644 packages/fakeyou.com/public/locales/th/LandingPage.json create mode 100644 packages/fakeyou.com/public/locales/th/Rating.json create mode 100644 packages/fakeyou.com/public/locales/th/RecordComponent.json create mode 100644 packages/fakeyou.com/public/locales/th/SessionTtsInferenceResultList.json create mode 100644 packages/fakeyou.com/public/locales/th/SessionVoiceConversionResultsList.json create mode 100644 packages/fakeyou.com/public/locales/th/TopNav.json create mode 100644 packages/fakeyou.com/public/locales/th/TtsModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/th/UploadComponent.json create mode 100644 packages/fakeyou.com/public/locales/th/VcModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/tr/FaceAnimation.json create mode 100644 packages/fakeyou.com/public/locales/tr/FaceAnimator.json create mode 100644 packages/fakeyou.com/public/locales/tr/Footer.json create mode 100644 packages/fakeyou.com/public/locales/tr/LandingPage.json create mode 100644 packages/fakeyou.com/public/locales/tr/Rating.json create mode 100644 packages/fakeyou.com/public/locales/tr/RecordComponent.json create mode 100644 packages/fakeyou.com/public/locales/tr/SessionTtsInferenceResultList.json create mode 100644 packages/fakeyou.com/public/locales/tr/SessionVoiceConversionResultsList.json create mode 100644 packages/fakeyou.com/public/locales/tr/TopNav.json create mode 100644 packages/fakeyou.com/public/locales/tr/TtsModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/tr/UploadComponent.json create mode 100644 packages/fakeyou.com/public/locales/tr/VcModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/vi/FaceAnimation.json create mode 100644 packages/fakeyou.com/public/locales/vi/FaceAnimator.json create mode 100644 packages/fakeyou.com/public/locales/vi/Footer.json create mode 100644 packages/fakeyou.com/public/locales/vi/LandingPage.json create mode 100644 packages/fakeyou.com/public/locales/vi/Rating.json create mode 100644 packages/fakeyou.com/public/locales/vi/RecordComponent.json create mode 100644 packages/fakeyou.com/public/locales/vi/SessionTtsInferenceResultList.json create mode 100644 packages/fakeyou.com/public/locales/vi/SessionVoiceConversionResultsList.json create mode 100644 packages/fakeyou.com/public/locales/vi/TopNav.json create mode 100644 packages/fakeyou.com/public/locales/vi/TtsModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/vi/UploadComponent.json create mode 100644 packages/fakeyou.com/public/locales/vi/VcModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/zh-Hans/FaceAnimation.json create mode 100644 packages/fakeyou.com/public/locales/zh-Hans/FaceAnimator.json create mode 100644 packages/fakeyou.com/public/locales/zh-Hans/Footer.json create mode 100644 packages/fakeyou.com/public/locales/zh-Hans/LandingPage.json create mode 100644 packages/fakeyou.com/public/locales/zh-Hans/Rating.json create mode 100644 packages/fakeyou.com/public/locales/zh-Hans/RecordComponent.json create mode 100644 packages/fakeyou.com/public/locales/zh-Hans/SessionTtsInferenceResultList.json create mode 100644 packages/fakeyou.com/public/locales/zh-Hans/SessionVoiceConversionResultsList.json create mode 100644 packages/fakeyou.com/public/locales/zh-Hans/TopNav.json create mode 100644 packages/fakeyou.com/public/locales/zh-Hans/TtsModelListPage.json create mode 100644 packages/fakeyou.com/public/locales/zh-Hans/UploadComponent.json create mode 100644 packages/fakeyou.com/public/locales/zh-Hans/VcModelListPage.json diff --git a/packages/fakeyou.com/public/locales/bn/FaceAnimation.json b/packages/fakeyou.com/public/locales/bn/FaceAnimation.json new file mode 100644 index 0000000000..3762555988 --- /dev/null +++ b/packages/fakeyou.com/public/locales/bn/FaceAnimation.json @@ -0,0 +1,5 @@ +{ + "hero": { + "title": "Lorem ipsum" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/bn/FaceAnimator.json b/packages/fakeyou.com/public/locales/bn/FaceAnimator.json new file mode 100644 index 0000000000..5e555028a8 --- /dev/null +++ b/packages/fakeyou.com/public/locales/bn/FaceAnimator.json @@ -0,0 +1,24 @@ +{ + "headings": { + "audio": "শ্রুতি", + "image": "ছবি", + "subtitle": "একটি পরিষ্কার মুখ এবং একটি অডিও নমুনা সহ নির্বাচন করুন এবং চিত্র করুন এবং একটি লিপসিন্সড ভিডিও তৈরি করুন৷", + "title": "ফেস অ্যানিমেটর" + }, + "inputs": { + "downloadFile": "ডাউনলোড ফাইল", + "generate": "তৈরি করুন", + "makeAnother": "আরেকটা তৈরি কর" + }, + "status": { + "animationComplete": "অ্যানিমেশন সম্পূর্ণ!", + "animationDead": "অ্যানিমেশন অনুরোধ মৃত", + "animationFailed": "অ্যানিমেশন ব্যর্থ হয়েছে {{attemptCount}} প্রচেষ্টা(গুলি) আবার চেষ্টা করবে...", + "animationInProgress": "অ্যানিমেশন চলছে", + "animationPending": "অ্যানিমেশন মুলতুবি...", + "animationSuccess": "অ্যানিমেশন সফল", + "requestingAnimation": "অ্যানিমেশন অনুরোধ", + "uploadingAudio": "অডিও আপলোড করা হচ্ছে", + "uploadingImage": "ছবি আপলোড করা হচ্ছে" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/bn/Footer.json b/packages/fakeyou.com/public/locales/bn/Footer.json new file mode 100644 index 0000000000..7376842547 --- /dev/null +++ b/packages/fakeyou.com/public/locales/bn/Footer.json @@ -0,0 +1,17 @@ +{ + "communityGuide": "গাইড", + "communityLeaderboard": "লিডারবোর্ড", + "communityProfile": "আমার প্রোফাইল", + "communityTitle": "সম্প্রদায়", + "infoAbout": "সম্পর্কিত", + "infoApiDocs": "API ডক্স", + "infoPricing": "মূল্য নির্ধারণ", + "infoPrivacyPolicy": "গোপনীয়তা নীতি", + "infoTerms": "ব্যবহারের শর্তাবলী", + "infoTitle": "তথ্য", + "productTts": "টেক্সট টু স্পিচ", + "productUploadModels": "আপলোড মডেল", + "productVc": "ভয়েস টু ভয়েস", + "productVideo": "ভিডিও লিপ সিঙ্ক", + "productsTitle": "এআই টুলস" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/bn/LandingPage.json b/packages/fakeyou.com/public/locales/bn/LandingPage.json new file mode 100644 index 0000000000..c08b43492a --- /dev/null +++ b/packages/fakeyou.com/public/locales/bn/LandingPage.json @@ -0,0 +1,12 @@ +{ + "community": { + "discordButton": "বিরোধ", + "heading": "কমিউনিটিতে যোগ দিন", + "text": "আমরা আপনার সাথে চ্যাট করতে চাই! আপনার কোন প্রশ্ন থাকলে অনুগ্রহ করে আমাদের সাথে ডিসকর্ডে যোগ দিন।", + "twitterButton": "টুইটার" + }, + "hero": { + "bottom": "FakeYou এর গভীর নকল প্রযুক্তির মাধ্যমে আপনি যা চান তা বলে আপনার প্রিয় চরিত্রগুলির অডিও বা ভিডিও তৈরি করুন৷", + "top": "এআই মিউজিক, টেক্সট টু স্পিচ এবং ভয়েস টু ভয়েস" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/bn/Rating.json b/packages/fakeyou.com/public/locales/bn/Rating.json new file mode 100644 index 0000000000..307eaf380d --- /dev/null +++ b/packages/fakeyou.com/public/locales/bn/Rating.json @@ -0,0 +1,9 @@ +{ + "buttonBad": "এই কন্ঠটা খারাপ লাগছে", + "buttonGood": "এই কন্ঠ ভাল শোনাচ্ছে", + "ratingBad": "ভয়েস খারাপ শোনাচ্ছে", + "ratingGood": "ভয়েস ভাল শোনাচ্ছে", + "ratingGreat": "ভয়েস দুর্দান্ত শোনাচ্ছে", + "ratingLabel": "রেটিং:", + "ratingOk": "ভয়েস ঠিক আছে শোনাচ্ছে" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/bn/RecordComponent.json b/packages/fakeyou.com/public/locales/bn/RecordComponent.json new file mode 100644 index 0000000000..02168c985e --- /dev/null +++ b/packages/fakeyou.com/public/locales/bn/RecordComponent.json @@ -0,0 +1,7 @@ +{ + "recordButtonClear": "পরিষ্কার", + "recordButtonStart": "রেকর্ড শুরু কর", + "recordButtonStop": "রেকর্ডিং বন্ধ করুন", + "recordButtonUploadAudio": "অডিও আপলোড করুন", + "recordButtonUploaded": "আপলোড করা হয়েছে" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/bn/SessionTtsInferenceResultList.json b/packages/fakeyou.com/public/locales/bn/SessionTtsInferenceResultList.json new file mode 100644 index 0000000000..9afc750aec --- /dev/null +++ b/packages/fakeyou.com/public/locales/bn/SessionTtsInferenceResultList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioShareDownload": "শেয়ার/ডাউনলোড করুন", + "resultsBlankSubText": "এখনো কোনো ফলাফল নেই", + "resultsBlankText": "তৈরি অডিও এখানে প্রদর্শিত হবে.", + "resultsProgressDead": "ত্রুটি!", + "resultsProgressFail": "ব্যর্থ {{0}} প্রচেষ্টা(গুলি) আবার চেষ্টা করবে...", + "resultsProgressPending": "বিচারাধীন...", + "resultsProgressStarted": "শুরু হয়েছে...", + "resultsProgressSuccess": "সম্পূর্ণ!", + "resultsTtsQueued": "TTS সারিবদ্ধ:", + "resultsUpgradeLinkText": "FakeYou সদস্যপদ", + "resultsUpgradeNotice": "অপেক্ষা করতে চান না? এ দিয়ে সারির সামনে যান" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/bn/SessionVoiceConversionResultsList.json b/packages/fakeyou.com/public/locales/bn/SessionVoiceConversionResultsList.json new file mode 100644 index 0000000000..87c6d2307d --- /dev/null +++ b/packages/fakeyou.com/public/locales/bn/SessionVoiceConversionResultsList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioDownload": "ডাউনলোড করুন", + "resultsBlankSubText": "এখনো কোনো ফলাফল নেই", + "resultsBlankText": "তৈরি অডিও এখানে প্রদর্শিত হবে.", + "resultsProgressDead": "ত্রুটি!", + "resultsProgressFail": "ব্যর্থ {{0}} প্রচেষ্টা(গুলি) আবার চেষ্টা করবে...", + "resultsProgressPending": "বিচারাধীন...", + "resultsProgressStarted": "শুরু হয়েছে...", + "resultsProgressSuccess": "সম্পূর্ণ!", + "resultsTtsQueued": "V2V সারিবদ্ধ:", + "resultsUpgradeLinkText": "FakeYou সদস্যপদ", + "resultsUpgradeNotice": "অপেক্ষা করতে চান না? এ দিয়ে সারির সামনে যান" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/bn/TopNav.json b/packages/fakeyou.com/public/locales/bn/TopNav.json new file mode 100644 index 0000000000..e97cefbc87 --- /dev/null +++ b/packages/fakeyou.com/public/locales/bn/TopNav.json @@ -0,0 +1,20 @@ +{ + "buttonLogOut": "প্রস্থান", + "buttonLogin": "প্রবেশ করুন", + "buttonSignUp": "নিবন্ধন করুন", + "communityGuide": "গাইড", + "communityLeaderboard": "লিডারবোর্ড", + "communityProfile": "আমার প্রোফাইল", + "communityTitle": "সম্প্রদায়", + "infoAbout": "সম্পর্কিত", + "infoApiDocs": "API ডক্স", + "infoPrivacyPolicy": "গোপনীয়তা নীতি", + "infoTerms": "ব্যবহারের শর্তাবলী", + "infoTitle": "তথ্য", + "pricingTitle": "মূল্য নির্ধারণ", + "productTts": "টেক্সট টু স্পিচ", + "productUploadModels": "আপলোড মডেল", + "productVc": "ভয়েস টু ভয়েস", + "productVideo": "ভিডিও লিপ সিঙ্ক", + "productsTitle": "এআই টুলস" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/bn/TtsModelListPage.json b/packages/fakeyou.com/public/locales/bn/TtsModelListPage.json new file mode 100644 index 0000000000..070fab61a4 --- /dev/null +++ b/packages/fakeyou.com/public/locales/bn/TtsModelListPage.json @@ -0,0 +1,24 @@ +{ + "heroButtonPricing": "মূল্য দেখুন", + "heroButtonProfile": "আমার প্রোফাইল দেখ", + "heroButtonSignUp": "নিবন্ধন করুন", + "heroButtonUpgradePlan": "আপগ্রেড পরিকল্পনা", + "heroText": "পাঠ্যকে আপনার প্রিয় চরিত্রের কথা বলার ভয়েসে পরিণত করুন।", + "heroTitle": "টেক্সট টু স্পিচ", + "ttsButtonClear": "পাঠ্য সাফ করুন", + "ttsButtonExplore": "ভয়েস এক্সপ্লোর করুন", + "ttsButtonRandom": "এলোমেলো ভয়েস", + "ttsButtonSpeak": "কথা বলুন", + "ttsDetailsLanguageLabel": "ভাষা:", + "ttsDetailsViewLink": "আরো বিস্তারিত দেখুন", + "ttsExploreButtonClearFilter": "বিভাগ ফিল্টার সাফ করুন", + "ttsExploreCategoryLabel": "শ্রেণী", + "ttsExploreCategoryOptionText": "বিভাগ নির্বাচন করুন...", + "ttsExploreLanguageLabel": "ভাষা", + "ttsExploreLanguageOptionText": "সকল ভাষা", + "ttsResultsTitle": "সেশন TTS ফলাফল", + "ttsTextInputLabel": "আমার স্নাতকের", + "ttsTextInputPlaceholder": "আপনি চান লেখা লিখুন {{character}} এখানে বলতে...", + "ttsTooManyRequests": "<b>আপনি অনেক অনুরোধ পাঠাচ্ছেন!</b> একটু ধীরে ধীরে। সার্ভার ব্যস্ত হয়ে গেলে আমাদের জিনিসগুলিকে কিছুটা ধীর করতে হবে।", + "ttsVoiceLabel": "ভয়েস ({{0}} থেকে বাছাই করা)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/bn/UploadComponent.json b/packages/fakeyou.com/public/locales/bn/UploadComponent.json new file mode 100644 index 0000000000..1f05548c54 --- /dev/null +++ b/packages/fakeyou.com/public/locales/bn/UploadComponent.json @@ -0,0 +1,8 @@ +{ + "uploadButtonClear": "পরিষ্কার", + "uploadButtonUploadAudio": "অডিও আপলোড করুন", + "uploadButtonUploaded": "আপলোড করা হয়েছে", + "uploadChangeFile": "ফাইল পরিবর্তন করুন", + "uploadFileTextDrop": "অথবা এখানে ফেলে দিন", + "uploadFileTextUpload": "একটি ফাইল আপলোড" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/bn/VcModelListPage.json b/packages/fakeyou.com/public/locales/bn/VcModelListPage.json new file mode 100644 index 0000000000..09a3b9a593 --- /dev/null +++ b/packages/fakeyou.com/public/locales/bn/VcModelListPage.json @@ -0,0 +1,18 @@ +{ + "heroButtonPricing": "মূল্য দেখুন", + "heroButtonProfile": "আমার প্রোফাইল দেখ", + "heroButtonSignUp": "নিবন্ধন করুন", + "heroButtonUpgradePlan": "আপগ্রেড পরিকল্পনা", + "heroText": "আপনার পছন্দের অক্ষরে আপনার ভয়েস পরিবর্তন করতে এই টুল ব্যবহার করুন.", + "heroTitle": "ভয়েস টু ভয়েস", + "vcButtonConvert": "রূপান্তর করুন", + "vcConvertLabel": "অডিও রূপান্তর করুন", + "vcPitchControlF0": "গান গাওয়ার জন্য বন্ধ, বক্তৃতা জন্য", + "vcPitchControlLabel": "পিচ নিয়ন্ত্রণ", + "vcRecordAudioLabel": "অডিও রেকর্ড করুন", + "vcResultsTitle": "সেশন V2V ফলাফল", + "vcTabRecord": "মাইক্রোফোন", + "vcTabUpload": "আপলোড করুন", + "vcUploadFileLabel": "ইনপুট অডিও আপলোড করুন", + "vcVoiceLabel": "টার্গেট ভয়েস চয়ন করুন ({{0}} থেকে বাছাই করা)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/de/FaceAnimation.json b/packages/fakeyou.com/public/locales/de/FaceAnimation.json new file mode 100644 index 0000000000..3762555988 --- /dev/null +++ b/packages/fakeyou.com/public/locales/de/FaceAnimation.json @@ -0,0 +1,5 @@ +{ + "hero": { + "title": "Lorem ipsum" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/de/FaceAnimator.json b/packages/fakeyou.com/public/locales/de/FaceAnimator.json new file mode 100644 index 0000000000..0f548fb2c8 --- /dev/null +++ b/packages/fakeyou.com/public/locales/de/FaceAnimator.json @@ -0,0 +1,24 @@ +{ + "headings": { + "audio": "Audio", + "image": "Bild", + "subtitle": "Wählen Sie ein Bild mit einem klaren Gesicht und einem Audiobeispiel aus und erstellen Sie ein lippensynchrones Video.", + "title": "Gesichtsanimator" + }, + "inputs": { + "downloadFile": "Download-Datei", + "generate": "Generieren", + "makeAnother": "Mach etwas anderes" + }, + "status": { + "animationComplete": "Animation abgeschlossen!", + "animationDead": "Animationsanfrage tot", + "animationFailed": "Animation fehlgeschlagen {{attemptCount}} Versuche). Werde es noch einmal versuchen...", + "animationInProgress": "Animation läuft", + "animationPending": "Animation ausstehend...", + "animationSuccess": "Animation gelungen", + "requestingAnimation": "Animation anfordern", + "uploadingAudio": "Audio hochladen", + "uploadingImage": "Bild hochladen" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/de/Footer.json b/packages/fakeyou.com/public/locales/de/Footer.json new file mode 100644 index 0000000000..a526b6e4be --- /dev/null +++ b/packages/fakeyou.com/public/locales/de/Footer.json @@ -0,0 +1,17 @@ +{ + "communityGuide": "Führung", + "communityLeaderboard": "Bestenliste", + "communityProfile": "Mein Profil", + "communityTitle": "Gemeinschaft", + "infoAbout": "Um", + "infoApiDocs": "API-Dokumente", + "infoPricing": "Preisgestaltung", + "infoPrivacyPolicy": "Datenschutzrichtlinie", + "infoTerms": "Nutzungsbedingungen", + "infoTitle": "Die Info", + "productTts": "Text zu Sprache", + "productUploadModels": "Modelle hochladen", + "productVc": "Stimme zu Stimme", + "productVideo": "Video-Lippensynchronisation", + "productsTitle": "KI-Tools" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/de/LandingPage.json b/packages/fakeyou.com/public/locales/de/LandingPage.json new file mode 100644 index 0000000000..beae4d4419 --- /dev/null +++ b/packages/fakeyou.com/public/locales/de/LandingPage.json @@ -0,0 +1,12 @@ +{ + "community": { + "discordButton": "Zwietracht", + "heading": "Trete der Community bei", + "text": "Wir würden uns freuen, mit Ihnen zu chatten! Bitte treten Sie uns im Discord bei, wenn Sie Fragen haben.", + "twitterButton": "Twitter" + }, + "hero": { + "bottom": "Generieren Sie mit der Deep-Fake-Technologie von FakeYou Audio- oder Videoaufnahmen Ihrer Lieblingscharaktere, die alles sagen, was Sie wollen.", + "top": "KI-Musik, Text-to-Speech und Voice-to-Voice" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/de/Rating.json b/packages/fakeyou.com/public/locales/de/Rating.json new file mode 100644 index 0000000000..9f7537afd6 --- /dev/null +++ b/packages/fakeyou.com/public/locales/de/Rating.json @@ -0,0 +1,9 @@ +{ + "buttonBad": "Diese Stimme klingt schlecht", + "buttonGood": "Diese Stimme klingt gut", + "ratingBad": "Stimme klingt schlecht", + "ratingGood": "Stimme klingt gut", + "ratingGreat": "Stimme klingt großartig", + "ratingLabel": "Bewertung:", + "ratingOk": "Die Stimme klingt in Ordnung" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/de/RecordComponent.json b/packages/fakeyou.com/public/locales/de/RecordComponent.json new file mode 100644 index 0000000000..2e43a3c0a1 --- /dev/null +++ b/packages/fakeyou.com/public/locales/de/RecordComponent.json @@ -0,0 +1,7 @@ +{ + "recordButtonClear": "Klar", + "recordButtonStart": "Starte die Aufnahme", + "recordButtonStop": "Höre auf, aufzunehmen", + "recordButtonUploadAudio": "Audio hochladen", + "recordButtonUploaded": "Hochgeladen" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/de/SessionTtsInferenceResultList.json b/packages/fakeyou.com/public/locales/de/SessionTtsInferenceResultList.json new file mode 100644 index 0000000000..b3820e4652 --- /dev/null +++ b/packages/fakeyou.com/public/locales/de/SessionTtsInferenceResultList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioShareDownload": "Teilen/Herunterladen", + "resultsBlankSubText": "Noch keine Ergebnisse", + "resultsBlankText": "Generiertes Audio wird hier angezeigt.", + "resultsProgressDead": "Fehler!", + "resultsProgressFail": "Fehlgeschlagen {{0}} Versuche). Werde es noch einmal versuchen...", + "resultsProgressPending": "Ausstehend...", + "resultsProgressStarted": "Gestartet...", + "resultsProgressSuccess": "Vollständig!", + "resultsTtsQueued": "TTS in der Warteschlange:", + "resultsUpgradeLinkText": "FakeYou-Mitgliedschaft", + "resultsUpgradeNotice": "Sie möchten nicht warten? Springen Sie mit a an den Anfang der Warteschlange" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/de/SessionVoiceConversionResultsList.json b/packages/fakeyou.com/public/locales/de/SessionVoiceConversionResultsList.json new file mode 100644 index 0000000000..9ba6c390f5 --- /dev/null +++ b/packages/fakeyou.com/public/locales/de/SessionVoiceConversionResultsList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioDownload": "Herunterladen", + "resultsBlankSubText": "Noch keine Ergebnisse", + "resultsBlankText": "Generiertes Audio wird hier angezeigt.", + "resultsProgressDead": "Fehler!", + "resultsProgressFail": "Fehlgeschlagen {{0}} Versuche). Werde es noch einmal versuchen...", + "resultsProgressPending": "Ausstehend...", + "resultsProgressStarted": "Gestartet...", + "resultsProgressSuccess": "Vollständig!", + "resultsTtsQueued": "V2V in der Warteschlange:", + "resultsUpgradeLinkText": "FakeYou-Mitgliedschaft", + "resultsUpgradeNotice": "Sie möchten nicht warten? Springen Sie mit a an den Anfang der Warteschlange" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/de/TopNav.json b/packages/fakeyou.com/public/locales/de/TopNav.json new file mode 100644 index 0000000000..ce126a8fd4 --- /dev/null +++ b/packages/fakeyou.com/public/locales/de/TopNav.json @@ -0,0 +1,20 @@ +{ + "buttonLogOut": "Ausloggen", + "buttonLogin": "Anmeldung", + "buttonSignUp": "Melden Sie sich an", + "communityGuide": "Führung", + "communityLeaderboard": "Bestenliste", + "communityProfile": "Mein Profil", + "communityTitle": "Gemeinschaft", + "infoAbout": "Um", + "infoApiDocs": "API-Dokumente", + "infoPrivacyPolicy": "Datenschutzrichtlinie", + "infoTerms": "Nutzungsbedingungen", + "infoTitle": "Die Info", + "pricingTitle": "Preisgestaltung", + "productTts": "Text zu Sprache", + "productUploadModels": "Modelle hochladen", + "productVc": "Stimme zu Stimme", + "productVideo": "Video-Lippensynchronisation", + "productsTitle": "KI-Tools" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/de/TtsModelListPage.json b/packages/fakeyou.com/public/locales/de/TtsModelListPage.json new file mode 100644 index 0000000000..697823d5a9 --- /dev/null +++ b/packages/fakeyou.com/public/locales/de/TtsModelListPage.json @@ -0,0 +1,24 @@ +{ + "heroButtonPricing": "Preise anzeigen", + "heroButtonProfile": "Sehen Sie sich mein Profil an", + "heroButtonSignUp": "Melden Sie sich an", + "heroButtonUpgradePlan": "Upgrade-Plan", + "heroText": "Verwandeln Sie Text in die Sprechstimme Ihres Lieblingscharakters.", + "heroTitle": "Text zu Sprache", + "ttsButtonClear": "Klartext", + "ttsButtonExplore": "Entdecken Sie Stimmen", + "ttsButtonRandom": "Zufällige Stimme", + "ttsButtonSpeak": "Sprechen", + "ttsDetailsLanguageLabel": "Sprache:", + "ttsDetailsViewLink": "Weitere Details anzeigen", + "ttsExploreButtonClearFilter": "Kategoriefilter löschen", + "ttsExploreCategoryLabel": "Kategorie", + "ttsExploreCategoryOptionText": "Kategorie wählen...", + "ttsExploreLanguageLabel": "Sprache", + "ttsExploreLanguageOptionText": "Alle Sprachen", + "ttsResultsTitle": "Sitzungs-TTS-Ergebnisse", + "ttsTextInputLabel": "Dein Text", + "ttsTextInputPlaceholder": "Geben Sie den gewünschten Text ein {{character}} hier zu sagen...", + "ttsTooManyRequests": "<b>Sie senden zu viele Anfragen!</b> Machen Sie es etwas langsamer. Wir müssen die Geschwindigkeit etwas verlangsamen, wenn der Server ausgelastet ist.", + "ttsVoiceLabel": "Stimme ({{0}} wählen von)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/de/UploadComponent.json b/packages/fakeyou.com/public/locales/de/UploadComponent.json new file mode 100644 index 0000000000..6e90a10de6 --- /dev/null +++ b/packages/fakeyou.com/public/locales/de/UploadComponent.json @@ -0,0 +1,8 @@ +{ + "uploadButtonClear": "Klar", + "uploadButtonUploadAudio": "Audio hochladen", + "uploadButtonUploaded": "Hochgeladen", + "uploadChangeFile": "Datei ändern", + "uploadFileTextDrop": "oder lass es hier fallen", + "uploadFileTextUpload": "Eine Datei hochladen" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/de/VcModelListPage.json b/packages/fakeyou.com/public/locales/de/VcModelListPage.json new file mode 100644 index 0000000000..b8ba406fc2 --- /dev/null +++ b/packages/fakeyou.com/public/locales/de/VcModelListPage.json @@ -0,0 +1,18 @@ +{ + "heroButtonPricing": "Preise anzeigen", + "heroButtonProfile": "Sehen Sie sich mein Profil an", + "heroButtonSignUp": "Melden Sie sich an", + "heroButtonUpgradePlan": "Upgrade-Plan", + "heroText": "Verwenden Sie dieses Tool, um Ihre Stimme in Ihre Lieblingscharaktere zu verwandeln.", + "heroTitle": "Stimme zu Stimme", + "vcButtonConvert": "Konvertieren", + "vcConvertLabel": "Audio konvertieren", + "vcPitchControlF0": "aus zum Singen, an zum Reden", + "vcPitchControlLabel": "Tonhöhenregelung", + "vcRecordAudioLabel": "Ton aufnehmen", + "vcResultsTitle": "Ergebnisse der Sitzung V2V", + "vcTabRecord": "Mikrofon", + "vcTabUpload": "Hochladen", + "vcUploadFileLabel": "Laden Sie Eingabeaudio hoch", + "vcVoiceLabel": "Wählen Sie Zielstimme ({{0}} wählen von)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/en/FaceAnimation.json b/packages/fakeyou.com/public/locales/en/FaceAnimation.json new file mode 100644 index 0000000000..3762555988 --- /dev/null +++ b/packages/fakeyou.com/public/locales/en/FaceAnimation.json @@ -0,0 +1,5 @@ +{ + "hero": { + "title": "Lorem ipsum" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/en/FaceAnimator.json b/packages/fakeyou.com/public/locales/en/FaceAnimator.json new file mode 100644 index 0000000000..f1bbaeacda --- /dev/null +++ b/packages/fakeyou.com/public/locales/en/FaceAnimator.json @@ -0,0 +1,24 @@ +{ + "headings": { + "audio": "Audio", + "image": "Image", + "subtitle": "Select and image with a clear face, and an audio sample, and generate a lipsynced video.", + "title": "Face Animator" + }, + "inputs": { + "downloadFile": "Download File", + "generate": "Generate", + "makeAnother": "Make another" + }, + "status": { + "animationComplete": "Animation complete!", + "animationDead": "Animation request dead", + "animationFailed": "Animation failed {{attemptCount}} attempt(s). Will retry...", + "animationInProgress": "Animation in progress", + "animationPending": "Animation pending...", + "animationSuccess": "Animation successful", + "requestingAnimation": "Requesting Animation", + "uploadingAudio": "Uploading Audio", + "uploadingImage": "Uploading Image" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/en/Footer.json b/packages/fakeyou.com/public/locales/en/Footer.json new file mode 100644 index 0000000000..102339e70b --- /dev/null +++ b/packages/fakeyou.com/public/locales/en/Footer.json @@ -0,0 +1,18 @@ +{ + "communityDiscord": "Discord", + "communityGuide": "Guide", + "communityLeaderboard": "Leaderboard", + "communityProfile": "My Profile", + "communityTitle": "Community", + "infoAbout": "About", + "infoApiDocs": "API Docs", + "infoPricing": "Pricing", + "infoPrivacyPolicy": "Privacy Policy", + "infoTerms": "Terms of Use", + "infoTitle": "Info", + "productTts": "Text to Speech", + "productUploadModels": "Upload Models", + "productVc": "Voice to Voice", + "productVideo": "Video Lip Sync", + "productsTitle": "AI Tools" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/en/Rating.json b/packages/fakeyou.com/public/locales/en/Rating.json new file mode 100644 index 0000000000..26bc488901 --- /dev/null +++ b/packages/fakeyou.com/public/locales/en/Rating.json @@ -0,0 +1,9 @@ +{ + "buttonBad": "This voice sounds bad", + "buttonGood": "This voice sounds good", + "ratingBad": "Voice Sounds Bad", + "ratingGood": "Voice Sounds Good", + "ratingGreat": "Voice Sounds Great", + "ratingLabel": "Rating:", + "ratingOk": "Voice Sounds Okay" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/en/RecordComponent.json b/packages/fakeyou.com/public/locales/en/RecordComponent.json new file mode 100644 index 0000000000..785bfe7c95 --- /dev/null +++ b/packages/fakeyou.com/public/locales/en/RecordComponent.json @@ -0,0 +1,7 @@ +{ + "recordButtonClear": "Clear", + "recordButtonStart": "Start Recording", + "recordButtonStop": "Stop Recording", + "recordButtonUploadAudio": "Upload Audio", + "recordButtonUploaded": "Uploaded" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/en/SessionTtsInferenceResultList.json b/packages/fakeyou.com/public/locales/en/SessionTtsInferenceResultList.json new file mode 100644 index 0000000000..f889cd47f7 --- /dev/null +++ b/packages/fakeyou.com/public/locales/en/SessionTtsInferenceResultList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioShareDownload": "Share/Download", + "resultsBlankSubText": "No results yet", + "resultsBlankText": "Generated audio will appear here.", + "resultsProgressDead": "Error!", + "resultsProgressFail": "Failed {{0}} attempt(s). Will retry...", + "resultsProgressPending": "Pending...", + "resultsProgressStarted": "Started...", + "resultsProgressSuccess": "Complete!", + "resultsTtsQueued": "TTS Queued:", + "resultsUpgradeLinkText": "FakeYou membership", + "resultsUpgradeNotice": "Don't want to wait? Skip to the front of the queue with a" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/en/SessionVoiceConversionResultsList.json b/packages/fakeyou.com/public/locales/en/SessionVoiceConversionResultsList.json new file mode 100644 index 0000000000..3eced1329c --- /dev/null +++ b/packages/fakeyou.com/public/locales/en/SessionVoiceConversionResultsList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioDownload": "Download", + "resultsBlankSubText": "No results yet", + "resultsBlankText": "Generated audio will appear here.", + "resultsProgressDead": "Error!", + "resultsProgressFail": "Failed {{0}} attempt(s). Will retry...", + "resultsProgressPending": "Pending...", + "resultsProgressStarted": "Started...", + "resultsProgressSuccess": "Complete!", + "resultsTtsQueued": "V2V Queued:", + "resultsUpgradeLinkText": "FakeYou membership", + "resultsUpgradeNotice": "Don't want to wait? Skip to the front of the queue with a" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/en/TopNav.json b/packages/fakeyou.com/public/locales/en/TopNav.json new file mode 100644 index 0000000000..9ec7f8664c --- /dev/null +++ b/packages/fakeyou.com/public/locales/en/TopNav.json @@ -0,0 +1,21 @@ +{ + "buttonLogOut": "Log Out", + "buttonLogin": "Login", + "buttonSignUp": "Sign Up", + "communityDiscord": "Discord", + "communityGuide": "Guide", + "communityLeaderboard": "Leaderboard", + "communityProfile": "My Profile", + "communityTitle": "Community", + "infoAbout": "About", + "infoApiDocs": "API Docs", + "infoPrivacyPolicy": "Privacy Policy", + "infoTerms": "Terms of Use", + "infoTitle": "Info", + "pricingTitle": "Pricing", + "productTts": "Text to Speech", + "productUploadModels": "Upload Models", + "productVc": "Voice to Voice", + "productVideo": "Video Lip Sync", + "productsTitle": "AI Tools" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/en/TtsModelListPage.json b/packages/fakeyou.com/public/locales/en/TtsModelListPage.json new file mode 100644 index 0000000000..475e1e2853 --- /dev/null +++ b/packages/fakeyou.com/public/locales/en/TtsModelListPage.json @@ -0,0 +1,24 @@ +{ + "heroButtonPricing": "View Pricing", + "heroButtonProfile": "View my Profile", + "heroButtonSignUp": "Sign Up", + "heroButtonUpgradePlan": "Upgrade Plan", + "heroText": "Turn text into your favorite character's speaking voice.", + "heroTitle": "Text to Speech", + "ttsButtonClear": "Clear Text", + "ttsButtonExplore": "Explore Voices", + "ttsButtonRandom": "Random Voice", + "ttsButtonSpeak": "Speak", + "ttsDetailsLanguageLabel": "Language:", + "ttsDetailsViewLink": "See more details", + "ttsExploreButtonClearFilter": "Clear category filters", + "ttsExploreCategoryLabel": "Category", + "ttsExploreCategoryOptionText": "Select category...", + "ttsExploreLanguageLabel": "Language", + "ttsExploreLanguageOptionText": "All Languages", + "ttsResultsTitle": "Session TTS Results", + "ttsTextInputLabel": "Your Text", + "ttsTextInputPlaceholder": "Enter the text you want {{character}} to say here...", + "ttsTooManyRequests": "<b>You're sending too many requests!</b> Slow down a little. We have to slow things down a little when the server gets busy.", + "ttsVoiceLabel": "Voice ({{0}} to choose from)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/en/UploadComponent.json b/packages/fakeyou.com/public/locales/en/UploadComponent.json new file mode 100644 index 0000000000..557d21e157 --- /dev/null +++ b/packages/fakeyou.com/public/locales/en/UploadComponent.json @@ -0,0 +1,8 @@ +{ + "uploadButtonClear": "Clear", + "uploadButtonUploadAudio": "Upload Audio", + "uploadButtonUploaded": "Uploaded", + "uploadChangeFile": "Change file", + "uploadFileTextDrop": "or drop it here", + "uploadFileTextUpload": "Upload a file" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/en/VcModelListPage.json b/packages/fakeyou.com/public/locales/en/VcModelListPage.json new file mode 100644 index 0000000000..bd5aeb19b5 --- /dev/null +++ b/packages/fakeyou.com/public/locales/en/VcModelListPage.json @@ -0,0 +1,18 @@ +{ + "heroButtonPricing": "View Pricing", + "heroButtonProfile": "View my Profile", + "heroButtonSignUp": "Sign Up", + "heroButtonUpgradePlan": "Upgrade Plan", + "heroText": "Use this tool to change your voice into your favorite characters.", + "heroTitle": "Voice to Voice", + "vcButtonConvert": "Convert", + "vcConvertLabel": "Convert Audio", + "vcPitchControlF0": "off for singing, on for speech", + "vcPitchControlLabel": "Pitch Control", + "vcRecordAudioLabel": "Record Audio", + "vcResultsTitle": "Session V2V Results", + "vcTabRecord": "Microphone", + "vcTabUpload": "Upload", + "vcUploadFileLabel": "Upload Input Audio", + "vcVoiceLabel": "Choose Target Voice ({{0}} to choose from)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/es/FaceAnimation.json b/packages/fakeyou.com/public/locales/es/FaceAnimation.json new file mode 100644 index 0000000000..54737a4788 --- /dev/null +++ b/packages/fakeyou.com/public/locales/es/FaceAnimation.json @@ -0,0 +1,5 @@ +{ + "hero": { + "title": "lorem ipsum" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/es/FaceAnimator.json b/packages/fakeyou.com/public/locales/es/FaceAnimator.json new file mode 100644 index 0000000000..9bb3dd2082 --- /dev/null +++ b/packages/fakeyou.com/public/locales/es/FaceAnimator.json @@ -0,0 +1,24 @@ +{ + "headings": { + "audio": "Audio", + "image": "Imagen", + "subtitle": "Seleccione una imagen con una cara clara y una muestra de audio, y genere un video sincronizado con los labios.", + "title": "Animador de rostros" + }, + "inputs": { + "downloadFile": "Descargar archivo", + "generate": "Generar", + "makeAnother": "Hacer otro" + }, + "status": { + "animationComplete": "¡Animación completa!", + "animationDead": "Solicitud de animación muerta", + "animationFailed": "La animación falló {{attemptCount}} intento(s). Lo volveré a intentar...", + "animationInProgress": "Animación en progreso", + "animationPending": "Animación pendiente...", + "animationSuccess": "Animación exitosa", + "requestingAnimation": "Solicitando animación", + "uploadingAudio": "Subiendo audio", + "uploadingImage": "Subiendo imagen" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/es/Footer.json b/packages/fakeyou.com/public/locales/es/Footer.json new file mode 100644 index 0000000000..a3f65ecd79 --- /dev/null +++ b/packages/fakeyou.com/public/locales/es/Footer.json @@ -0,0 +1,17 @@ +{ + "communityGuide": "Guía", + "communityLeaderboard": "Tabla de clasificación", + "communityProfile": "Mi perfil", + "communityTitle": "Comunidad", + "infoAbout": "Acerca de", + "infoApiDocs": "Documentos API", + "infoPricing": "Precios", + "infoPrivacyPolicy": "política de privacidad", + "infoTerms": "Condiciones de uso", + "infoTitle": "Información", + "productTts": "Texto a voz", + "productUploadModels": "Subir modelos", + "productVc": "Voz a Voz", + "productVideo": "Sincronización de labios de vídeo", + "productsTitle": "Herramientas de IA" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/es/LandingPage.json b/packages/fakeyou.com/public/locales/es/LandingPage.json index a33dc1b254..a70de48446 100644 --- a/packages/fakeyou.com/public/locales/es/LandingPage.json +++ b/packages/fakeyou.com/public/locales/es/LandingPage.json @@ -1,12 +1,12 @@ { "community": { - "discordButton": "Discord", + "discordButton": "Discordia", "heading": "Unete a la communidad", "text": "¡Nos encantaría charlar contigo! Únase a nosotros en Discord si tiene alguna pregunta.", - "twitterButton": "Twitter" + "twitterButton": "Gorjeo" }, "hero": { - "bottom": "Genera audios o videos de tus personajes favoritos diciendo lo que quieras con la tecnología deep fake de FakeYou.", - "top": "Música con AI, texto a voz y voz a voz" + "bottom": "Genera audio o videos de tus personajes favoritos diciendo lo que quieras con la tecnología deep fake de FakeYou.", + "top": "Música con IA, texto a voz y voz a voz" } } \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/es/Rating.json b/packages/fakeyou.com/public/locales/es/Rating.json new file mode 100644 index 0000000000..f10d5d24f2 --- /dev/null +++ b/packages/fakeyou.com/public/locales/es/Rating.json @@ -0,0 +1,9 @@ +{ + "buttonBad": "Esta voz suena mal", + "buttonGood": "esta voz suena bien", + "ratingBad": "La voz suena mal", + "ratingGood": "La voz suena bien", + "ratingGreat": "La voz suena genial", + "ratingLabel": "Clasificación:", + "ratingOk": "La voz suena bien" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/es/RecordComponent.json b/packages/fakeyou.com/public/locales/es/RecordComponent.json new file mode 100644 index 0000000000..3a2e898bea --- /dev/null +++ b/packages/fakeyou.com/public/locales/es/RecordComponent.json @@ -0,0 +1,7 @@ +{ + "recordButtonClear": "Claro", + "recordButtonStart": "Empezar a grabar", + "recordButtonStop": "Para de grabar", + "recordButtonUploadAudio": "Subir Audio", + "recordButtonUploaded": "subido" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/es/SessionTtsInferenceResultList.json b/packages/fakeyou.com/public/locales/es/SessionTtsInferenceResultList.json new file mode 100644 index 0000000000..e8ea989d99 --- /dev/null +++ b/packages/fakeyou.com/public/locales/es/SessionTtsInferenceResultList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioShareDownload": "Compartir/Descargar", + "resultsBlankSubText": "Aún no hay resultados", + "resultsBlankText": "El audio generado aparecerá aquí.", + "resultsProgressDead": "¡Error!", + "resultsProgressFail": "Fallido {{0}} intento(s). Lo volveré a intentar...", + "resultsProgressPending": "Pendiente...", + "resultsProgressStarted": "Comenzó...", + "resultsProgressSuccess": "¡Completo!", + "resultsTtsQueued": "TTS en cola:", + "resultsUpgradeLinkText": "Membresía falsa", + "resultsUpgradeNotice": "¿No quieres esperar? Salta al frente de la cola con un" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/es/SessionVoiceConversionResultsList.json b/packages/fakeyou.com/public/locales/es/SessionVoiceConversionResultsList.json new file mode 100644 index 0000000000..9b80750801 --- /dev/null +++ b/packages/fakeyou.com/public/locales/es/SessionVoiceConversionResultsList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioDownload": "Descargar", + "resultsBlankSubText": "Aún no hay resultados", + "resultsBlankText": "El audio generado aparecerá aquí.", + "resultsProgressDead": "¡Error!", + "resultsProgressFail": "Fallido {{0}} intento(s). Lo volveré a intentar...", + "resultsProgressPending": "Pendiente...", + "resultsProgressStarted": "Comenzó...", + "resultsProgressSuccess": "¡Completo!", + "resultsTtsQueued": "V2V en cola:", + "resultsUpgradeLinkText": "Membresía falsa", + "resultsUpgradeNotice": "¿No quieres esperar? Salta al frente de la cola con un" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/es/TopNav.json b/packages/fakeyou.com/public/locales/es/TopNav.json new file mode 100644 index 0000000000..c94f4c287c --- /dev/null +++ b/packages/fakeyou.com/public/locales/es/TopNav.json @@ -0,0 +1,20 @@ +{ + "buttonLogOut": "Cerrar sesión", + "buttonLogin": "Acceso", + "buttonSignUp": "Inscribirse", + "communityGuide": "Guía", + "communityLeaderboard": "Tabla de clasificación", + "communityProfile": "Mi perfil", + "communityTitle": "Comunidad", + "infoAbout": "Acerca de", + "infoApiDocs": "Documentos API", + "infoPrivacyPolicy": "política de privacidad", + "infoTerms": "Condiciones de uso", + "infoTitle": "Información", + "pricingTitle": "Precios", + "productTts": "Texto a voz", + "productUploadModels": "Subir modelos", + "productVc": "Voz a Voz", + "productVideo": "Sincronización de labios de vídeo", + "productsTitle": "Herramientas de IA" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/es/TtsModelListPage.json b/packages/fakeyou.com/public/locales/es/TtsModelListPage.json new file mode 100644 index 0000000000..d44329e93b --- /dev/null +++ b/packages/fakeyou.com/public/locales/es/TtsModelListPage.json @@ -0,0 +1,24 @@ +{ + "heroButtonPricing": "Ver precios", + "heroButtonProfile": "Mira mi perfil", + "heroButtonSignUp": "Inscribirse", + "heroButtonUpgradePlan": "Plan de actualización", + "heroText": "Convierte el texto en la voz de tu personaje favorito.", + "heroTitle": "Texto a voz", + "ttsButtonClear": "Borrar texto", + "ttsButtonExplore": "Explorar voces", + "ttsButtonRandom": "Voz aleatoria", + "ttsButtonSpeak": "Hablar", + "ttsDetailsLanguageLabel": "Idioma:", + "ttsDetailsViewLink": "Ver más detalles", + "ttsExploreButtonClearFilter": "Borrar filtros de categoría", + "ttsExploreCategoryLabel": "Categoría", + "ttsExploreCategoryOptionText": "Selecciona una categoría...", + "ttsExploreLanguageLabel": "Idioma", + "ttsExploreLanguageOptionText": "Todos los idiomas", + "ttsResultsTitle": "Resultados de TTS de la sesión", + "ttsTextInputLabel": "Tu texto", + "ttsTextInputPlaceholder": "Introduce el texto que quieras {{character}} decir aquí...", + "ttsTooManyRequests": "<b>¡Estás enviando demasiadas solicitudes!</b> Reduzca un poco la velocidad. Tenemos que ralentizar un poco las cosas cuando el servidor está ocupado.", + "ttsVoiceLabel": "Voz ({{0}} Para escoger de)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/es/UploadComponent.json b/packages/fakeyou.com/public/locales/es/UploadComponent.json new file mode 100644 index 0000000000..5b25bc9c37 --- /dev/null +++ b/packages/fakeyou.com/public/locales/es/UploadComponent.json @@ -0,0 +1,8 @@ +{ + "uploadButtonClear": "Claro", + "uploadButtonUploadAudio": "Subir Audio", + "uploadButtonUploaded": "subido", + "uploadChangeFile": "Cambiar archivo", + "uploadFileTextDrop": "o déjalo aquí", + "uploadFileTextUpload": "Cargar un archivo" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/es/VcModelListPage.json b/packages/fakeyou.com/public/locales/es/VcModelListPage.json new file mode 100644 index 0000000000..d1a918832d --- /dev/null +++ b/packages/fakeyou.com/public/locales/es/VcModelListPage.json @@ -0,0 +1,18 @@ +{ + "heroButtonPricing": "Ver precios", + "heroButtonProfile": "Mira mi perfil", + "heroButtonSignUp": "Inscribirse", + "heroButtonUpgradePlan": "Plan de actualización", + "heroText": "Utilice esta herramienta para cambiar su voz a la de sus personajes favoritos.", + "heroTitle": "Voz a Voz", + "vcButtonConvert": "Convertir", + "vcConvertLabel": "Convertir audio", + "vcPitchControlF0": "Fuera para cantar, encendido para hablar.", + "vcPitchControlLabel": "Control de tono", + "vcRecordAudioLabel": "Grabar audio", + "vcResultsTitle": "Resultados de la sesión V2V", + "vcTabRecord": "Micrófono", + "vcTabUpload": "Subir", + "vcUploadFileLabel": "Cargar audio de entrada", + "vcVoiceLabel": "Elija la voz de destino ({{0}} Para escoger de)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/fr/FaceAnimation.json b/packages/fakeyou.com/public/locales/fr/FaceAnimation.json new file mode 100644 index 0000000000..3762555988 --- /dev/null +++ b/packages/fakeyou.com/public/locales/fr/FaceAnimation.json @@ -0,0 +1,5 @@ +{ + "hero": { + "title": "Lorem ipsum" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/fr/FaceAnimator.json b/packages/fakeyou.com/public/locales/fr/FaceAnimator.json new file mode 100644 index 0000000000..4be8181533 --- /dev/null +++ b/packages/fakeyou.com/public/locales/fr/FaceAnimator.json @@ -0,0 +1,24 @@ +{ + "headings": { + "audio": "l'audio", + "image": "Image", + "subtitle": "Sélectionnez une image avec un visage clair et un échantillon audio, et générez une vidéo synchronisée sur les lèvres.", + "title": "Animateur de visage" + }, + "inputs": { + "downloadFile": "Télécharger un fichier", + "generate": "Générer", + "makeAnother": "Faire un autre" + }, + "status": { + "animationComplete": "Animation terminée !", + "animationDead": "Demande d'animation morte", + "animationFailed": "L'animation a échoué {{attemptCount}} tentatives). Je vais réessayer...", + "animationInProgress": "Animation en cours", + "animationPending": "Animation en attente...", + "animationSuccess": "Animation réussie", + "requestingAnimation": "Demander une animation", + "uploadingAudio": "Téléchargement d'audio", + "uploadingImage": "Téléchargement d'une image" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/fr/Footer.json b/packages/fakeyou.com/public/locales/fr/Footer.json new file mode 100644 index 0000000000..40ef1858a7 --- /dev/null +++ b/packages/fakeyou.com/public/locales/fr/Footer.json @@ -0,0 +1,17 @@ +{ + "communityGuide": "Guide", + "communityLeaderboard": "Classement", + "communityProfile": "Mon profil", + "communityTitle": "Communauté", + "infoAbout": "À propos", + "infoApiDocs": "Documentation sur l'API", + "infoPricing": "Tarifs", + "infoPrivacyPolicy": "politique de confidentialité", + "infoTerms": "Conditions d'utilisation", + "infoTitle": "Info", + "productTts": "Texte pour parler", + "productUploadModels": "Télécharger des modèles", + "productVc": "Voix à voix", + "productVideo": "Synchronisation labiale vidéo", + "productsTitle": "Outils d'IA" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/fr/LandingPage.json b/packages/fakeyou.com/public/locales/fr/LandingPage.json new file mode 100644 index 0000000000..fc69715a43 --- /dev/null +++ b/packages/fakeyou.com/public/locales/fr/LandingPage.json @@ -0,0 +1,12 @@ +{ + "community": { + "discordButton": "Discorde", + "heading": "Rejoignez la communauté", + "text": "Nous serions ravis de discuter avec vous ! Veuillez nous rejoindre sur Discord si vous avez des questions.", + "twitterButton": "Twitter" + }, + "hero": { + "bottom": "Générez de l'audio ou des vidéos de vos personnages préférés disant tout ce que vous voulez avec la technologie Deep Fake de FakeYou.", + "top": "Musique AI, synthèse vocale et voix à voix" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/fr/Rating.json b/packages/fakeyou.com/public/locales/fr/Rating.json new file mode 100644 index 0000000000..145e020a87 --- /dev/null +++ b/packages/fakeyou.com/public/locales/fr/Rating.json @@ -0,0 +1,9 @@ +{ + "buttonBad": "Cette voix sonne mal", + "buttonGood": "Cette voix sonne bien", + "ratingBad": "La voix sonne mal", + "ratingGood": "La voix sonne bien", + "ratingGreat": "La voix sonne bien", + "ratingLabel": "Notation:", + "ratingOk": "La voix sonne bien" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/fr/RecordComponent.json b/packages/fakeyou.com/public/locales/fr/RecordComponent.json new file mode 100644 index 0000000000..6fdc36903a --- /dev/null +++ b/packages/fakeyou.com/public/locales/fr/RecordComponent.json @@ -0,0 +1,7 @@ +{ + "recordButtonClear": "Clair", + "recordButtonStart": "Commencer l'enregistrement", + "recordButtonStop": "Arrête d'enregistrer", + "recordButtonUploadAudio": "Télécharger l'audio", + "recordButtonUploaded": "Téléchargé" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/fr/SessionTtsInferenceResultList.json b/packages/fakeyou.com/public/locales/fr/SessionTtsInferenceResultList.json new file mode 100644 index 0000000000..a68f5df49d --- /dev/null +++ b/packages/fakeyou.com/public/locales/fr/SessionTtsInferenceResultList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioShareDownload": "Partager/Télécharger", + "resultsBlankSubText": "Aucun résultat pour l'instant", + "resultsBlankText": "L'audio généré apparaîtra ici.", + "resultsProgressDead": "Erreur!", + "resultsProgressFail": "Échoué {{0}} tentatives). Je vais réessayer...", + "resultsProgressPending": "En attente...", + "resultsProgressStarted": "Commencé...", + "resultsProgressSuccess": "Complet!", + "resultsTtsQueued": "TTS en file d'attente :", + "resultsUpgradeLinkText": "Adhésion à FakeYou", + "resultsUpgradeNotice": "Vous ne voulez pas attendre ? Passez au début de la file d'attente avec un" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/fr/SessionVoiceConversionResultsList.json b/packages/fakeyou.com/public/locales/fr/SessionVoiceConversionResultsList.json new file mode 100644 index 0000000000..24fbd183f1 --- /dev/null +++ b/packages/fakeyou.com/public/locales/fr/SessionVoiceConversionResultsList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioDownload": "Télécharger", + "resultsBlankSubText": "Aucun résultat pour l'instant", + "resultsBlankText": "L'audio généré apparaîtra ici.", + "resultsProgressDead": "Erreur!", + "resultsProgressFail": "Échoué {{0}} tentatives). Je vais réessayer...", + "resultsProgressPending": "En attente...", + "resultsProgressStarted": "Commencé...", + "resultsProgressSuccess": "Complet!", + "resultsTtsQueued": "V2V en file d'attente :", + "resultsUpgradeLinkText": "Adhésion à FakeYou", + "resultsUpgradeNotice": "Vous ne voulez pas attendre ? Passez au début de la file d'attente avec un" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/fr/TopNav.json b/packages/fakeyou.com/public/locales/fr/TopNav.json new file mode 100644 index 0000000000..dd3ac2e01a --- /dev/null +++ b/packages/fakeyou.com/public/locales/fr/TopNav.json @@ -0,0 +1,20 @@ +{ + "buttonLogOut": "Se déconnecter", + "buttonLogin": "Se connecter", + "buttonSignUp": "S'inscrire", + "communityGuide": "Guide", + "communityLeaderboard": "Classement", + "communityProfile": "Mon profil", + "communityTitle": "Communauté", + "infoAbout": "À propos", + "infoApiDocs": "Documentation sur l'API", + "infoPrivacyPolicy": "politique de confidentialité", + "infoTerms": "Conditions d'utilisation", + "infoTitle": "Info", + "pricingTitle": "Tarifs", + "productTts": "Texte pour parler", + "productUploadModels": "Télécharger des modèles", + "productVc": "Voix à voix", + "productVideo": "Synchronisation labiale vidéo", + "productsTitle": "Outils d'IA" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/fr/TtsModelListPage.json b/packages/fakeyou.com/public/locales/fr/TtsModelListPage.json new file mode 100644 index 0000000000..4f5724f510 --- /dev/null +++ b/packages/fakeyou.com/public/locales/fr/TtsModelListPage.json @@ -0,0 +1,24 @@ +{ + "heroButtonPricing": "Voir les prix", + "heroButtonProfile": "Voir mon profil", + "heroButtonSignUp": "S'inscrire", + "heroButtonUpgradePlan": "Plan de mise à niveau", + "heroText": "Transformez le texte en voix parlante de votre personnage préféré.", + "heroTitle": "Texte pour parler", + "ttsButtonClear": "Effacer le texte", + "ttsButtonExplore": "Explorer les voix", + "ttsButtonRandom": "Voix aléatoire", + "ttsButtonSpeak": "Parler", + "ttsDetailsLanguageLabel": "Langue:", + "ttsDetailsViewLink": "Voir plus de détails", + "ttsExploreButtonClearFilter": "Effacer les filtres de catégorie", + "ttsExploreCategoryLabel": "Catégorie", + "ttsExploreCategoryOptionText": "Choisir une catégorie...", + "ttsExploreLanguageLabel": "Langue", + "ttsExploreLanguageOptionText": "Toutes les langues", + "ttsResultsTitle": "Résultats TTS de la session", + "ttsTextInputLabel": "Ton texte", + "ttsTextInputPlaceholder": "Saisissez le texte souhaité {{character}} dire ici...", + "ttsTooManyRequests": "<b>Vous envoyez trop de demandes !</b> Ralentissez un peu. Nous devons ralentir un peu les choses lorsque le serveur est occupé.", + "ttsVoiceLabel": "Voix ({{0}} au choix)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/fr/UploadComponent.json b/packages/fakeyou.com/public/locales/fr/UploadComponent.json new file mode 100644 index 0000000000..3edcade048 --- /dev/null +++ b/packages/fakeyou.com/public/locales/fr/UploadComponent.json @@ -0,0 +1,8 @@ +{ + "uploadButtonClear": "Clair", + "uploadButtonUploadAudio": "Télécharger l'audio", + "uploadButtonUploaded": "Téléchargé", + "uploadChangeFile": "Changer de fichier", + "uploadFileTextDrop": "ou dépose-le ici", + "uploadFileTextUpload": "Télécharger un fichier" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/fr/VcModelListPage.json b/packages/fakeyou.com/public/locales/fr/VcModelListPage.json new file mode 100644 index 0000000000..0b99ad17e2 --- /dev/null +++ b/packages/fakeyou.com/public/locales/fr/VcModelListPage.json @@ -0,0 +1,18 @@ +{ + "heroButtonPricing": "Voir les prix", + "heroButtonProfile": "Voir mon profil", + "heroButtonSignUp": "S'inscrire", + "heroButtonUpgradePlan": "Plan de mise à niveau", + "heroText": "Utilisez cet outil pour changer votre voix en vos personnages préférés.", + "heroTitle": "Voix à voix", + "vcButtonConvert": "Convertir", + "vcConvertLabel": "Convertir l'audio", + "vcPitchControlF0": "c'est parti pour chanter, c'est parti pour parler", + "vcPitchControlLabel": "Contrôle du pas", + "vcRecordAudioLabel": "Enregistrement audio", + "vcResultsTitle": "Résultats de la session V2V", + "vcTabRecord": "Microphone", + "vcTabUpload": "Télécharger", + "vcUploadFileLabel": "Télécharger l'audio d'entrée", + "vcVoiceLabel": "Choisissez la voix cible ({{0}} au choix)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/hi/FaceAnimation.json b/packages/fakeyou.com/public/locales/hi/FaceAnimation.json new file mode 100644 index 0000000000..ec594982de --- /dev/null +++ b/packages/fakeyou.com/public/locales/hi/FaceAnimation.json @@ -0,0 +1,5 @@ +{ + "hero": { + "title": "लोरेम इप्सम" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/hi/FaceAnimator.json b/packages/fakeyou.com/public/locales/hi/FaceAnimator.json new file mode 100644 index 0000000000..0888206075 --- /dev/null +++ b/packages/fakeyou.com/public/locales/hi/FaceAnimator.json @@ -0,0 +1,24 @@ +{ + "headings": { + "audio": "ऑडियो", + "image": "छवि", + "subtitle": "स्पष्ट चेहरे और एक ऑडियो नमूने के साथ चयन करें और छवि बनाएं, और एक लिपसिंक किया हुआ वीडियो बनाएं।", + "title": "फेस एनिमेटर" + }, + "inputs": { + "downloadFile": "डाउनलोड फ़ाइल", + "generate": "उत्पन्न", + "makeAnother": "एक और बनाने" + }, + "status": { + "animationComplete": "एनिमेशन पूर्ण!", + "animationDead": "एनिमेशन अनुरोध मृत", + "animationFailed": "एनिमेशन विफल रहा {{attemptCount}} प्रयास(कोशिशें)। पुनः प्रयास करेंगे...", + "animationInProgress": "एनीमेशन प्रगति पर है", + "animationPending": "एनिमेशन लंबित है...", + "animationSuccess": "एनीमेशन सफल", + "requestingAnimation": "एनीमेशन का अनुरोध", + "uploadingAudio": "ऑडियो अपलोड हो रहा है", + "uploadingImage": "छवि अपलोड हो रही है" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/hi/Footer.json b/packages/fakeyou.com/public/locales/hi/Footer.json new file mode 100644 index 0000000000..7241087257 --- /dev/null +++ b/packages/fakeyou.com/public/locales/hi/Footer.json @@ -0,0 +1,17 @@ +{ + "communityGuide": "मार्गदर्शक", + "communityLeaderboard": "लीडरबोर्ड", + "communityProfile": "मेरी प्रोफाइल", + "communityTitle": "समुदाय", + "infoAbout": "के बारे में", + "infoApiDocs": "एपीआई दस्तावेज़", + "infoPricing": "मूल्य निर्धारण", + "infoPrivacyPolicy": "गोपनीयता नीति", + "infoTerms": "उपयोग की शर्तें", + "infoTitle": "जानकारी", + "productTts": "भाषण के पाठ", + "productUploadModels": "मॉडल अपलोड करें", + "productVc": "आवाज से आवाज", + "productVideo": "वीडियो लिप सिंक", + "productsTitle": "एआई उपकरण" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/hi/LandingPage.json b/packages/fakeyou.com/public/locales/hi/LandingPage.json new file mode 100644 index 0000000000..816d754bd0 --- /dev/null +++ b/packages/fakeyou.com/public/locales/hi/LandingPage.json @@ -0,0 +1,12 @@ +{ + "community": { + "discordButton": "कलह", + "heading": "समुदाय में शामिल हों", + "text": "हमें आपसे चैट करना अच्छा लगेगा! यदि आपके कोई प्रश्न हैं तो कृपया डिस्कॉर्ड में हमसे जुड़ें।", + "twitterButton": "ट्विटर" + }, + "hero": { + "bottom": "FakeYou की गहरी नकली तकनीक के साथ अपने पसंदीदा पात्रों के कुछ भी कहने के ऑडियो या वीडियो बनाएं।", + "top": "एआई म्यूजिक, टेक्स्ट टू स्पीच और वॉइस टू वॉइस" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/hi/Rating.json b/packages/fakeyou.com/public/locales/hi/Rating.json new file mode 100644 index 0000000000..6f7e9fc563 --- /dev/null +++ b/packages/fakeyou.com/public/locales/hi/Rating.json @@ -0,0 +1,9 @@ +{ + "buttonBad": "यह आवाज़ ख़राब लगती है", + "buttonGood": "ये आवाज़ अच्छी लगती है", + "ratingBad": "आवाज़ ख़राब लगती है", + "ratingGood": "आवाज़ अच्छी लगती है", + "ratingGreat": "आवाज़ बहुत अच्छी लगती है", + "ratingLabel": "रेटिंग:", + "ratingOk": "आवाज़ ठीक लगती है" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/hi/RecordComponent.json b/packages/fakeyou.com/public/locales/hi/RecordComponent.json new file mode 100644 index 0000000000..8d7491f310 --- /dev/null +++ b/packages/fakeyou.com/public/locales/hi/RecordComponent.json @@ -0,0 +1,7 @@ +{ + "recordButtonClear": "स्पष्ट", + "recordButtonStart": "रिकॉर्डिंग शुरू", + "recordButtonStop": "रिकॉर्डिंग बंद करें", + "recordButtonUploadAudio": "ऑडियो अपलोड करें", + "recordButtonUploaded": "अपलोड किए गए" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/hi/SessionTtsInferenceResultList.json b/packages/fakeyou.com/public/locales/hi/SessionTtsInferenceResultList.json new file mode 100644 index 0000000000..6c3cc2ba40 --- /dev/null +++ b/packages/fakeyou.com/public/locales/hi/SessionTtsInferenceResultList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioShareDownload": "साझा करें/डाउनलोड करें", + "resultsBlankSubText": "अभी तक कोई परिणाम नहीं", + "resultsBlankText": "जेनरेट किया गया ऑडियो यहां दिखाई देगा.", + "resultsProgressDead": "गलती!", + "resultsProgressFail": "असफल {{0}} प्रयास(कोशिशें)। पुनः प्रयास करेंगे...", + "resultsProgressPending": "लंबित...", + "resultsProgressStarted": "शुरू कर दिया...", + "resultsProgressSuccess": "पूरा!", + "resultsTtsQueued": "टीटीएस कतारबद्ध:", + "resultsUpgradeLinkText": "फेकयू सदस्यता", + "resultsUpgradeNotice": "इंतज़ार नहीं करना चाहते? a के साथ कतार में सबसे आगे जाएँ" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/hi/SessionVoiceConversionResultsList.json b/packages/fakeyou.com/public/locales/hi/SessionVoiceConversionResultsList.json new file mode 100644 index 0000000000..f12adce991 --- /dev/null +++ b/packages/fakeyou.com/public/locales/hi/SessionVoiceConversionResultsList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioDownload": "डाउनलोड करना", + "resultsBlankSubText": "अभी तक कोई परिणाम नहीं", + "resultsBlankText": "जेनरेट किया गया ऑडियो यहां दिखाई देगा.", + "resultsProgressDead": "गलती!", + "resultsProgressFail": "असफल {{0}} प्रयास(कोशिशें)। पुनः प्रयास करेंगे...", + "resultsProgressPending": "लंबित...", + "resultsProgressStarted": "शुरू कर दिया...", + "resultsProgressSuccess": "पूरा!", + "resultsTtsQueued": "V2V पंक्तिबद्ध:", + "resultsUpgradeLinkText": "फेकयू सदस्यता", + "resultsUpgradeNotice": "इंतज़ार नहीं करना चाहते? a के साथ कतार में सबसे आगे जाएँ" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/hi/TopNav.json b/packages/fakeyou.com/public/locales/hi/TopNav.json new file mode 100644 index 0000000000..19a905e345 --- /dev/null +++ b/packages/fakeyou.com/public/locales/hi/TopNav.json @@ -0,0 +1,20 @@ +{ + "buttonLogOut": "लॉग आउट", + "buttonLogin": "लॉग इन करें", + "buttonSignUp": "साइन अप करें", + "communityGuide": "मार्गदर्शक", + "communityLeaderboard": "लीडरबोर्ड", + "communityProfile": "मेरी प्रोफाइल", + "communityTitle": "समुदाय", + "infoAbout": "के बारे में", + "infoApiDocs": "एपीआई दस्तावेज़", + "infoPrivacyPolicy": "गोपनीयता नीति", + "infoTerms": "उपयोग की शर्तें", + "infoTitle": "जानकारी", + "pricingTitle": "मूल्य निर्धारण", + "productTts": "भाषण के पाठ", + "productUploadModels": "मॉडल अपलोड करें", + "productVc": "आवाज से आवाज", + "productVideo": "वीडियो लिप सिंक", + "productsTitle": "एआई उपकरण" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/hi/TtsModelListPage.json b/packages/fakeyou.com/public/locales/hi/TtsModelListPage.json new file mode 100644 index 0000000000..7798029f12 --- /dev/null +++ b/packages/fakeyou.com/public/locales/hi/TtsModelListPage.json @@ -0,0 +1,24 @@ +{ + "heroButtonPricing": "मूल्य निर्धारण देखें", + "heroButtonProfile": "मेरा प्रोफ़ाइल देखो", + "heroButtonSignUp": "साइन अप करें", + "heroButtonUpgradePlan": "उन्नयन योजना", + "heroText": "टेक्स्ट को अपने पसंदीदा पात्र की बोलने वाली आवाज़ में बदलें।", + "heroTitle": "भाषण के पाठ", + "ttsButtonClear": "स्पष्ट पाठ", + "ttsButtonExplore": "आवाजों का अन्वेषण करें", + "ttsButtonRandom": "यादृच्छिक आवाज", + "ttsButtonSpeak": "बोलना", + "ttsDetailsLanguageLabel": "भाषा:", + "ttsDetailsViewLink": "अधिक विवरण देखें", + "ttsExploreButtonClearFilter": "श्रेणी फ़िल्टर साफ़ करें", + "ttsExploreCategoryLabel": "वर्ग", + "ttsExploreCategoryOptionText": "श्रेणी चुनना...", + "ttsExploreLanguageLabel": "भाषा", + "ttsExploreLanguageOptionText": "सारी भाषाएँ", + "ttsResultsTitle": "सत्र टीटीएस परिणाम", + "ttsTextInputLabel": "अपका संदेश", + "ttsTextInputPlaceholder": "अपना इच्छित पाठ दर्ज करें {{character}} यहाँ कहने के लिए...", + "ttsTooManyRequests": "<b>आप बहुत अधिक अनुरोध भेज रहे हैं!</b> थोड़ा धीरे करो. सर्वर व्यस्त होने पर हमें चीजों को थोड़ा धीमा करना पड़ता है।", + "ttsVoiceLabel": "आवाज़ ({{0}} से चुनने के लिए)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/hi/UploadComponent.json b/packages/fakeyou.com/public/locales/hi/UploadComponent.json new file mode 100644 index 0000000000..e8ead1d4e2 --- /dev/null +++ b/packages/fakeyou.com/public/locales/hi/UploadComponent.json @@ -0,0 +1,8 @@ +{ + "uploadButtonClear": "स्पष्ट", + "uploadButtonUploadAudio": "ऑडियो अपलोड करें", + "uploadButtonUploaded": "अपलोड किए गए", + "uploadChangeFile": "फ़ाइल बदलें", + "uploadFileTextDrop": "या इसे यहीं छोड़ दें", + "uploadFileTextUpload": "एक फ़ाइल अपलोड करें" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/hi/VcModelListPage.json b/packages/fakeyou.com/public/locales/hi/VcModelListPage.json new file mode 100644 index 0000000000..db519546d8 --- /dev/null +++ b/packages/fakeyou.com/public/locales/hi/VcModelListPage.json @@ -0,0 +1,18 @@ +{ + "heroButtonPricing": "मूल्य निर्धारण देखें", + "heroButtonProfile": "मेरा प्रोफ़ाइल देखो", + "heroButtonSignUp": "साइन अप करें", + "heroButtonUpgradePlan": "उन्नयन योजना", + "heroText": "अपनी आवाज़ को अपने पसंदीदा पात्रों में बदलने के लिए इस टूल का उपयोग करें।", + "heroTitle": "आवाज से आवाज", + "vcButtonConvert": "बदलना", + "vcConvertLabel": "ऑडियो कनवर्ट करें", + "vcPitchControlF0": "गायन के लिए, भाषण के लिए", + "vcPitchControlLabel": "पिच पर नियंत्रण", + "vcRecordAudioLabel": "ध्वनि रिकॉर्ड करें", + "vcResultsTitle": "सत्र V2V परिणाम", + "vcTabRecord": "माइक्रोफ़ोन", + "vcTabUpload": "डालना", + "vcUploadFileLabel": "इनपुट ऑडियो अपलोड करें", + "vcVoiceLabel": "लक्ष्य ध्वनि चुनें ({{0}} से चुनने के लिए)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/id/FaceAnimation.json b/packages/fakeyou.com/public/locales/id/FaceAnimation.json new file mode 100644 index 0000000000..3762555988 --- /dev/null +++ b/packages/fakeyou.com/public/locales/id/FaceAnimation.json @@ -0,0 +1,5 @@ +{ + "hero": { + "title": "Lorem ipsum" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/id/FaceAnimator.json b/packages/fakeyou.com/public/locales/id/FaceAnimator.json new file mode 100644 index 0000000000..7af6a405a6 --- /dev/null +++ b/packages/fakeyou.com/public/locales/id/FaceAnimator.json @@ -0,0 +1,24 @@ +{ + "headings": { + "audio": "Audio", + "image": "Gambar", + "subtitle": "Pilih dan gambar dengan wajah jernih, dan sampel audio, lalu buat video lipsync.", + "title": "Animator Wajah" + }, + "inputs": { + "downloadFile": "Unduh berkas", + "generate": "Menghasilkan", + "makeAnother": "Buat yang lain" + }, + "status": { + "animationComplete": "Animasi selesai!", + "animationDead": "Permintaan animasi mati", + "animationFailed": "Animasi gagal {{attemptCount}} upaya. Akan mencoba lagi...", + "animationInProgress": "Animasi sedang berlangsung", + "animationPending": "Animasi tertunda...", + "animationSuccess": "Animasi berhasil", + "requestingAnimation": "Meminta Animasi", + "uploadingAudio": "Mengunggah Audio", + "uploadingImage": "Mengunggah Gambar" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/id/Footer.json b/packages/fakeyou.com/public/locales/id/Footer.json new file mode 100644 index 0000000000..edf1d67743 --- /dev/null +++ b/packages/fakeyou.com/public/locales/id/Footer.json @@ -0,0 +1,17 @@ +{ + "communityGuide": "Memandu", + "communityLeaderboard": "Papan peringkat", + "communityProfile": "Profil saya", + "communityTitle": "Masyarakat", + "infoAbout": "Tentang", + "infoApiDocs": "Dokumen API", + "infoPricing": "Harga", + "infoPrivacyPolicy": "Kebijakan pribadi", + "infoTerms": "Syarat Penggunaan", + "infoTitle": "Informasi", + "productTts": "Teks pidato", + "productUploadModels": "Unggah Model", + "productVc": "Suara ke Suara", + "productVideo": "Sinkronisasi Bibir Video", + "productsTitle": "Alat AI" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/id/LandingPage.json b/packages/fakeyou.com/public/locales/id/LandingPage.json new file mode 100644 index 0000000000..42940e264b --- /dev/null +++ b/packages/fakeyou.com/public/locales/id/LandingPage.json @@ -0,0 +1,12 @@ +{ + "community": { + "discordButton": "Perselisihan", + "heading": "Bergabunglah dengan Komunitas", + "text": "Kami ingin mengobrol dengan Anda! Silakan bergabung dengan kami di Discord jika Anda memiliki pertanyaan.", + "twitterButton": "Twitter" + }, + "hero": { + "bottom": "Hasilkan audio atau video karakter favorit Anda yang mengatakan apa pun yang Anda inginkan dengan teknologi palsu FakeYou.", + "top": "Musik AI, Teks ke Ucapan, dan Suara ke Suara" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/id/Rating.json b/packages/fakeyou.com/public/locales/id/Rating.json new file mode 100644 index 0000000000..becece7265 --- /dev/null +++ b/packages/fakeyou.com/public/locales/id/Rating.json @@ -0,0 +1,9 @@ +{ + "buttonBad": "Suara ini terdengar buruk", + "buttonGood": "Suara ini terdengar bagus", + "ratingBad": "Suara Kedengarannya Buruk", + "ratingGood": "Suara Kedengarannya Bagus", + "ratingGreat": "Suara Kedengarannya Hebat", + "ratingLabel": "Peringkat:", + "ratingOk": "Suara Kedengarannya Oke" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/id/RecordComponent.json b/packages/fakeyou.com/public/locales/id/RecordComponent.json new file mode 100644 index 0000000000..7fc76aa508 --- /dev/null +++ b/packages/fakeyou.com/public/locales/id/RecordComponent.json @@ -0,0 +1,7 @@ +{ + "recordButtonClear": "Jernih", + "recordButtonStart": "Mulai merekam", + "recordButtonStop": "Berhenti Merekam", + "recordButtonUploadAudio": "Unggah Audio", + "recordButtonUploaded": "Diunggah" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/id/SessionTtsInferenceResultList.json b/packages/fakeyou.com/public/locales/id/SessionTtsInferenceResultList.json new file mode 100644 index 0000000000..5fbc86a6d0 --- /dev/null +++ b/packages/fakeyou.com/public/locales/id/SessionTtsInferenceResultList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioShareDownload": "Bagikan/Unduh", + "resultsBlankSubText": "Belum ada hasil", + "resultsBlankText": "Audio yang dihasilkan akan muncul di sini.", + "resultsProgressDead": "Kesalahan!", + "resultsProgressFail": "Gagal {{0}} upaya. Akan mencoba lagi...", + "resultsProgressPending": "Tertunda...", + "resultsProgressStarted": "Dimulai...", + "resultsProgressSuccess": "Menyelesaikan!", + "resultsTtsQueued": "TTS Mengantri:", + "resultsUpgradeLinkText": "Keanggotaan FakeYou", + "resultsUpgradeNotice": "Tidak mau menunggu? Lewati ke depan antrian dengan a" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/id/SessionVoiceConversionResultsList.json b/packages/fakeyou.com/public/locales/id/SessionVoiceConversionResultsList.json new file mode 100644 index 0000000000..176d161bad --- /dev/null +++ b/packages/fakeyou.com/public/locales/id/SessionVoiceConversionResultsList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioDownload": "Unduh", + "resultsBlankSubText": "Belum ada hasil", + "resultsBlankText": "Audio yang dihasilkan akan muncul di sini.", + "resultsProgressDead": "Kesalahan!", + "resultsProgressFail": "Gagal {{0}} upaya. Akan mencoba lagi...", + "resultsProgressPending": "Tertunda...", + "resultsProgressStarted": "Dimulai...", + "resultsProgressSuccess": "Menyelesaikan!", + "resultsTtsQueued": "V2V Antri:", + "resultsUpgradeLinkText": "Keanggotaan FakeYou", + "resultsUpgradeNotice": "Tidak mau menunggu? Lewati ke depan antrian dengan a" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/id/TopNav.json b/packages/fakeyou.com/public/locales/id/TopNav.json new file mode 100644 index 0000000000..ced5cb43fc --- /dev/null +++ b/packages/fakeyou.com/public/locales/id/TopNav.json @@ -0,0 +1,20 @@ +{ + "buttonLogOut": "Keluar", + "buttonLogin": "Gabung", + "buttonSignUp": "Mendaftar", + "communityGuide": "Memandu", + "communityLeaderboard": "Papan peringkat", + "communityProfile": "Profil saya", + "communityTitle": "Masyarakat", + "infoAbout": "Tentang", + "infoApiDocs": "Dokumen API", + "infoPrivacyPolicy": "Kebijakan pribadi", + "infoTerms": "Syarat Penggunaan", + "infoTitle": "Informasi", + "pricingTitle": "Harga", + "productTts": "Teks pidato", + "productUploadModels": "Unggah Model", + "productVc": "Suara ke Suara", + "productVideo": "Sinkronisasi Bibir Video", + "productsTitle": "Alat AI" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/id/TtsModelListPage.json b/packages/fakeyou.com/public/locales/id/TtsModelListPage.json new file mode 100644 index 0000000000..a5b5cc644a --- /dev/null +++ b/packages/fakeyou.com/public/locales/id/TtsModelListPage.json @@ -0,0 +1,24 @@ +{ + "heroButtonPricing": "Lihat Harga", + "heroButtonProfile": "Lihat profil saya", + "heroButtonSignUp": "Mendaftar", + "heroButtonUpgradePlan": "Paket Peningkatan", + "heroText": "Ubah teks menjadi suara berbicara karakter favorit Anda.", + "heroTitle": "Teks pidato", + "ttsButtonClear": "Teks bersih", + "ttsButtonExplore": "Jelajahi Suara", + "ttsButtonRandom": "Suara Acak", + "ttsButtonSpeak": "Berbicara", + "ttsDetailsLanguageLabel": "Bahasa:", + "ttsDetailsViewLink": "Lihat lebih detail", + "ttsExploreButtonClearFilter": "Hapus filter kategori", + "ttsExploreCategoryLabel": "Kategori", + "ttsExploreCategoryOptionText": "Pilih Kategori...", + "ttsExploreLanguageLabel": "Bahasa", + "ttsExploreLanguageOptionText": "Semua bahasa", + "ttsResultsTitle": "Hasil TTS Sesi", + "ttsTextInputLabel": "Teks Anda", + "ttsTextInputPlaceholder": "Masukkan teks yang Anda inginkan {{character}} untuk mengatakan di sini...", + "ttsTooManyRequests": "<b>Anda mengirim terlalu banyak permintaan!</b> Pelan-pelan sedikit. Kami harus memperlambat sedikit ketika server sedang sibuk.", + "ttsVoiceLabel": "Suara ({{0}} untuk memilih dari)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/id/UploadComponent.json b/packages/fakeyou.com/public/locales/id/UploadComponent.json new file mode 100644 index 0000000000..4944837324 --- /dev/null +++ b/packages/fakeyou.com/public/locales/id/UploadComponent.json @@ -0,0 +1,8 @@ +{ + "uploadButtonClear": "Jernih", + "uploadButtonUploadAudio": "Unggah Audio", + "uploadButtonUploaded": "Diunggah", + "uploadChangeFile": "Ubah berkas", + "uploadFileTextDrop": "atau letakkan di sini", + "uploadFileTextUpload": "Unggah file" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/id/VcModelListPage.json b/packages/fakeyou.com/public/locales/id/VcModelListPage.json new file mode 100644 index 0000000000..2271129e30 --- /dev/null +++ b/packages/fakeyou.com/public/locales/id/VcModelListPage.json @@ -0,0 +1,18 @@ +{ + "heroButtonPricing": "Lihat Harga", + "heroButtonProfile": "Lihat profil saya", + "heroButtonSignUp": "Mendaftar", + "heroButtonUpgradePlan": "Paket Peningkatan", + "heroText": "Gunakan alat ini untuk mengubah suara Anda menjadi karakter favorit Anda.", + "heroTitle": "Suara ke Suara", + "vcButtonConvert": "Mengubah", + "vcConvertLabel": "Konversi Audio", + "vcPitchControlF0": "off untuk menyanyi, untuk pidato", + "vcPitchControlLabel": "Kontrol Nada", + "vcRecordAudioLabel": "Suara rekaman", + "vcResultsTitle": "Hasil Sesi V2V", + "vcTabRecord": "Mikropon", + "vcTabUpload": "Mengunggah", + "vcUploadFileLabel": "Unggah Audio Masukan", + "vcVoiceLabel": "Pilih Suara Sasaran ({{0}} untuk memilih dari)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/it/FaceAnimation.json b/packages/fakeyou.com/public/locales/it/FaceAnimation.json new file mode 100644 index 0000000000..3762555988 --- /dev/null +++ b/packages/fakeyou.com/public/locales/it/FaceAnimation.json @@ -0,0 +1,5 @@ +{ + "hero": { + "title": "Lorem ipsum" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/it/FaceAnimator.json b/packages/fakeyou.com/public/locales/it/FaceAnimator.json new file mode 100644 index 0000000000..05715cd828 --- /dev/null +++ b/packages/fakeyou.com/public/locales/it/FaceAnimator.json @@ -0,0 +1,24 @@ +{ + "headings": { + "audio": "Audio", + "image": "Immagine", + "subtitle": "Seleziona un'immagine con un volto chiaro e un campione audio e genera un video sincronizzato con le labbra.", + "title": "Animatore di volti" + }, + "inputs": { + "downloadFile": "Download file", + "generate": "creare", + "makeAnother": "Fanne un'altro" + }, + "status": { + "animationComplete": "Animazione completata!", + "animationDead": "Richiesta di animazione morta", + "animationFailed": "Animazione fallita {{attemptCount}} tentativo(i). Ci riproverò...", + "animationInProgress": "Animazione in corso", + "animationPending": "Animazione in attesa...", + "animationSuccess": "Animazione riuscita", + "requestingAnimation": "Richiesta di animazione", + "uploadingAudio": "Caricamento dell'audio", + "uploadingImage": "Caricamento immagine" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/it/Footer.json b/packages/fakeyou.com/public/locales/it/Footer.json new file mode 100644 index 0000000000..70b6e19632 --- /dev/null +++ b/packages/fakeyou.com/public/locales/it/Footer.json @@ -0,0 +1,17 @@ +{ + "communityGuide": "Guida", + "communityLeaderboard": "Classifica", + "communityProfile": "Il mio profilo", + "communityTitle": "Comunità", + "infoAbout": "Di", + "infoApiDocs": "Documenti API", + "infoPricing": "Prezzi", + "infoPrivacyPolicy": "politica sulla riservatezza", + "infoTerms": "Termini di utilizzo", + "infoTitle": "Informazioni", + "productTts": "Sintesi vocale da testo", + "productUploadModels": "Carica modelli", + "productVc": "Da voce a voce", + "productVideo": "Sincronizzazione labiale video", + "productsTitle": "Strumenti di intelligenza artificiale" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/it/LandingPage.json b/packages/fakeyou.com/public/locales/it/LandingPage.json new file mode 100644 index 0000000000..fa96bd827b --- /dev/null +++ b/packages/fakeyou.com/public/locales/it/LandingPage.json @@ -0,0 +1,12 @@ +{ + "community": { + "discordButton": "Discordia", + "heading": "Unisciti alla comunità", + "text": "Ci piacerebbe chiacchierare con te! Unisciti a noi su Discord se hai domande.", + "twitterButton": "Twitter" + }, + "hero": { + "bottom": "Genera audio o video dei tuoi personaggi preferiti dicendo quello che vuoi con la profonda tecnologia falsa di FakeYou.", + "top": "Musica AI, sintesi vocale e voce a voce" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/it/Rating.json b/packages/fakeyou.com/public/locales/it/Rating.json new file mode 100644 index 0000000000..fba1404184 --- /dev/null +++ b/packages/fakeyou.com/public/locales/it/Rating.json @@ -0,0 +1,9 @@ +{ + "buttonBad": "Questa voce suona male", + "buttonGood": "Questa voce suona bene", + "ratingBad": "La voce suona male", + "ratingGood": "La voce suona bene", + "ratingGreat": "La voce suona alla grande", + "ratingLabel": "Valutazione:", + "ratingOk": "La voce suona bene" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/it/RecordComponent.json b/packages/fakeyou.com/public/locales/it/RecordComponent.json new file mode 100644 index 0000000000..e776939d36 --- /dev/null +++ b/packages/fakeyou.com/public/locales/it/RecordComponent.json @@ -0,0 +1,7 @@ +{ + "recordButtonClear": "Chiaro", + "recordButtonStart": "Inizia a registrare", + "recordButtonStop": "Interrompi la registrazione", + "recordButtonUploadAudio": "Carica audio", + "recordButtonUploaded": "Caricato" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/it/SessionTtsInferenceResultList.json b/packages/fakeyou.com/public/locales/it/SessionTtsInferenceResultList.json new file mode 100644 index 0000000000..a312f13c4d --- /dev/null +++ b/packages/fakeyou.com/public/locales/it/SessionTtsInferenceResultList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioShareDownload": "Condividi/Scarica", + "resultsBlankSubText": "Nessun risultato ancora", + "resultsBlankText": "L'audio generato verrà visualizzato qui.", + "resultsProgressDead": "Errore!", + "resultsProgressFail": "Fallito {{0}} tentativo(i). Ci riproverò...", + "resultsProgressPending": "In attesa di...", + "resultsProgressStarted": "Iniziato...", + "resultsProgressSuccess": "Completare!", + "resultsTtsQueued": "TTS in coda:", + "resultsUpgradeLinkText": "Iscrizione FakeYou", + "resultsUpgradeNotice": "Non vuoi aspettare? Salta in prima fila con a" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/it/SessionVoiceConversionResultsList.json b/packages/fakeyou.com/public/locales/it/SessionVoiceConversionResultsList.json new file mode 100644 index 0000000000..613c32cc5f --- /dev/null +++ b/packages/fakeyou.com/public/locales/it/SessionVoiceConversionResultsList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioDownload": "Scaricamento", + "resultsBlankSubText": "Nessun risultato ancora", + "resultsBlankText": "L'audio generato verrà visualizzato qui.", + "resultsProgressDead": "Errore!", + "resultsProgressFail": "Fallito {{0}} tentativo(i). Ci riproverò...", + "resultsProgressPending": "In attesa di...", + "resultsProgressStarted": "Iniziato...", + "resultsProgressSuccess": "Completare!", + "resultsTtsQueued": "V2V in coda:", + "resultsUpgradeLinkText": "Iscrizione FakeYou", + "resultsUpgradeNotice": "Non vuoi aspettare? Salta in prima fila con a" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/it/TopNav.json b/packages/fakeyou.com/public/locales/it/TopNav.json new file mode 100644 index 0000000000..23a8735eb7 --- /dev/null +++ b/packages/fakeyou.com/public/locales/it/TopNav.json @@ -0,0 +1,20 @@ +{ + "buttonLogOut": "Disconnettersi", + "buttonLogin": "Login", + "buttonSignUp": "Iscrizione", + "communityGuide": "Guida", + "communityLeaderboard": "Classifica", + "communityProfile": "Il mio profilo", + "communityTitle": "Comunità", + "infoAbout": "Di", + "infoApiDocs": "Documenti API", + "infoPrivacyPolicy": "politica sulla riservatezza", + "infoTerms": "Termini di utilizzo", + "infoTitle": "Informazioni", + "pricingTitle": "Prezzi", + "productTts": "Sintesi vocale da testo", + "productUploadModels": "Carica modelli", + "productVc": "Da voce a voce", + "productVideo": "Sincronizzazione labiale video", + "productsTitle": "Strumenti di intelligenza artificiale" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/it/TtsModelListPage.json b/packages/fakeyou.com/public/locales/it/TtsModelListPage.json new file mode 100644 index 0000000000..a3ac029df0 --- /dev/null +++ b/packages/fakeyou.com/public/locales/it/TtsModelListPage.json @@ -0,0 +1,24 @@ +{ + "heroButtonPricing": "Visualizza i prezzi", + "heroButtonProfile": "Guarda il mio profilo", + "heroButtonSignUp": "Iscrizione", + "heroButtonUpgradePlan": "Piano di aggiornamento", + "heroText": "Trasforma il testo nella voce parlante del tuo personaggio preferito.", + "heroTitle": "Sintesi vocale da testo", + "ttsButtonClear": "Testo chiaro", + "ttsButtonExplore": "Esplora le voci", + "ttsButtonRandom": "Voce casuale", + "ttsButtonSpeak": "Parlare", + "ttsDetailsLanguageLabel": "Lingua:", + "ttsDetailsViewLink": "Vedi maggiori dettagli", + "ttsExploreButtonClearFilter": "Cancella filtri di categoria", + "ttsExploreCategoryLabel": "Categoria", + "ttsExploreCategoryOptionText": "Seleziona categoria...", + "ttsExploreLanguageLabel": "Lingua", + "ttsExploreLanguageOptionText": "Tutte le lingue", + "ttsResultsTitle": "Risultati TTS della sessione", + "ttsTextInputLabel": "Il tuo testo", + "ttsTextInputPlaceholder": "Inserisci il testo che desideri {{character}} da dire qui...", + "ttsTooManyRequests": "<b>Stai inviando troppe richieste!</b> Rallenta un po'. Dobbiamo rallentare un po' le cose quando il server è occupato.", + "ttsVoiceLabel": "Voce ({{0}} scegliere da)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/it/UploadComponent.json b/packages/fakeyou.com/public/locales/it/UploadComponent.json new file mode 100644 index 0000000000..3419a823aa --- /dev/null +++ b/packages/fakeyou.com/public/locales/it/UploadComponent.json @@ -0,0 +1,8 @@ +{ + "uploadButtonClear": "Chiaro", + "uploadButtonUploadAudio": "Carica audio", + "uploadButtonUploaded": "Caricato", + "uploadChangeFile": "Cambia file", + "uploadFileTextDrop": "oppure lascialo qui", + "uploadFileTextUpload": "Caricare un file" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/it/VcModelListPage.json b/packages/fakeyou.com/public/locales/it/VcModelListPage.json new file mode 100644 index 0000000000..82dd43c44d --- /dev/null +++ b/packages/fakeyou.com/public/locales/it/VcModelListPage.json @@ -0,0 +1,18 @@ +{ + "heroButtonPricing": "Visualizza i prezzi", + "heroButtonProfile": "Guarda il mio profilo", + "heroButtonSignUp": "Iscrizione", + "heroButtonUpgradePlan": "Piano di aggiornamento", + "heroText": "Usa questo strumento per cambiare la tua voce nei tuoi personaggi preferiti.", + "heroTitle": "Da voce a voce", + "vcButtonConvert": "Convertire", + "vcConvertLabel": "Converti audio", + "vcPitchControlF0": "fuori per il canto, dentro per il discorso", + "vcPitchControlLabel": "Controllo della frequenza", + "vcRecordAudioLabel": "Registra audio", + "vcResultsTitle": "Risultati della sessione V2V", + "vcTabRecord": "Microfono", + "vcTabUpload": "Caricamento", + "vcUploadFileLabel": "Carica audio in ingresso", + "vcVoiceLabel": "Scegli la voce di destinazione ({{0}} scegliere da)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ja/FaceAnimation.json b/packages/fakeyou.com/public/locales/ja/FaceAnimation.json new file mode 100644 index 0000000000..c956d0256c --- /dev/null +++ b/packages/fakeyou.com/public/locales/ja/FaceAnimation.json @@ -0,0 +1,5 @@ +{ + "hero": { + "title": "ロレム・イプサム" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ja/FaceAnimator.json b/packages/fakeyou.com/public/locales/ja/FaceAnimator.json new file mode 100644 index 0000000000..e31dd90373 --- /dev/null +++ b/packages/fakeyou.com/public/locales/ja/FaceAnimator.json @@ -0,0 +1,24 @@ +{ + "headings": { + "audio": "オーディオ", + "image": "画像", + "subtitle": "鮮明な顔と音声サンプルを選択して画像を作成し、リップシンクビデオを生成します。", + "title": "フェイスアニメーター" + }, + "inputs": { + "downloadFile": "ダウンロードファイル", + "generate": "生成する", + "makeAnother": "別のものを作る" + }, + "status": { + "animationComplete": "アニメーション完成!", + "animationDead": "アニメーションリクエストが終了しました", + "animationFailed": "アニメーションが失敗しました {{attemptCount}} 試み)。再試行します...", + "animationInProgress": "アニメーション進行中", + "animationPending": "アニメーションは保留中です...", + "animationSuccess": "アニメーションが成功しました", + "requestingAnimation": "アニメーションのリクエスト", + "uploadingAudio": "音声のアップロード", + "uploadingImage": "画像のアップロード" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ja/Footer.json b/packages/fakeyou.com/public/locales/ja/Footer.json new file mode 100644 index 0000000000..b993e963d7 --- /dev/null +++ b/packages/fakeyou.com/public/locales/ja/Footer.json @@ -0,0 +1,17 @@ +{ + "communityGuide": "ガイド", + "communityLeaderboard": "リーダーボード", + "communityProfile": "私のプロフィール", + "communityTitle": "コミュニティ", + "infoAbout": "について", + "infoApiDocs": "APIドキュメント", + "infoPricing": "価格設定", + "infoPrivacyPolicy": "プライバシーポリシー", + "infoTerms": "利用規約", + "infoTitle": "情報", + "productTts": "テキスト読み上げ", + "productUploadModels": "モデルのアップロード", + "productVc": "声から声へ", + "productVideo": "ビデオリップシンク", + "productsTitle": "AIツール" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ja/LandingPage.json b/packages/fakeyou.com/public/locales/ja/LandingPage.json index 7b42def408..7e27f2c9ea 100644 --- a/packages/fakeyou.com/public/locales/ja/LandingPage.json +++ b/packages/fakeyou.com/public/locales/ja/LandingPage.json @@ -1,12 +1,12 @@ { "community": { - "discordButton": "Discord", + "discordButton": "不和", "heading": "コミュニティに参加する", "text": "ぜひお話ししたいと思います!ご質問がございましたら、Discord にご参加ください。", - "twitterButton": "Twitter" + "twitterButton": "ツイッター" }, "hero": { - "bottom": "FakeYou ディープ フェイク技術を使用して、お気に入りのキャラクターが言いたいことを言う音声やビデオを生成します。", + "bottom": "FakeYou のディープ フェイク技術を使用して、お気に入りのキャラクターが言いたいことを言う音声やビデオを生成します。", "top": "AI 音楽、テキスト読み上げ、音声変換" } } \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ja/Rating.json b/packages/fakeyou.com/public/locales/ja/Rating.json new file mode 100644 index 0000000000..316ae81be9 --- /dev/null +++ b/packages/fakeyou.com/public/locales/ja/Rating.json @@ -0,0 +1,9 @@ +{ + "buttonBad": "この声は気持ち悪いです", + "buttonGood": "この声いいですね", + "ratingBad": "声が悪く聞こえる", + "ratingGood": "声が良い", + "ratingGreat": "声が素晴らしい", + "ratingLabel": "評価:", + "ratingOk": "声は大丈夫です" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ja/RecordComponent.json b/packages/fakeyou.com/public/locales/ja/RecordComponent.json new file mode 100644 index 0000000000..e3a7c12587 --- /dev/null +++ b/packages/fakeyou.com/public/locales/ja/RecordComponent.json @@ -0,0 +1,7 @@ +{ + "recordButtonClear": "クリア", + "recordButtonStart": "録音を開始", + "recordButtonStop": "録音を停止する", + "recordButtonUploadAudio": "音声をアップロードする", + "recordButtonUploaded": "アップロードされました" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ja/SessionTtsInferenceResultList.json b/packages/fakeyou.com/public/locales/ja/SessionTtsInferenceResultList.json new file mode 100644 index 0000000000..86f862eb30 --- /dev/null +++ b/packages/fakeyou.com/public/locales/ja/SessionTtsInferenceResultList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioShareDownload": "共有/ダウンロード", + "resultsBlankSubText": "まだ結果はありません", + "resultsBlankText": "生成された音声がここに表示されます。", + "resultsProgressDead": "エラー!", + "resultsProgressFail": "失敗した {{0}} 試み)。再試行します...", + "resultsProgressPending": "保留中...", + "resultsProgressStarted": "始めました...", + "resultsProgressSuccess": "完了!", + "resultsTtsQueued": "キューに入れられた TTS:", + "resultsUpgradeLinkText": "FakeYou メンバーシップ", + "resultsUpgradeNotice": "待ちたくないですか?でキューの先頭にスキップします" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ja/SessionVoiceConversionResultsList.json b/packages/fakeyou.com/public/locales/ja/SessionVoiceConversionResultsList.json new file mode 100644 index 0000000000..32937d11f9 --- /dev/null +++ b/packages/fakeyou.com/public/locales/ja/SessionVoiceConversionResultsList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioDownload": "ダウンロード", + "resultsBlankSubText": "まだ結果はありません", + "resultsBlankText": "生成された音声がここに表示されます。", + "resultsProgressDead": "エラー!", + "resultsProgressFail": "失敗した {{0}} 試み)。再試行します...", + "resultsProgressPending": "保留中...", + "resultsProgressStarted": "始めました...", + "resultsProgressSuccess": "完了!", + "resultsTtsQueued": "V2V キュー:", + "resultsUpgradeLinkText": "FakeYou メンバーシップ", + "resultsUpgradeNotice": "待ちたくないですか?でキューの先頭にスキップします" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ja/TopNav.json b/packages/fakeyou.com/public/locales/ja/TopNav.json new file mode 100644 index 0000000000..bb32abbf96 --- /dev/null +++ b/packages/fakeyou.com/public/locales/ja/TopNav.json @@ -0,0 +1,20 @@ +{ + "buttonLogOut": "ログアウト", + "buttonLogin": "ログイン", + "buttonSignUp": "サインアップ", + "communityGuide": "ガイド", + "communityLeaderboard": "リーダーボード", + "communityProfile": "私のプロフィール", + "communityTitle": "コミュニティ", + "infoAbout": "について", + "infoApiDocs": "APIドキュメント", + "infoPrivacyPolicy": "プライバシーポリシー", + "infoTerms": "利用規約", + "infoTitle": "情報", + "pricingTitle": "価格設定", + "productTts": "テキスト読み上げ", + "productUploadModels": "モデルのアップロード", + "productVc": "声から声へ", + "productVideo": "ビデオリップシンク", + "productsTitle": "AIツール" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ja/TtsModelListPage.json b/packages/fakeyou.com/public/locales/ja/TtsModelListPage.json new file mode 100644 index 0000000000..f60b129c5f --- /dev/null +++ b/packages/fakeyou.com/public/locales/ja/TtsModelListPage.json @@ -0,0 +1,24 @@ +{ + "heroButtonPricing": "価格を見る", + "heroButtonProfile": "私のプロフィールを見る", + "heroButtonSignUp": "サインアップ", + "heroButtonUpgradePlan": "アップグレードプラン", + "heroText": "テキストをお気に入りのキャラクターの話し声に変えます。", + "heroTitle": "テキスト読み上げ", + "ttsButtonClear": "クリアテキスト", + "ttsButtonExplore": "声を探る", + "ttsButtonRandom": "ランダムボイス", + "ttsButtonSpeak": "話す", + "ttsDetailsLanguageLabel": "言語:", + "ttsDetailsViewLink": "詳細を見る", + "ttsExploreButtonClearFilter": "カテゴリフィルターをクリアする", + "ttsExploreCategoryLabel": "カテゴリー", + "ttsExploreCategoryOptionText": "カテゴリを選んでください...", + "ttsExploreLanguageLabel": "言語", + "ttsExploreLanguageOptionText": "すべての言語", + "ttsResultsTitle": "セッションTTSの結果", + "ttsTextInputLabel": "あなたのテキスト", + "ttsTextInputPlaceholder": "必要なテキストを入力してください {{character}} ここで言うのは…", + "ttsTooManyRequests": "<b>リクエストが多すぎます!</b> 少しゆっくりしてください。サーバーが混雑した場合は、処理を少し遅くする必要があります。", + "ttsVoiceLabel": "声 ({{0}} から選択します)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ja/UploadComponent.json b/packages/fakeyou.com/public/locales/ja/UploadComponent.json new file mode 100644 index 0000000000..086ca49867 --- /dev/null +++ b/packages/fakeyou.com/public/locales/ja/UploadComponent.json @@ -0,0 +1,8 @@ +{ + "uploadButtonClear": "クリア", + "uploadButtonUploadAudio": "音声をアップロードする", + "uploadButtonUploaded": "アップロードされました", + "uploadChangeFile": "ファイルを変更する", + "uploadFileTextDrop": "またはここにドロップしてください", + "uploadFileTextUpload": "ファイルをアップロードする" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ja/VcModelListPage.json b/packages/fakeyou.com/public/locales/ja/VcModelListPage.json new file mode 100644 index 0000000000..b585b801d3 --- /dev/null +++ b/packages/fakeyou.com/public/locales/ja/VcModelListPage.json @@ -0,0 +1,18 @@ +{ + "heroButtonPricing": "価格を見る", + "heroButtonProfile": "私のプロフィールを見る", + "heroButtonSignUp": "サインアップ", + "heroButtonUpgradePlan": "アップグレードプラン", + "heroText": "このツールを使用して、あなたの声をお気に入りのキャラクターに変更します。", + "heroTitle": "声から声へ", + "vcButtonConvert": "変換する", + "vcConvertLabel": "オーディオを変換する", + "vcPitchControlF0": "歌うためにオフ、スピーチのためにオン", + "vcPitchControlLabel": "ピッチコントロール", + "vcRecordAudioLabel": "レコードオーディオ", + "vcResultsTitle": "セッション V2V の結果", + "vcTabRecord": "マイクロフォン", + "vcTabUpload": "アップロード", + "vcUploadFileLabel": "入力音声をアップロードする", + "vcVoiceLabel": "ターゲットボイスを選択 ({{0}} から選択します)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ko/FaceAnimation.json b/packages/fakeyou.com/public/locales/ko/FaceAnimation.json new file mode 100644 index 0000000000..6ecf3323c5 --- /dev/null +++ b/packages/fakeyou.com/public/locales/ko/FaceAnimation.json @@ -0,0 +1,5 @@ +{ + "hero": { + "title": "로렘 입숨" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ko/FaceAnimator.json b/packages/fakeyou.com/public/locales/ko/FaceAnimator.json new file mode 100644 index 0000000000..83b9ce042b --- /dev/null +++ b/packages/fakeyou.com/public/locales/ko/FaceAnimator.json @@ -0,0 +1,24 @@ +{ + "headings": { + "audio": "오디오", + "image": "영상", + "subtitle": "깨끗한 얼굴과 오디오 샘플을 선택하여 이미지화하고 립싱크된 비디오를 생성합니다.", + "title": "얼굴 애니메이터" + }, + "inputs": { + "downloadFile": "파일 다운로드", + "generate": "생성하다", + "makeAnother": "다른 것을 만드세요" + }, + "status": { + "animationComplete": "애니메이션 완성!", + "animationDead": "애니메이션 요청이 중단되었습니다.", + "animationFailed": "애니메이션 실패 {{attemptCount}} 시도. 다시 시도합니다...", + "animationInProgress": "애니메이션 진행 중", + "animationPending": "애니메이션 대기 중...", + "animationSuccess": "애니메이션 성공", + "requestingAnimation": "애니메이션 요청", + "uploadingAudio": "오디오 업로드", + "uploadingImage": "이미지 업로드 중" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ko/Footer.json b/packages/fakeyou.com/public/locales/ko/Footer.json new file mode 100644 index 0000000000..2de52b6811 --- /dev/null +++ b/packages/fakeyou.com/public/locales/ko/Footer.json @@ -0,0 +1,17 @@ +{ + "communityGuide": "가이드", + "communityLeaderboard": "리더보드", + "communityProfile": "내 프로필", + "communityTitle": "지역 사회", + "infoAbout": "에 대한", + "infoApiDocs": "API 문서", + "infoPricing": "가격", + "infoPrivacyPolicy": "개인 정보 정책", + "infoTerms": "이용약관", + "infoTitle": "정보", + "productTts": "텍스트 음성 변환", + "productUploadModels": "모델 업로드", + "productVc": "음성 대 음성", + "productVideo": "비디오 립싱크", + "productsTitle": "AI 도구" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ko/LandingPage.json b/packages/fakeyou.com/public/locales/ko/LandingPage.json new file mode 100644 index 0000000000..e195ecf981 --- /dev/null +++ b/packages/fakeyou.com/public/locales/ko/LandingPage.json @@ -0,0 +1,12 @@ +{ + "community": { + "discordButton": "불화", + "heading": "커뮤니티에 가입하세요", + "text": "우리는 당신과 이야기를 나누고 싶습니다! 질문이 있으시면 Discord에 참여해주세요.", + "twitterButton": "트위터" + }, + "hero": { + "bottom": "FakeYou의 심층 페이크 기술을 사용하여 좋아하는 캐릭터가 원하는 것을 말하는 오디오 또는 비디오를 생성하세요.", + "top": "AI 음악, 텍스트 음성 변환, 음성 변환" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ko/Rating.json b/packages/fakeyou.com/public/locales/ko/Rating.json new file mode 100644 index 0000000000..ff2ebba0f7 --- /dev/null +++ b/packages/fakeyou.com/public/locales/ko/Rating.json @@ -0,0 +1,9 @@ +{ + "buttonBad": "이 목소리는 별로인 것 같아", + "buttonGood": "이 목소리 좋은 것 같아", + "ratingBad": "목소리가 안 좋다", + "ratingGood": "목소리가 좋다", + "ratingGreat": "목소리가 좋아요", + "ratingLabel": "평가:", + "ratingOk": "목소리는 괜찮아요" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ko/RecordComponent.json b/packages/fakeyou.com/public/locales/ko/RecordComponent.json new file mode 100644 index 0000000000..38c58f63a7 --- /dev/null +++ b/packages/fakeyou.com/public/locales/ko/RecordComponent.json @@ -0,0 +1,7 @@ +{ + "recordButtonClear": "분명한", + "recordButtonStart": "녹음 시작", + "recordButtonStop": "녹음 중지", + "recordButtonUploadAudio": "오디오 업로드", + "recordButtonUploaded": "업로드됨" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ko/SessionTtsInferenceResultList.json b/packages/fakeyou.com/public/locales/ko/SessionTtsInferenceResultList.json new file mode 100644 index 0000000000..c26da7d70e --- /dev/null +++ b/packages/fakeyou.com/public/locales/ko/SessionTtsInferenceResultList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioShareDownload": "공유/다운로드", + "resultsBlankSubText": "아직 결과가 없습니다", + "resultsBlankText": "생성된 오디오가 여기에 표시됩니다.", + "resultsProgressDead": "오류!", + "resultsProgressFail": "실패한 {{0}} 시도. 다시 시도합니다...", + "resultsProgressPending": "보류 중...", + "resultsProgressStarted": "시작됨...", + "resultsProgressSuccess": "완벽한!", + "resultsTtsQueued": "TTS 대기 중:", + "resultsUpgradeLinkText": "FakeYou 멤버십", + "resultsUpgradeNotice": "기다리고 싶지 않아? 다음을 사용하여 대기열 맨 앞으로 건너뛰기" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ko/SessionVoiceConversionResultsList.json b/packages/fakeyou.com/public/locales/ko/SessionVoiceConversionResultsList.json new file mode 100644 index 0000000000..8dd72a2b3f --- /dev/null +++ b/packages/fakeyou.com/public/locales/ko/SessionVoiceConversionResultsList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioDownload": "다운로드", + "resultsBlankSubText": "아직 결과가 없습니다", + "resultsBlankText": "생성된 오디오가 여기에 표시됩니다.", + "resultsProgressDead": "오류!", + "resultsProgressFail": "실패한 {{0}} 시도. 다시 시도합니다...", + "resultsProgressPending": "보류 중...", + "resultsProgressStarted": "시작됨...", + "resultsProgressSuccess": "완벽한!", + "resultsTtsQueued": "V2V 대기 중:", + "resultsUpgradeLinkText": "FakeYou 멤버십", + "resultsUpgradeNotice": "기다리고 싶지 않아? 다음을 사용하여 대기열 맨 앞으로 건너뛰기" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ko/TopNav.json b/packages/fakeyou.com/public/locales/ko/TopNav.json new file mode 100644 index 0000000000..56078380c1 --- /dev/null +++ b/packages/fakeyou.com/public/locales/ko/TopNav.json @@ -0,0 +1,20 @@ +{ + "buttonLogOut": "로그 아웃", + "buttonLogin": "로그인", + "buttonSignUp": "가입하기", + "communityGuide": "가이드", + "communityLeaderboard": "리더보드", + "communityProfile": "내 프로필", + "communityTitle": "지역 사회", + "infoAbout": "에 대한", + "infoApiDocs": "API 문서", + "infoPrivacyPolicy": "개인 정보 정책", + "infoTerms": "이용약관", + "infoTitle": "정보", + "pricingTitle": "가격", + "productTts": "텍스트 음성 변환", + "productUploadModels": "모델 업로드", + "productVc": "음성 대 음성", + "productVideo": "비디오 립싱크", + "productsTitle": "AI 도구" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ko/TtsModelListPage.json b/packages/fakeyou.com/public/locales/ko/TtsModelListPage.json new file mode 100644 index 0000000000..9b31720505 --- /dev/null +++ b/packages/fakeyou.com/public/locales/ko/TtsModelListPage.json @@ -0,0 +1,24 @@ +{ + "heroButtonPricing": "가격 보기", + "heroButtonProfile": "내 프로필 보기", + "heroButtonSignUp": "가입하기", + "heroButtonUpgradePlan": "업그레이드 계획", + "heroText": "텍스트를 좋아하는 캐릭터의 음성으로 바꿔보세요.", + "heroTitle": "텍스트 음성 변환", + "ttsButtonClear": "명확한 문구", + "ttsButtonExplore": "목소리 탐색", + "ttsButtonRandom": "랜덤 보이스", + "ttsButtonSpeak": "말하다", + "ttsDetailsLanguageLabel": "언어:", + "ttsDetailsViewLink": "자세한 내용보기", + "ttsExploreButtonClearFilter": "카테고리 필터 지우기", + "ttsExploreCategoryLabel": "범주", + "ttsExploreCategoryOptionText": "카테고리 선택...", + "ttsExploreLanguageLabel": "언어", + "ttsExploreLanguageOptionText": "모든 언어", + "ttsResultsTitle": "세션 TTS 결과", + "ttsTextInputLabel": "당신의 텍스트", + "ttsTextInputPlaceholder": "원하는 텍스트를 입력하세요 {{character}} 여기서 말하자면...", + "ttsTooManyRequests": "<b>요청을 너무 많이 보내고 있습니다!</b> 조금 천천히 하세요. 서버가 바빠지면 작업 속도를 조금 줄여야 합니다.", + "ttsVoiceLabel": "목소리 ({{0}} 에서 고르다)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ko/UploadComponent.json b/packages/fakeyou.com/public/locales/ko/UploadComponent.json new file mode 100644 index 0000000000..e4ef5b0967 --- /dev/null +++ b/packages/fakeyou.com/public/locales/ko/UploadComponent.json @@ -0,0 +1,8 @@ +{ + "uploadButtonClear": "분명한", + "uploadButtonUploadAudio": "오디오 업로드", + "uploadButtonUploaded": "업로드됨", + "uploadChangeFile": "파일 변경", + "uploadFileTextDrop": "아니면 여기에 놓으세요.", + "uploadFileTextUpload": "파일을 올리다" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ko/VcModelListPage.json b/packages/fakeyou.com/public/locales/ko/VcModelListPage.json new file mode 100644 index 0000000000..97cc8545d8 --- /dev/null +++ b/packages/fakeyou.com/public/locales/ko/VcModelListPage.json @@ -0,0 +1,18 @@ +{ + "heroButtonPricing": "가격 보기", + "heroButtonProfile": "내 프로필 보기", + "heroButtonSignUp": "가입하기", + "heroButtonUpgradePlan": "업그레이드 계획", + "heroText": "이 도구를 사용하여 목소리를 좋아하는 캐릭터로 바꾸세요.", + "heroTitle": "음성 대 음성", + "vcButtonConvert": "전환하다", + "vcConvertLabel": "오디오 변환", + "vcPitchControlF0": "노래를 부르러 가다, 연설을 가다", + "vcPitchControlLabel": "피치 제어", + "vcRecordAudioLabel": "오디오 녹음", + "vcResultsTitle": "세션 V2V 결과", + "vcTabRecord": "마이크로폰", + "vcTabUpload": "업로드", + "vcUploadFileLabel": "입력 오디오 업로드", + "vcVoiceLabel": "대상 음성 선택({{0}} 에서 고르다)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/pt/FaceAnimation.json b/packages/fakeyou.com/public/locales/pt/FaceAnimation.json new file mode 100644 index 0000000000..3762555988 --- /dev/null +++ b/packages/fakeyou.com/public/locales/pt/FaceAnimation.json @@ -0,0 +1,5 @@ +{ + "hero": { + "title": "Lorem ipsum" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/pt/FaceAnimator.json b/packages/fakeyou.com/public/locales/pt/FaceAnimator.json new file mode 100644 index 0000000000..3803cf5d45 --- /dev/null +++ b/packages/fakeyou.com/public/locales/pt/FaceAnimator.json @@ -0,0 +1,24 @@ +{ + "headings": { + "audio": "Áudio", + "image": "Imagem", + "subtitle": "Selecione uma imagem com um rosto nítido e uma amostra de áudio e gere um vídeo sincronizado com os lábios.", + "title": "Animador facial" + }, + "inputs": { + "downloadFile": "⇬ Fazer download do arquivo", + "generate": "Gerar", + "makeAnother": "Faça outro" + }, + "status": { + "animationComplete": "Animação concluída!", + "animationDead": "Solicitação de animação morta", + "animationFailed": "Falha na animação {{attemptCount}} tentativa(s). Vou tentar novamente...", + "animationInProgress": "Animação em andamento", + "animationPending": "Animação pendente...", + "animationSuccess": "Animação bem sucedida", + "requestingAnimation": "Solicitando Animação", + "uploadingAudio": "Fazendo upload de áudio", + "uploadingImage": "Carregando imagem" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/pt/Footer.json b/packages/fakeyou.com/public/locales/pt/Footer.json new file mode 100644 index 0000000000..cdd8182e69 --- /dev/null +++ b/packages/fakeyou.com/public/locales/pt/Footer.json @@ -0,0 +1,17 @@ +{ + "communityGuide": "Guia", + "communityLeaderboard": "Entre os melhores", + "communityProfile": "Meu perfil", + "communityTitle": "Comunidade", + "infoAbout": "Sobre", + "infoApiDocs": "Documentos da API", + "infoPricing": "Preços", + "infoPrivacyPolicy": "política de Privacidade", + "infoTerms": "Termos de uso", + "infoTitle": "Informações", + "productTts": "Texto para fala", + "productUploadModels": "Carregar modelos", + "productVc": "Voz para Voz", + "productVideo": "Sincronização labial de vídeo", + "productsTitle": "Ferramentas de IA" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/pt/LandingPage.json b/packages/fakeyou.com/public/locales/pt/LandingPage.json index c080bd07d2..143527ee53 100644 --- a/packages/fakeyou.com/public/locales/pt/LandingPage.json +++ b/packages/fakeyou.com/public/locales/pt/LandingPage.json @@ -1,6 +1,6 @@ { "community": { - "discordButton": "Discord", + "discordButton": "Discórdia", "heading": "Junte-se à comunidade", "text": "Adoraríamos conversar com você! Junte-se a nós no Discord se tiver alguma dúvida.", "twitterButton": "Twitter" diff --git a/packages/fakeyou.com/public/locales/pt/Rating.json b/packages/fakeyou.com/public/locales/pt/Rating.json new file mode 100644 index 0000000000..fe1f615313 --- /dev/null +++ b/packages/fakeyou.com/public/locales/pt/Rating.json @@ -0,0 +1,9 @@ +{ + "buttonBad": "Essa voz parece ruim", + "buttonGood": "Essa voz parece boa", + "ratingBad": "Voz soa mal", + "ratingGood": "Voz soa bem", + "ratingGreat": "A voz parece ótima", + "ratingLabel": "Avaliação:", + "ratingOk": "Voz soa bem" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/pt/RecordComponent.json b/packages/fakeyou.com/public/locales/pt/RecordComponent.json new file mode 100644 index 0000000000..254db30dfc --- /dev/null +++ b/packages/fakeyou.com/public/locales/pt/RecordComponent.json @@ -0,0 +1,7 @@ +{ + "recordButtonClear": "Claro", + "recordButtonStart": "Comece a gravar", + "recordButtonStop": "Pare de gravar", + "recordButtonUploadAudio": "Carregar áudio", + "recordButtonUploaded": "Enviado" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/pt/SessionTtsInferenceResultList.json b/packages/fakeyou.com/public/locales/pt/SessionTtsInferenceResultList.json new file mode 100644 index 0000000000..1718cf826a --- /dev/null +++ b/packages/fakeyou.com/public/locales/pt/SessionTtsInferenceResultList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioShareDownload": "Compartilhar/Baixar", + "resultsBlankSubText": "Ainda não há resultados", + "resultsBlankText": "O áudio gerado aparecerá aqui.", + "resultsProgressDead": "Erro!", + "resultsProgressFail": "Fracassado {{0}} tentativa(s). Vou tentar novamente...", + "resultsProgressPending": "Pendente...", + "resultsProgressStarted": "Iniciado...", + "resultsProgressSuccess": "Completo!", + "resultsTtsQueued": "TTS na fila:", + "resultsUpgradeLinkText": "Assinatura FakeYou", + "resultsUpgradeNotice": "Não quer esperar? Pule para a frente da fila com um" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/pt/SessionVoiceConversionResultsList.json b/packages/fakeyou.com/public/locales/pt/SessionVoiceConversionResultsList.json new file mode 100644 index 0000000000..50351b0648 --- /dev/null +++ b/packages/fakeyou.com/public/locales/pt/SessionVoiceConversionResultsList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioDownload": "Download", + "resultsBlankSubText": "Ainda não há resultados", + "resultsBlankText": "O áudio gerado aparecerá aqui.", + "resultsProgressDead": "Erro!", + "resultsProgressFail": "Fracassado {{0}} tentativa(s). Vou tentar novamente...", + "resultsProgressPending": "Pendente...", + "resultsProgressStarted": "Iniciado...", + "resultsProgressSuccess": "Completo!", + "resultsTtsQueued": "V2V na fila:", + "resultsUpgradeLinkText": "Assinatura FakeYou", + "resultsUpgradeNotice": "Não quer esperar? Pule para a frente da fila com um" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/pt/TopNav.json b/packages/fakeyou.com/public/locales/pt/TopNav.json new file mode 100644 index 0000000000..48af9b9906 --- /dev/null +++ b/packages/fakeyou.com/public/locales/pt/TopNav.json @@ -0,0 +1,20 @@ +{ + "buttonLogOut": "Sair", + "buttonLogin": "Conecte-se", + "buttonSignUp": "Inscrever-se", + "communityGuide": "Guia", + "communityLeaderboard": "Entre os melhores", + "communityProfile": "Meu perfil", + "communityTitle": "Comunidade", + "infoAbout": "Sobre", + "infoApiDocs": "Documentos da API", + "infoPrivacyPolicy": "política de Privacidade", + "infoTerms": "Termos de uso", + "infoTitle": "Informações", + "pricingTitle": "Preços", + "productTts": "Texto para fala", + "productUploadModels": "Carregar modelos", + "productVc": "Voz para Voz", + "productVideo": "Sincronização labial de vídeo", + "productsTitle": "Ferramentas de IA" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/pt/TtsModelListPage.json b/packages/fakeyou.com/public/locales/pt/TtsModelListPage.json new file mode 100644 index 0000000000..dfd0cd6e16 --- /dev/null +++ b/packages/fakeyou.com/public/locales/pt/TtsModelListPage.json @@ -0,0 +1,24 @@ +{ + "heroButtonPricing": "Ver preços", + "heroButtonProfile": "Veja meu perfil", + "heroButtonSignUp": "Inscrever-se", + "heroButtonUpgradePlan": "Plano de atualização", + "heroText": "Transforme o texto na voz do seu personagem favorito.", + "heroTitle": "Texto para fala", + "ttsButtonClear": "Texto claro", + "ttsButtonExplore": "Explorar vozes", + "ttsButtonRandom": "Voz Aleatória", + "ttsButtonSpeak": "Falar", + "ttsDetailsLanguageLabel": "Linguagem:", + "ttsDetailsViewLink": "Veja mais detalhes", + "ttsExploreButtonClearFilter": "Limpar filtros de categoria", + "ttsExploreCategoryLabel": "Categoria", + "ttsExploreCategoryOptionText": "Selecione a Categoria...", + "ttsExploreLanguageLabel": "Linguagem", + "ttsExploreLanguageOptionText": "Todas as línguas", + "ttsResultsTitle": "Resultados da sessão TTS", + "ttsTextInputLabel": "Seu texto", + "ttsTextInputPlaceholder": "Digite o texto que você deseja {{character}} para dizer aqui...", + "ttsTooManyRequests": "<b>Você está enviando muitas solicitações!</b> Desacelere um pouco. Temos que desacelerar um pouco as coisas quando o servidor fica ocupado.", + "ttsVoiceLabel": "Voz ({{0}} escolher a partir de)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/pt/UploadComponent.json b/packages/fakeyou.com/public/locales/pt/UploadComponent.json new file mode 100644 index 0000000000..0274f48fba --- /dev/null +++ b/packages/fakeyou.com/public/locales/pt/UploadComponent.json @@ -0,0 +1,8 @@ +{ + "uploadButtonClear": "Claro", + "uploadButtonUploadAudio": "Carregar áudio", + "uploadButtonUploaded": "Enviado", + "uploadChangeFile": "Alterar arquivo", + "uploadFileTextDrop": "ou solte aqui", + "uploadFileTextUpload": "Enviar um arquivo" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/pt/VcModelListPage.json b/packages/fakeyou.com/public/locales/pt/VcModelListPage.json new file mode 100644 index 0000000000..7051143866 --- /dev/null +++ b/packages/fakeyou.com/public/locales/pt/VcModelListPage.json @@ -0,0 +1,18 @@ +{ + "heroButtonPricing": "Ver preços", + "heroButtonProfile": "Veja meu perfil", + "heroButtonSignUp": "Inscrever-se", + "heroButtonUpgradePlan": "Plano de atualização", + "heroText": "Use esta ferramenta para mudar sua voz para seus personagens favoritos.", + "heroTitle": "Voz para Voz", + "vcButtonConvert": "Converter", + "vcConvertLabel": "Converter áudio", + "vcPitchControlF0": "desligado para cantar, ligado para falar", + "vcPitchControlLabel": "Controle de pitch", + "vcRecordAudioLabel": "Gravar audio", + "vcResultsTitle": "Resultados da sessão V2V", + "vcTabRecord": "Microfone", + "vcTabUpload": "Carregar", + "vcUploadFileLabel": "Carregar áudio de entrada", + "vcVoiceLabel": "Escolha a voz alvo ({{0}} escolher a partir de)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ru/FaceAnimation.json b/packages/fakeyou.com/public/locales/ru/FaceAnimation.json new file mode 100644 index 0000000000..693d6f5820 --- /dev/null +++ b/packages/fakeyou.com/public/locales/ru/FaceAnimation.json @@ -0,0 +1,5 @@ +{ + "hero": { + "title": "Лорем ипсум" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ru/FaceAnimator.json b/packages/fakeyou.com/public/locales/ru/FaceAnimator.json new file mode 100644 index 0000000000..f5752e5acd --- /dev/null +++ b/packages/fakeyou.com/public/locales/ru/FaceAnimator.json @@ -0,0 +1,24 @@ +{ + "headings": { + "audio": "Аудио", + "image": "Изображение", + "subtitle": "Выберите изображение с четким лицом и образец звука и создайте видео с синхронизацией губ.", + "title": "Лицевой Аниматор" + }, + "inputs": { + "downloadFile": "Загрузить файл", + "generate": "Генерировать", + "makeAnother": "Сделайте еще один" + }, + "status": { + "animationComplete": "Анимация завершена!", + "animationDead": "Запрос на анимацию не работает", + "animationFailed": "Анимация не удалась {{attemptCount}} попытка(и). Повторю попытку...", + "animationInProgress": "Анимация в процессе", + "animationPending": "Ожидается анимация...", + "animationSuccess": "Анимация удалась", + "requestingAnimation": "Запрос анимации", + "uploadingAudio": "Загрузка аудио", + "uploadingImage": "Загрузка изображения" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ru/Footer.json b/packages/fakeyou.com/public/locales/ru/Footer.json new file mode 100644 index 0000000000..7c713967da --- /dev/null +++ b/packages/fakeyou.com/public/locales/ru/Footer.json @@ -0,0 +1,17 @@ +{ + "communityGuide": "Гид", + "communityLeaderboard": "Таблица лидеров", + "communityProfile": "Мой профайл", + "communityTitle": "Сообщество", + "infoAbout": "О", + "infoApiDocs": "Документация по API", + "infoPricing": "Цены", + "infoPrivacyPolicy": "политика конфиденциальности", + "infoTerms": "Условия эксплуатации", + "infoTitle": "Информация", + "productTts": "Текст в речь", + "productUploadModels": "Загрузить модели", + "productVc": "Голос в голос", + "productVideo": "Видео синхронизация губ", + "productsTitle": "Инструменты искусственного интеллекта" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ru/LandingPage.json b/packages/fakeyou.com/public/locales/ru/LandingPage.json new file mode 100644 index 0000000000..29381f233c --- /dev/null +++ b/packages/fakeyou.com/public/locales/ru/LandingPage.json @@ -0,0 +1,12 @@ +{ + "community": { + "discordButton": "Раздор", + "heading": "Присоединяйтесь к сообществу", + "text": "Мы хотели бы пообщаться с вами! Присоединяйтесь к нам в Discord, если у вас есть вопросы.", + "twitterButton": "Твиттер" + }, + "hero": { + "bottom": "Создавайте аудио или видео, где ваши любимые персонажи говорят все, что угодно, с помощью технологии глубоких фейков FakeYou.", + "top": "AI-музыка, преобразование текста в речь и голос в голос" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ru/Rating.json b/packages/fakeyou.com/public/locales/ru/Rating.json new file mode 100644 index 0000000000..33a127541d --- /dev/null +++ b/packages/fakeyou.com/public/locales/ru/Rating.json @@ -0,0 +1,9 @@ +{ + "buttonBad": "Этот голос звучит плохо", + "buttonGood": "Этот голос звучит хорошо", + "ratingBad": "Голос звучит плохо", + "ratingGood": "Голос звучит хорошо", + "ratingGreat": "Голос звучит великолепно", + "ratingLabel": "Рейтинг:", + "ratingOk": "Голос звучит нормально" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ru/RecordComponent.json b/packages/fakeyou.com/public/locales/ru/RecordComponent.json new file mode 100644 index 0000000000..2073d7ac8c --- /dev/null +++ b/packages/fakeyou.com/public/locales/ru/RecordComponent.json @@ -0,0 +1,7 @@ +{ + "recordButtonClear": "Прозрачный", + "recordButtonStart": "Начать запись", + "recordButtonStop": "Остановить запись", + "recordButtonUploadAudio": "Загрузить аудио", + "recordButtonUploaded": "Загружено" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ru/SessionTtsInferenceResultList.json b/packages/fakeyou.com/public/locales/ru/SessionTtsInferenceResultList.json new file mode 100644 index 0000000000..69b9a6981e --- /dev/null +++ b/packages/fakeyou.com/public/locales/ru/SessionTtsInferenceResultList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioShareDownload": "Поделиться/Скачать", + "resultsBlankSubText": "Пока нет результатов", + "resultsBlankText": "Здесь появится сгенерированный звук.", + "resultsProgressDead": "Ошибка!", + "resultsProgressFail": "Неуспешный {{0}} попытка(и). Повторю попытку...", + "resultsProgressPending": "В ожидании...", + "resultsProgressStarted": "Начал...", + "resultsProgressSuccess": "Полный!", + "resultsTtsQueued": "TTS в очереди:", + "resultsUpgradeLinkText": "Членство в FakeYou", + "resultsUpgradeNotice": "Не хотите ждать? Перейдите в начало очереди с помощью" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ru/SessionVoiceConversionResultsList.json b/packages/fakeyou.com/public/locales/ru/SessionVoiceConversionResultsList.json new file mode 100644 index 0000000000..dc5b16e7b1 --- /dev/null +++ b/packages/fakeyou.com/public/locales/ru/SessionVoiceConversionResultsList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioDownload": "Скачать", + "resultsBlankSubText": "Пока нет результатов", + "resultsBlankText": "Здесь появится сгенерированный звук.", + "resultsProgressDead": "Ошибка!", + "resultsProgressFail": "Неуспешный {{0}} попытка(и). Повторю попытку...", + "resultsProgressPending": "В ожидании...", + "resultsProgressStarted": "Начал...", + "resultsProgressSuccess": "Полный!", + "resultsTtsQueued": "V2V в очереди:", + "resultsUpgradeLinkText": "Членство в FakeYou", + "resultsUpgradeNotice": "Не хотите ждать? Перейдите в начало очереди с помощью" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ru/TopNav.json b/packages/fakeyou.com/public/locales/ru/TopNav.json new file mode 100644 index 0000000000..e7eee54c5a --- /dev/null +++ b/packages/fakeyou.com/public/locales/ru/TopNav.json @@ -0,0 +1,20 @@ +{ + "buttonLogOut": "Выйти", + "buttonLogin": "Авторизоваться", + "buttonSignUp": "Зарегистрироваться", + "communityGuide": "Гид", + "communityLeaderboard": "Таблица лидеров", + "communityProfile": "Мой профайл", + "communityTitle": "Сообщество", + "infoAbout": "О", + "infoApiDocs": "Документация по API", + "infoPrivacyPolicy": "политика конфиденциальности", + "infoTerms": "Условия эксплуатации", + "infoTitle": "Информация", + "pricingTitle": "Цены", + "productTts": "Текст в речь", + "productUploadModels": "Загрузить модели", + "productVc": "Голос в голос", + "productVideo": "Видео синхронизация губ", + "productsTitle": "Инструменты искусственного интеллекта" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ru/TtsModelListPage.json b/packages/fakeyou.com/public/locales/ru/TtsModelListPage.json new file mode 100644 index 0000000000..b6d30ffecb --- /dev/null +++ b/packages/fakeyou.com/public/locales/ru/TtsModelListPage.json @@ -0,0 +1,24 @@ +{ + "heroButtonPricing": "Посмотреть цены", + "heroButtonProfile": "Посмотреть мой профиль", + "heroButtonSignUp": "Зарегистрироваться", + "heroButtonUpgradePlan": "План обновления", + "heroText": "Превратите текст в голос вашего любимого персонажа.", + "heroTitle": "Текст в речь", + "ttsButtonClear": "Очистить текст", + "ttsButtonExplore": "Исследуйте голоса", + "ttsButtonRandom": "Случайный голос", + "ttsButtonSpeak": "Говорить", + "ttsDetailsLanguageLabel": "Язык:", + "ttsDetailsViewLink": "Посмотреть более подробную информацию", + "ttsExploreButtonClearFilter": "Очистить фильтры категорий", + "ttsExploreCategoryLabel": "Категория", + "ttsExploreCategoryOptionText": "Выберите категорию...", + "ttsExploreLanguageLabel": "Язык", + "ttsExploreLanguageOptionText": "Все языки", + "ttsResultsTitle": "Результаты сеанса TTS", + "ttsTextInputLabel": "Ваш текст", + "ttsTextInputPlaceholder": "Введите текст, который вы хотите {{character}} сказать здесь...", + "ttsTooManyRequests": "<b>Вы отправляете слишком много запросов!</b> Помедленнее немного. Нам приходится немного замедлять работу, когда сервер занят.", + "ttsVoiceLabel": "Голос ({{0}} выбирать из)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ru/UploadComponent.json b/packages/fakeyou.com/public/locales/ru/UploadComponent.json new file mode 100644 index 0000000000..e691425e12 --- /dev/null +++ b/packages/fakeyou.com/public/locales/ru/UploadComponent.json @@ -0,0 +1,8 @@ +{ + "uploadButtonClear": "Прозрачный", + "uploadButtonUploadAudio": "Загрузить аудио", + "uploadButtonUploaded": "Загружено", + "uploadChangeFile": "Изменить файл", + "uploadFileTextDrop": "или скинь сюда", + "uploadFileTextUpload": "Загрузить файл" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/ru/VcModelListPage.json b/packages/fakeyou.com/public/locales/ru/VcModelListPage.json new file mode 100644 index 0000000000..6c627b0555 --- /dev/null +++ b/packages/fakeyou.com/public/locales/ru/VcModelListPage.json @@ -0,0 +1,18 @@ +{ + "heroButtonPricing": "Посмотреть цены", + "heroButtonProfile": "Посмотреть мой профиль", + "heroButtonSignUp": "Зарегистрироваться", + "heroButtonUpgradePlan": "План обновления", + "heroText": "Используйте этот инструмент, чтобы изменить свой голос на любимых персонажей.", + "heroTitle": "Голос в голос", + "vcButtonConvert": "Конвертировать", + "vcConvertLabel": "Конвертировать аудио", + "vcPitchControlF0": "выключено для пения, включено для речи", + "vcPitchControlLabel": "Управление по каналу тангажа", + "vcRecordAudioLabel": "Запись аудио", + "vcResultsTitle": "Результаты сеанса V2V", + "vcTabRecord": "Микрофон", + "vcTabUpload": "Загрузить", + "vcUploadFileLabel": "Загрузить входной аудиофайл", + "vcVoiceLabel": "Выберите целевой голос ({{0}} выбирать из)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/th/FaceAnimation.json b/packages/fakeyou.com/public/locales/th/FaceAnimation.json new file mode 100644 index 0000000000..b1aa847b9b --- /dev/null +++ b/packages/fakeyou.com/public/locales/th/FaceAnimation.json @@ -0,0 +1,5 @@ +{ + "hero": { + "title": "ลอเรม อิปซัม" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/th/FaceAnimator.json b/packages/fakeyou.com/public/locales/th/FaceAnimator.json new file mode 100644 index 0000000000..5ac326560b --- /dev/null +++ b/packages/fakeyou.com/public/locales/th/FaceAnimator.json @@ -0,0 +1,24 @@ +{ + "headings": { + "audio": "เสียง", + "image": "ภาพ", + "subtitle": "เลือกและถ่ายภาพด้วยใบหน้าที่ชัดเจนและตัวอย่างเสียง และสร้างวิดีโอแบบลิปซิงค์", + "title": "แอนิเมชั่นใบหน้า" + }, + "inputs": { + "downloadFile": "ดาวน์โหลดไฟล์", + "generate": "สร้าง", + "makeAnother": "ทำอีก" + }, + "status": { + "animationComplete": "แอนิเมชั่นเสร็จสมบูรณ์!", + "animationDead": "คำขอแอนิเมชันไม่ทำงาน", + "animationFailed": "แอนิเมชั่นล้มเหลว {{attemptCount}} ความพยายาม จะลองอีกครั้ง...", + "animationInProgress": "กำลังดำเนินการแอนิเมชัน", + "animationPending": "ภาพเคลื่อนไหวรอดำเนินการ...", + "animationSuccess": "แอนิเมชั่นประสบความสำเร็จ", + "requestingAnimation": "การขอภาพเคลื่อนไหว", + "uploadingAudio": "กำลังอัพโหลดเสียง", + "uploadingImage": "กำลังอัพโหลดรูปภาพ" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/th/Footer.json b/packages/fakeyou.com/public/locales/th/Footer.json new file mode 100644 index 0000000000..ac3771f616 --- /dev/null +++ b/packages/fakeyou.com/public/locales/th/Footer.json @@ -0,0 +1,17 @@ +{ + "communityGuide": "แนะนำ", + "communityLeaderboard": "ลีดเดอร์บอร์ด", + "communityProfile": "โพรไฟล์ของฉัน", + "communityTitle": "สังคม", + "infoAbout": "เกี่ยวกับ", + "infoApiDocs": "เอกสาร API", + "infoPricing": "ราคา", + "infoPrivacyPolicy": "นโยบายความเป็นส่วนตัว", + "infoTerms": "ข้อกำหนดการใช้งาน", + "infoTitle": "ข้อมูล", + "productTts": "ข้อความเป็นคำพูด", + "productUploadModels": "อัพโหลดโมเดล", + "productVc": "เสียงเป็นเสียง", + "productVideo": "วิดีโอลิปซิงค์", + "productsTitle": "เครื่องมือเอไอ" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/th/LandingPage.json b/packages/fakeyou.com/public/locales/th/LandingPage.json new file mode 100644 index 0000000000..fc645b4e5c --- /dev/null +++ b/packages/fakeyou.com/public/locales/th/LandingPage.json @@ -0,0 +1,12 @@ +{ + "community": { + "discordButton": "ความไม่ลงรอยกัน", + "heading": "เข้าร่วมชุมชน", + "text": "เราอยากจะพูดคุยกับคุณ! กรุณาเข้าร่วม Discord กับเราหากคุณมีคำถามใด ๆ", + "twitterButton": "ทวิตเตอร์" + }, + "hero": { + "bottom": "สร้างเสียงหรือวิดีโอของตัวละครที่คุณชื่นชอบพูดสิ่งที่คุณต้องการด้วยเทคโนโลยีปลอมอันล้ำลึกของ FakeYou", + "top": "เพลง AI ข้อความเป็นคำพูด และเสียงเป็นเสียง" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/th/Rating.json b/packages/fakeyou.com/public/locales/th/Rating.json new file mode 100644 index 0000000000..d6b1ac9e58 --- /dev/null +++ b/packages/fakeyou.com/public/locales/th/Rating.json @@ -0,0 +1,9 @@ +{ + "buttonBad": "เสียงนี้ฟังดูไม่ดีเลย", + "buttonGood": "เสียงนี้ฟังดูดีจัง", + "ratingBad": "เสียงฟังดูไม่ดี", + "ratingGood": "เสียงฟังดูดี", + "ratingGreat": "เสียงฟังดูดีมาก", + "ratingLabel": "เรตติ้ง:", + "ratingOk": "เสียงฟังดูโอเค" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/th/RecordComponent.json b/packages/fakeyou.com/public/locales/th/RecordComponent.json new file mode 100644 index 0000000000..f4622f0cfc --- /dev/null +++ b/packages/fakeyou.com/public/locales/th/RecordComponent.json @@ -0,0 +1,7 @@ +{ + "recordButtonClear": "ลบ", + "recordButtonStart": "เริ่มการบันทึก", + "recordButtonStop": "หยุดการบันทึก", + "recordButtonUploadAudio": "อัปโหลดเสียง", + "recordButtonUploaded": "อัปโหลดแล้ว" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/th/SessionTtsInferenceResultList.json b/packages/fakeyou.com/public/locales/th/SessionTtsInferenceResultList.json new file mode 100644 index 0000000000..5b868c92ee --- /dev/null +++ b/packages/fakeyou.com/public/locales/th/SessionTtsInferenceResultList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioShareDownload": "แชร์/ดาวน์โหลด", + "resultsBlankSubText": "ยังไม่มีผลลัพธ์", + "resultsBlankText": "เสียงที่สร้างขึ้นจะปรากฏที่นี่", + "resultsProgressDead": "ข้อผิดพลาด!", + "resultsProgressFail": "ล้มเหลว {{0}} ความพยายาม จะลองอีกครั้ง...", + "resultsProgressPending": "รอดำเนินการ...", + "resultsProgressStarted": "เริ่ม...", + "resultsProgressSuccess": "สมบูรณ์!", + "resultsTtsQueued": "TTS อยู่ในคิว:", + "resultsUpgradeLinkText": "สมาชิก FakeYou", + "resultsUpgradeNotice": "ไม่อยากรอเหรอ? ข้ามไปหน้าคิวด้วย" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/th/SessionVoiceConversionResultsList.json b/packages/fakeyou.com/public/locales/th/SessionVoiceConversionResultsList.json new file mode 100644 index 0000000000..96baa7a9a2 --- /dev/null +++ b/packages/fakeyou.com/public/locales/th/SessionVoiceConversionResultsList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioDownload": "ดาวน์โหลด", + "resultsBlankSubText": "ยังไม่มีผลลัพธ์", + "resultsBlankText": "เสียงที่สร้างขึ้นจะปรากฏที่นี่", + "resultsProgressDead": "ข้อผิดพลาด!", + "resultsProgressFail": "ล้มเหลว {{0}} ความพยายาม จะลองอีกครั้ง...", + "resultsProgressPending": "รอดำเนินการ...", + "resultsProgressStarted": "เริ่ม...", + "resultsProgressSuccess": "สมบูรณ์!", + "resultsTtsQueued": "V2V อยู่ในคิว:", + "resultsUpgradeLinkText": "สมาชิก FakeYou", + "resultsUpgradeNotice": "ไม่อยากรอเหรอ? ข้ามไปหน้าคิวด้วยก" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/th/TopNav.json b/packages/fakeyou.com/public/locales/th/TopNav.json new file mode 100644 index 0000000000..a540bc1c3c --- /dev/null +++ b/packages/fakeyou.com/public/locales/th/TopNav.json @@ -0,0 +1,20 @@ +{ + "buttonLogOut": "ออกจากระบบ", + "buttonLogin": "เข้าสู่ระบบ", + "buttonSignUp": "สมัครสมาชิก", + "communityGuide": "แนะนำ", + "communityLeaderboard": "ลีดเดอร์บอร์ด", + "communityProfile": "โพรไฟล์ของฉัน", + "communityTitle": "สังคม", + "infoAbout": "เกี่ยวกับ", + "infoApiDocs": "เอกสาร API", + "infoPrivacyPolicy": "นโยบายความเป็นส่วนตัว", + "infoTerms": "ข้อกำหนดการใช้งาน", + "infoTitle": "ข้อมูล", + "pricingTitle": "ราคา", + "productTts": "ข้อความเป็นคำพูด", + "productUploadModels": "อัพโหลดโมเดล", + "productVc": "เสียงเป็นเสียง", + "productVideo": "วิดีโอลิปซิงค์", + "productsTitle": "เครื่องมือ AI" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/th/TtsModelListPage.json b/packages/fakeyou.com/public/locales/th/TtsModelListPage.json new file mode 100644 index 0000000000..80b18c4dd3 --- /dev/null +++ b/packages/fakeyou.com/public/locales/th/TtsModelListPage.json @@ -0,0 +1,24 @@ +{ + "heroButtonPricing": "ดูราคา", + "heroButtonProfile": "ดูโปรไฟล์ของฉัน", + "heroButtonSignUp": "ลงชื่อ", + "heroButtonUpgradePlan": "อัพเกรดแผน", + "heroText": "เปลี่ยนข้อความให้เป็นเสียงพูดของตัวละครที่คุณชื่นชอบ", + "heroTitle": "แปลงข้อความเป็นคำพูด", + "ttsButtonClear": "ลบข้อความ", + "ttsButtonExplore": "สำรวจเสียง", + "ttsButtonRandom": "สุ่มเสียง", + "ttsButtonSpeak": "พูด", + "ttsDetailsLanguageLabel": "ภาษา:", + "ttsDetailsViewLink": "ดูรายละเอียดเพิ่มเติม", + "ttsExploreButtonClearFilter": "ล้างตัวกรองหมวดหมู่", + "ttsExploreCategoryLabel": "หมวดหมู่", + "ttsExploreCategoryOptionText": "เลือกประเภท...", + "ttsExploreLanguageLabel": "ภาษา", + "ttsExploreLanguageOptionText": "ทุกภาษา", + "ttsResultsTitle": "ผลลัพธ์ TTS ของเซสชัน", + "ttsTextInputLabel": "ข้อความของคุณ", + "ttsTextInputPlaceholder": "ป้อนข้อความที่คุณต้องการให้ {{character}} พูดที่นี่...", + "ttsTooManyRequests": "<b>คุณส่งคำขอมากเกินไป!</b> ช้าลงหน่อย. เราต้องชะลอความเร็วลงเล็กน้อยเมื่อเซิร์ฟเวอร์ไม่ว่าง", + "ttsVoiceLabel": "เสียง ({{0}} ให้เลือก)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/th/UploadComponent.json b/packages/fakeyou.com/public/locales/th/UploadComponent.json new file mode 100644 index 0000000000..3f414920c0 --- /dev/null +++ b/packages/fakeyou.com/public/locales/th/UploadComponent.json @@ -0,0 +1,8 @@ +{ + "uploadButtonClear": "ชัดเจน", + "uploadButtonUploadAudio": "อัปโหลดเสียง", + "uploadButtonUploaded": "อัปโหลดแล้ว", + "uploadChangeFile": "เปลี่ยนไฟล์", + "uploadFileTextDrop": "หรือวางไว้ที่นี่", + "uploadFileTextUpload": "อัปโหลดไฟล์" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/th/VcModelListPage.json b/packages/fakeyou.com/public/locales/th/VcModelListPage.json new file mode 100644 index 0000000000..d73283a4e7 --- /dev/null +++ b/packages/fakeyou.com/public/locales/th/VcModelListPage.json @@ -0,0 +1,19 @@ +{ + "heroButtonPricing": "ดูราคา", + "heroButtonProfile": "ดูโปรไฟล์ของฉัน", + "heroButtonSignUp": "ลงชื่อ", + "heroButtonUpgradePlan": "อัพเกรดแผน", + "heroText": "ใช้เครื่องมือนี้เพื่อเปลี่ยนเสียงของคุณให้เป็นตัวละครที่คุณชื่นชอบ", + "heroTitle": "แปลงเสียงเป็นอีกเสียง", + "vcButtonClear": "ลบ", + "vcButtonConvert": "แปลง", + "vcConvertLabel": "แปลงเสียง", + "vcPitchControlF0": "ปิดเพื่อร้องเพลง เปิดเพื่อพูด", + "vcPitchControlLabel": "การควบคุมระดับเสียง", + "vcRecordAudioLabel": "บันทึกเสียง", + "vcResultsTitle": "ผลลัพธ์เซสชัน V2V", + "vcTabRecord": "ไมโครโฟน", + "vcTabUpload": "อัพโหลด", + "vcUploadFileLabel": "อัปโหลดเสียงอินพุต", + "vcVoiceLabel": "เลือกเสียงเป้าหมาย ({{0}} ให้เลือก)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/tr/FaceAnimation.json b/packages/fakeyou.com/public/locales/tr/FaceAnimation.json new file mode 100644 index 0000000000..3762555988 --- /dev/null +++ b/packages/fakeyou.com/public/locales/tr/FaceAnimation.json @@ -0,0 +1,5 @@ +{ + "hero": { + "title": "Lorem ipsum" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/tr/FaceAnimator.json b/packages/fakeyou.com/public/locales/tr/FaceAnimator.json new file mode 100644 index 0000000000..c9bf7a0241 --- /dev/null +++ b/packages/fakeyou.com/public/locales/tr/FaceAnimator.json @@ -0,0 +1,24 @@ +{ + "headings": { + "audio": "Ses", + "image": "Resim", + "subtitle": "Net bir yüz ve ses örneği seçip görüntüleyin ve dudak senkronizasyonu yapılmış bir video oluşturun.", + "title": "Yüz Animatörü" + }, + "inputs": { + "downloadFile": "Dosyayı indir", + "generate": "Oluştur", + "makeAnother": "Başka bir tane yap" + }, + "status": { + "animationComplete": "Animasyon tamamlandı!", + "animationDead": "Animasyon isteği öldü", + "animationFailed": "Animasyon başarısız oldu {{attemptCount}} denemeler). Tekrar deneyeceğim...", + "animationInProgress": "Animasyon devam ediyor", + "animationPending": "Animasyon bekleniyor...", + "animationSuccess": "Animasyon başarılı", + "requestingAnimation": "Animasyon Talep Etme", + "uploadingAudio": "Ses Yükleniyor", + "uploadingImage": "Resim Yükleniyor" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/tr/Footer.json b/packages/fakeyou.com/public/locales/tr/Footer.json new file mode 100644 index 0000000000..f6301fda53 --- /dev/null +++ b/packages/fakeyou.com/public/locales/tr/Footer.json @@ -0,0 +1,17 @@ +{ + "communityGuide": "Rehber", + "communityLeaderboard": "Liderler Sıralaması", + "communityProfile": "Benim profilim", + "communityTitle": "Toplum", + "infoAbout": "Hakkında", + "infoApiDocs": "API Dokümanları", + "infoPricing": "Fiyatlandırma", + "infoPrivacyPolicy": "Gizlilik Politikası", + "infoTerms": "Kullanım Şartları", + "infoTitle": "Bilgi", + "productTts": "Konuşma metni", + "productUploadModels": "Modelleri Yükle", + "productVc": "Sesten Sese", + "productVideo": "Video Dudak Senkronizasyonu", + "productsTitle": "Yapay Zeka Araçları" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/tr/LandingPage.json b/packages/fakeyou.com/public/locales/tr/LandingPage.json new file mode 100644 index 0000000000..bd227cd5a4 --- /dev/null +++ b/packages/fakeyou.com/public/locales/tr/LandingPage.json @@ -0,0 +1,12 @@ +{ + "community": { + "discordButton": "Anlaşmazlık", + "heading": "Topluluğa katıl", + "text": "Sizinle sohbet etmeyi çok isteriz! Sorularınız varsa lütfen Discord'da bize katılın.", + "twitterButton": "heyecan" + }, + "hero": { + "bottom": "FakeYou'nun derin sahte teknolojisiyle favori karakterlerinizin istediğiniz her şeyi söyleyen seslerini veya videolarını oluşturun.", + "top": "AI Müzik, Metinden Konuşmaya ve Sesten Sese" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/tr/Rating.json b/packages/fakeyou.com/public/locales/tr/Rating.json new file mode 100644 index 0000000000..b3cf5f68d1 --- /dev/null +++ b/packages/fakeyou.com/public/locales/tr/Rating.json @@ -0,0 +1,9 @@ +{ + "buttonBad": "Bu ses kötü geliyor", + "buttonGood": "Bu ses kulağa hoş geliyor", + "ratingBad": "Ses Kulağa Kötü Geliyor", + "ratingGood": "Ses Kulağa İyi Geliyor", + "ratingGreat": "Sesi harika geliyor", + "ratingLabel": "Değerlendirme:", + "ratingOk": "Ses Kulağa Sorunsuz Geliyor" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/tr/RecordComponent.json b/packages/fakeyou.com/public/locales/tr/RecordComponent.json new file mode 100644 index 0000000000..9c576b3db0 --- /dev/null +++ b/packages/fakeyou.com/public/locales/tr/RecordComponent.json @@ -0,0 +1,7 @@ +{ + "recordButtonClear": "Temizlemek", + "recordButtonStart": "Kayda başla", + "recordButtonStop": "Kaydetmeyi bırak", + "recordButtonUploadAudio": "Ses Yükle", + "recordButtonUploaded": "Yüklendi" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/tr/SessionTtsInferenceResultList.json b/packages/fakeyou.com/public/locales/tr/SessionTtsInferenceResultList.json new file mode 100644 index 0000000000..9e4eeece9a --- /dev/null +++ b/packages/fakeyou.com/public/locales/tr/SessionTtsInferenceResultList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioShareDownload": "Paylaş/İndir", + "resultsBlankSubText": "Henüz sonuç yok", + "resultsBlankText": "Oluşturulan ses burada görünecektir.", + "resultsProgressDead": "Hata!", + "resultsProgressFail": "Arızalı {{0}} denemeler). Tekrar deneyeceğim...", + "resultsProgressPending": "Askıda olması...", + "resultsProgressStarted": "Başladı...", + "resultsProgressSuccess": "Tamamlamak!", + "resultsTtsQueued": "TTS Sıraya Alındı:", + "resultsUpgradeLinkText": "FakeYou üyeliği", + "resultsUpgradeNotice": "Beklemek istemiyor musun? ile kuyruğun en önüne geçin." +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/tr/SessionVoiceConversionResultsList.json b/packages/fakeyou.com/public/locales/tr/SessionVoiceConversionResultsList.json new file mode 100644 index 0000000000..49e22a7841 --- /dev/null +++ b/packages/fakeyou.com/public/locales/tr/SessionVoiceConversionResultsList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioDownload": "İndirmek", + "resultsBlankSubText": "Henüz sonuç yok", + "resultsBlankText": "Oluşturulan ses burada görünecektir.", + "resultsProgressDead": "Hata!", + "resultsProgressFail": "Arızalı {{0}} denemeler). Tekrar deneyeceğim...", + "resultsProgressPending": "Askıda olması...", + "resultsProgressStarted": "Başladı...", + "resultsProgressSuccess": "Tamamlamak!", + "resultsTtsQueued": "V2V Sıraya Alındı:", + "resultsUpgradeLinkText": "FakeYou üyeliği", + "resultsUpgradeNotice": "Beklemek istemiyor musun? ile kuyruğun en önüne geçin." +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/tr/TopNav.json b/packages/fakeyou.com/public/locales/tr/TopNav.json new file mode 100644 index 0000000000..f371581085 --- /dev/null +++ b/packages/fakeyou.com/public/locales/tr/TopNav.json @@ -0,0 +1,20 @@ +{ + "buttonLogOut": "Çıkış Yap", + "buttonLogin": "Giriş yapmak", + "buttonSignUp": "Üye olmak", + "communityGuide": "Rehber", + "communityLeaderboard": "Liderler Sıralaması", + "communityProfile": "Benim profilim", + "communityTitle": "Toplum", + "infoAbout": "Hakkında", + "infoApiDocs": "API Dokümanları", + "infoPrivacyPolicy": "Gizlilik Politikası", + "infoTerms": "Kullanım Şartları", + "infoTitle": "Bilgi", + "pricingTitle": "Fiyatlandırma", + "productTts": "Konuşma metni", + "productUploadModels": "Modelleri Yükle", + "productVc": "Sesten Sese", + "productVideo": "Video Dudak Senkronizasyonu", + "productsTitle": "Yapay Zeka Araçları" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/tr/TtsModelListPage.json b/packages/fakeyou.com/public/locales/tr/TtsModelListPage.json new file mode 100644 index 0000000000..1e87276144 --- /dev/null +++ b/packages/fakeyou.com/public/locales/tr/TtsModelListPage.json @@ -0,0 +1,24 @@ +{ + "heroButtonPricing": "Fiyatlandırmayı Görüntüle", + "heroButtonProfile": "Profilimi görüntüle", + "heroButtonSignUp": "Üye olmak", + "heroButtonUpgradePlan": "Yükseltme Planı", + "heroText": "Metni favori karakterinizin konuşma sesine dönüştürün.", + "heroTitle": "Konuşma metni", + "ttsButtonClear": "Metni Temizle", + "ttsButtonExplore": "Sesleri Keşfedin", + "ttsButtonRandom": "Rastgele Ses", + "ttsButtonSpeak": "Konuşmak", + "ttsDetailsLanguageLabel": "Dil:", + "ttsDetailsViewLink": "Daha fazla ayrıntı görün", + "ttsExploreButtonClearFilter": "Kategori filtrelerini temizle", + "ttsExploreCategoryLabel": "Kategori", + "ttsExploreCategoryOptionText": "Kategori seç...", + "ttsExploreLanguageLabel": "Dil", + "ttsExploreLanguageOptionText": "Bütün diller", + "ttsResultsTitle": "Oturum TTS Sonuçları", + "ttsTextInputLabel": "Metniniz", + "ttsTextInputPlaceholder": "İstediğiniz metni girin {{character}} burada söylemek gerekirse...", + "ttsTooManyRequests": "<b>Çok fazla istek gönderiyorsun!</b> Biraz yavaşla. Sunucu meşgul olduğunda işleri biraz yavaşlatmamız gerekiyor.", + "ttsVoiceLabel": "Ses ({{0}} ndan şeçmek)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/tr/UploadComponent.json b/packages/fakeyou.com/public/locales/tr/UploadComponent.json new file mode 100644 index 0000000000..0973a58965 --- /dev/null +++ b/packages/fakeyou.com/public/locales/tr/UploadComponent.json @@ -0,0 +1,8 @@ +{ + "uploadButtonClear": "Temizlemek", + "uploadButtonUploadAudio": "Ses Yükle", + "uploadButtonUploaded": "Yüklendi", + "uploadChangeFile": "Dosyayı değiştir", + "uploadFileTextDrop": "ya da buraya bırak", + "uploadFileTextUpload": "Bir dosya yükle" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/tr/VcModelListPage.json b/packages/fakeyou.com/public/locales/tr/VcModelListPage.json new file mode 100644 index 0000000000..dc78bef191 --- /dev/null +++ b/packages/fakeyou.com/public/locales/tr/VcModelListPage.json @@ -0,0 +1,18 @@ +{ + "heroButtonPricing": "Fiyatlandırmayı Görüntüle", + "heroButtonProfile": "Profilimi görüntüle", + "heroButtonSignUp": "Üye olmak", + "heroButtonUpgradePlan": "Yükseltme Planı", + "heroText": "Sesinizi favori karakterlerinize dönüştürmek için bu aracı kullanın.", + "heroTitle": "Sesten Sese", + "vcButtonConvert": "Dönüştürmek", + "vcConvertLabel": "Sesi Dönüştür", + "vcPitchControlF0": "şarkı söylemek için kapalı, konuşmak için açık", + "vcPitchControlLabel": "Perde Kontrolü", + "vcRecordAudioLabel": "Ses kaydı", + "vcResultsTitle": "Oturum V2V Sonuçları", + "vcTabRecord": "Mikrofon", + "vcTabUpload": "Yüklemek", + "vcUploadFileLabel": "Giriş Sesini Yükle", + "vcVoiceLabel": "Hedef Sesi Seçin ({{0}} ndan şeçmek)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/vi/FaceAnimation.json b/packages/fakeyou.com/public/locales/vi/FaceAnimation.json new file mode 100644 index 0000000000..3762555988 --- /dev/null +++ b/packages/fakeyou.com/public/locales/vi/FaceAnimation.json @@ -0,0 +1,5 @@ +{ + "hero": { + "title": "Lorem ipsum" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/vi/FaceAnimator.json b/packages/fakeyou.com/public/locales/vi/FaceAnimator.json new file mode 100644 index 0000000000..ce9016d76b --- /dev/null +++ b/packages/fakeyou.com/public/locales/vi/FaceAnimator.json @@ -0,0 +1,24 @@ +{ + "headings": { + "audio": "Âm thanh", + "image": "Hình ảnh", + "subtitle": "Chọn và tạo hình ảnh có khuôn mặt rõ ràng cũng như mẫu âm thanh rồi tạo video được hát nhép.", + "title": "khuôn mặt hoạt hình" + }, + "inputs": { + "downloadFile": "Tải tập tin", + "generate": "Phát ra", + "makeAnother": "Làm một cái khác" + }, + "status": { + "animationComplete": "Hoạt hình hoàn tất!", + "animationDead": "Yêu cầu hoạt ảnh đã chết", + "animationFailed": "Hoạt ảnh không thành công {{attemptCount}} (các) lần thử. Sẽ thử lại...", + "animationInProgress": "Hoạt hình đang diễn ra", + "animationPending": "Hoạt hình đang chờ xử lý...", + "animationSuccess": "Hoạt hình thành công", + "requestingAnimation": "Yêu cầu hoạt ảnh", + "uploadingAudio": "Tải lên âm thanh", + "uploadingImage": "Tải hình ảnh lên" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/vi/Footer.json b/packages/fakeyou.com/public/locales/vi/Footer.json new file mode 100644 index 0000000000..9eb2909a26 --- /dev/null +++ b/packages/fakeyou.com/public/locales/vi/Footer.json @@ -0,0 +1,17 @@ +{ + "communityGuide": "Hướng dẫn", + "communityLeaderboard": "Bảng xếp hạng", + "communityProfile": "Thông tin của tôi", + "communityTitle": "Cộng đồng", + "infoAbout": "Về", + "infoApiDocs": "Tài liệu API", + "infoPricing": "Định giá", + "infoPrivacyPolicy": "Chính sách bảo mật", + "infoTerms": "Điều khoản sử dụng", + "infoTitle": "Thông tin", + "productTts": "Chuyển văn bản thành giọng nói", + "productUploadModels": "Tải lên mô hình", + "productVc": "Giọng nói thành giọng nói", + "productVideo": "Hát nhép video", + "productsTitle": "Công cụ AI" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/vi/LandingPage.json b/packages/fakeyou.com/public/locales/vi/LandingPage.json new file mode 100644 index 0000000000..0a427acc35 --- /dev/null +++ b/packages/fakeyou.com/public/locales/vi/LandingPage.json @@ -0,0 +1,12 @@ +{ + "community": { + "discordButton": "Bất hòa", + "heading": "Tham gia vào cộng đồng", + "text": "Chúng tôi muốn trò chuyện với bạn! Hãy tham gia cùng chúng tôi trong Discord nếu bạn có bất kỳ câu hỏi nào.", + "twitterButton": "Twitter" + }, + "hero": { + "bottom": "Tạo âm thanh hoặc video về các nhân vật yêu thích của bạn nói bất cứ điều gì bạn muốn bằng công nghệ giả sâu của FakeYou.", + "top": "Âm nhạc AI, Chuyển văn bản thành giọng nói và Giọng nói thành giọng nói" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/vi/Rating.json b/packages/fakeyou.com/public/locales/vi/Rating.json new file mode 100644 index 0000000000..821c28057e --- /dev/null +++ b/packages/fakeyou.com/public/locales/vi/Rating.json @@ -0,0 +1,9 @@ +{ + "buttonBad": "Giọng này nghe dở quá", + "buttonGood": "Giọng này nghe hay đấy", + "ratingBad": "Giọng nói nghe tệ", + "ratingGood": "Giọng nói nghe hay", + "ratingGreat": "Giọng nói nghe rất hay", + "ratingLabel": "Xếp hạng:", + "ratingOk": "Giọng nói ổn" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/vi/RecordComponent.json b/packages/fakeyou.com/public/locales/vi/RecordComponent.json new file mode 100644 index 0000000000..1a9ad95099 --- /dev/null +++ b/packages/fakeyou.com/public/locales/vi/RecordComponent.json @@ -0,0 +1,7 @@ +{ + "recordButtonClear": "Thông thoáng", + "recordButtonStart": "Bắt đầu ghi âm", + "recordButtonStop": "Dừng ghi", + "recordButtonUploadAudio": "Tải lên âm thanh", + "recordButtonUploaded": "Đã tải lên" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/vi/SessionTtsInferenceResultList.json b/packages/fakeyou.com/public/locales/vi/SessionTtsInferenceResultList.json new file mode 100644 index 0000000000..ce72f75093 --- /dev/null +++ b/packages/fakeyou.com/public/locales/vi/SessionTtsInferenceResultList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioShareDownload": "Chia sẻ/Tải xuống", + "resultsBlankSubText": "Chưa có kết quả", + "resultsBlankText": "Âm thanh được tạo sẽ xuất hiện ở đây.", + "resultsProgressDead": "Lỗi!", + "resultsProgressFail": "Thất bại {{0}} (các) lần thử. Sẽ thử lại...", + "resultsProgressPending": "Chưa giải quyết...", + "resultsProgressStarted": "Đã bắt đầu...", + "resultsProgressSuccess": "Hoàn thành!", + "resultsTtsQueued": "TTS xếp hàng:", + "resultsUpgradeLinkText": "Thành viên FakeYou", + "resultsUpgradeNotice": "Bạn không muốn chờ đợi? Chuyển đến phía trước hàng đợi với một" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/vi/SessionVoiceConversionResultsList.json b/packages/fakeyou.com/public/locales/vi/SessionVoiceConversionResultsList.json new file mode 100644 index 0000000000..22b79631d1 --- /dev/null +++ b/packages/fakeyou.com/public/locales/vi/SessionVoiceConversionResultsList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioDownload": "Tải xuống", + "resultsBlankSubText": "Chưa có kết quả", + "resultsBlankText": "Âm thanh được tạo sẽ xuất hiện ở đây.", + "resultsProgressDead": "Lỗi!", + "resultsProgressFail": "Thất bại {{0}} (các) lần thử. Sẽ thử lại...", + "resultsProgressPending": "Chưa giải quyết...", + "resultsProgressStarted": "Đã bắt đầu...", + "resultsProgressSuccess": "Hoàn thành!", + "resultsTtsQueued": "Xếp hàng V2V:", + "resultsUpgradeLinkText": "Thành viên FakeYou", + "resultsUpgradeNotice": "Bạn không muốn chờ đợi? Chuyển đến phía trước hàng đợi với một" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/vi/TopNav.json b/packages/fakeyou.com/public/locales/vi/TopNav.json new file mode 100644 index 0000000000..7ad99856e5 --- /dev/null +++ b/packages/fakeyou.com/public/locales/vi/TopNav.json @@ -0,0 +1,20 @@ +{ + "buttonLogOut": "Đăng xuất", + "buttonLogin": "Đăng nhập", + "buttonSignUp": "Đăng ký", + "communityGuide": "Hướng dẫn", + "communityLeaderboard": "Bảng xếp hạng", + "communityProfile": "Thông tin của tôi", + "communityTitle": "Cộng đồng", + "infoAbout": "Về", + "infoApiDocs": "Tài liệu API", + "infoPrivacyPolicy": "Chính sách bảo mật", + "infoTerms": "Điều khoản sử dụng", + "infoTitle": "Thông tin", + "pricingTitle": "Định giá", + "productTts": "Chuyển văn bản thành giọng nói", + "productUploadModels": "Tải lên mô hình", + "productVc": "Giọng nói thành giọng nói", + "productVideo": "Hát nhép video", + "productsTitle": "Công cụ AI" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/vi/TtsModelListPage.json b/packages/fakeyou.com/public/locales/vi/TtsModelListPage.json new file mode 100644 index 0000000000..4512ec6fda --- /dev/null +++ b/packages/fakeyou.com/public/locales/vi/TtsModelListPage.json @@ -0,0 +1,24 @@ +{ + "heroButtonPricing": "Xem giá", + "heroButtonProfile": "Xem hồ sơ của tôi", + "heroButtonSignUp": "Đăng ký", + "heroButtonUpgradePlan": "Kế hoạch nâng cấp", + "heroText": "Biến văn bản thành giọng nói của nhân vật bạn yêu thích.", + "heroTitle": "Chuyển văn bản thành giọng nói", + "ttsButtonClear": "Xóa văn bản", + "ttsButtonExplore": "Khám phá giọng nói", + "ttsButtonRandom": "Giọng nói ngẫu nhiên", + "ttsButtonSpeak": "Nói chuyện", + "ttsDetailsLanguageLabel": "Ngôn ngữ:", + "ttsDetailsViewLink": "Xem thêm chi tiết", + "ttsExploreButtonClearFilter": "Xóa bộ lọc danh mục", + "ttsExploreCategoryLabel": "Loại", + "ttsExploreCategoryOptionText": "Chọn danh mục...", + "ttsExploreLanguageLabel": "Ngôn ngữ", + "ttsExploreLanguageOptionText": "Tất cả các ngôn ngữ", + "ttsResultsTitle": "Kết quả TTS phiên", + "ttsTextInputLabel": "Văn bản của bạn", + "ttsTextInputPlaceholder": "Nhập văn bản bạn muốn {{character}} để nói ở đây...", + "ttsTooManyRequests": "<b>Bạn đang gửi quá nhiều yêu cầu!</b> Chậm lại một chút. Chúng tôi phải làm mọi thứ chậm lại một chút khi máy chủ bận.", + "ttsVoiceLabel": "Tiếng nói ({{0}} để lựa chọn)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/vi/UploadComponent.json b/packages/fakeyou.com/public/locales/vi/UploadComponent.json new file mode 100644 index 0000000000..975a15921a --- /dev/null +++ b/packages/fakeyou.com/public/locales/vi/UploadComponent.json @@ -0,0 +1,8 @@ +{ + "uploadButtonClear": "Thông thoáng", + "uploadButtonUploadAudio": "Tải lên âm thanh", + "uploadButtonUploaded": "Đã tải lên", + "uploadChangeFile": "Thay đổi tập tin", + "uploadFileTextDrop": "hoặc thả nó ở đây", + "uploadFileTextUpload": "Tải lên một tài liệu" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/vi/VcModelListPage.json b/packages/fakeyou.com/public/locales/vi/VcModelListPage.json new file mode 100644 index 0000000000..b9040dc7b8 --- /dev/null +++ b/packages/fakeyou.com/public/locales/vi/VcModelListPage.json @@ -0,0 +1,18 @@ +{ + "heroButtonPricing": "Xem giá", + "heroButtonProfile": "Xem hồ sơ của tôi", + "heroButtonSignUp": "Đăng ký", + "heroButtonUpgradePlan": "Kế hoạch nâng cấp", + "heroText": "Sử dụng công cụ này để thay đổi giọng nói của bạn thành các nhân vật bạn yêu thích.", + "heroTitle": "Giọng nói thành giọng nói", + "vcButtonConvert": "Chuyển thành", + "vcConvertLabel": "Chuyển đổi âm thanh", + "vcPitchControlF0": "tắt để hát, bật để phát biểu", + "vcPitchControlLabel": "Kiểm soát sân", + "vcRecordAudioLabel": "Ghi âm", + "vcResultsTitle": "Kết quả phiên V2V", + "vcTabRecord": "Cái mic cờ rô", + "vcTabUpload": "Tải lên", + "vcUploadFileLabel": "Tải lên âm thanh đầu vào", + "vcVoiceLabel": "Chọn Giọng nói mục tiêu ({{0}} để lựa chọn)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/zh-Hans/FaceAnimation.json b/packages/fakeyou.com/public/locales/zh-Hans/FaceAnimation.json new file mode 100644 index 0000000000..32f258035e --- /dev/null +++ b/packages/fakeyou.com/public/locales/zh-Hans/FaceAnimation.json @@ -0,0 +1,5 @@ +{ + "hero": { + "title": "洛雷姆·伊普苏姆" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/zh-Hans/FaceAnimator.json b/packages/fakeyou.com/public/locales/zh-Hans/FaceAnimator.json new file mode 100644 index 0000000000..cdaa4b3782 --- /dev/null +++ b/packages/fakeyou.com/public/locales/zh-Hans/FaceAnimator.json @@ -0,0 +1,24 @@ +{ + "headings": { + "audio": "声音的", + "image": "图像", + "subtitle": "选择具有清晰脸部和音频样本的图像,并生成口型同步视频。", + "title": "脸部动画师" + }, + "inputs": { + "downloadFile": "下载文件", + "generate": "产生", + "makeAnother": "再做一个" + }, + "status": { + "animationComplete": "动画完成!", + "animationDead": "动画请求失效", + "animationFailed": "动画失败 {{attemptCount}} 尝试。将重试...", + "animationInProgress": "动画正在进行中", + "animationPending": "动画待定...", + "animationSuccess": "动画成功", + "requestingAnimation": "请求动画", + "uploadingAudio": "上传音频", + "uploadingImage": "上传图片" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/zh-Hans/Footer.json b/packages/fakeyou.com/public/locales/zh-Hans/Footer.json new file mode 100644 index 0000000000..bd1c5a7ae5 --- /dev/null +++ b/packages/fakeyou.com/public/locales/zh-Hans/Footer.json @@ -0,0 +1,17 @@ +{ + "communityGuide": "指导", + "communityLeaderboard": "排行榜", + "communityProfile": "我的简历", + "communityTitle": "社区", + "infoAbout": "关于", + "infoApiDocs": "API文档", + "infoPricing": "价钱", + "infoPrivacyPolicy": "隐私政策", + "infoTerms": "使用条款", + "infoTitle": "信息", + "productTts": "文字转语音", + "productUploadModels": "上传模型", + "productVc": "语音到语音", + "productVideo": "视频唇形同步", + "productsTitle": "人工智能工具" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/zh-Hans/LandingPage.json b/packages/fakeyou.com/public/locales/zh-Hans/LandingPage.json new file mode 100644 index 0000000000..a1d5887bd1 --- /dev/null +++ b/packages/fakeyou.com/public/locales/zh-Hans/LandingPage.json @@ -0,0 +1,12 @@ +{ + "community": { + "discordButton": "不和谐", + "heading": "加入社区", + "text": "我们很乐意与您聊天!如果您有任何疑问,请加入我们的 Discord。", + "twitterButton": "推特" + }, + "hero": { + "bottom": "使用 FakeYou 的深度假技术生成您最喜欢的角色的音频或视频,说出您想说的任何内容。", + "top": "AI 音乐、文字转语音、语音转语音" + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/zh-Hans/Rating.json b/packages/fakeyou.com/public/locales/zh-Hans/Rating.json new file mode 100644 index 0000000000..2ff015a674 --- /dev/null +++ b/packages/fakeyou.com/public/locales/zh-Hans/Rating.json @@ -0,0 +1,9 @@ +{ + "buttonBad": "这声音不好听", + "buttonGood": "这声音好听", + "ratingBad": "声音听起来不好", + "ratingGood": "声音听起来不错", + "ratingGreat": "声音听起来很棒", + "ratingLabel": "评分:", + "ratingOk": "声音听起来不错" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/zh-Hans/RecordComponent.json b/packages/fakeyou.com/public/locales/zh-Hans/RecordComponent.json new file mode 100644 index 0000000000..4eddedbbc1 --- /dev/null +++ b/packages/fakeyou.com/public/locales/zh-Hans/RecordComponent.json @@ -0,0 +1,7 @@ +{ + "recordButtonClear": "清除", + "recordButtonStart": "开始录音", + "recordButtonStop": "停止录音", + "recordButtonUploadAudio": "上传音频", + "recordButtonUploaded": "已上传" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/zh-Hans/SessionTtsInferenceResultList.json b/packages/fakeyou.com/public/locales/zh-Hans/SessionTtsInferenceResultList.json new file mode 100644 index 0000000000..55c19c7b1d --- /dev/null +++ b/packages/fakeyou.com/public/locales/zh-Hans/SessionTtsInferenceResultList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioShareDownload": "分享/下载", + "resultsBlankSubText": "还没有结果", + "resultsBlankText": "生成的音频将出现在此处。", + "resultsProgressDead": "错误!", + "resultsProgressFail": "失败的 {{0}} 尝试。将重试...", + "resultsProgressPending": "待办的...", + "resultsProgressStarted": "开始...", + "resultsProgressSuccess": "完全的!", + "resultsTtsQueued": "TTS 排队:", + "resultsUpgradeLinkText": "假你会员", + "resultsUpgradeNotice": "不想等?跳到队列前面" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/zh-Hans/SessionVoiceConversionResultsList.json b/packages/fakeyou.com/public/locales/zh-Hans/SessionVoiceConversionResultsList.json new file mode 100644 index 0000000000..b4b8ed1df7 --- /dev/null +++ b/packages/fakeyou.com/public/locales/zh-Hans/SessionVoiceConversionResultsList.json @@ -0,0 +1,13 @@ +{ + "resultsAudioDownload": "下载", + "resultsBlankSubText": "还没有结果", + "resultsBlankText": "生成的音频将出现在此处。", + "resultsProgressDead": "错误!", + "resultsProgressFail": "失败的 {{0}} 尝试。将重试...", + "resultsProgressPending": "待办的...", + "resultsProgressStarted": "开始...", + "resultsProgressSuccess": "完全的!", + "resultsTtsQueued": "V2V 排队:", + "resultsUpgradeLinkText": "假你会员", + "resultsUpgradeNotice": "不想等?跳到队列前面" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/zh-Hans/TopNav.json b/packages/fakeyou.com/public/locales/zh-Hans/TopNav.json new file mode 100644 index 0000000000..d7f5021288 --- /dev/null +++ b/packages/fakeyou.com/public/locales/zh-Hans/TopNav.json @@ -0,0 +1,20 @@ +{ + "buttonLogOut": "登出", + "buttonLogin": "登录", + "buttonSignUp": "报名", + "communityGuide": "指导", + "communityLeaderboard": "排行榜", + "communityProfile": "我的简历", + "communityTitle": "社区", + "infoAbout": "关于", + "infoApiDocs": "API文档", + "infoPrivacyPolicy": "隐私政策", + "infoTerms": "使用条款", + "infoTitle": "信息", + "pricingTitle": "价钱", + "productTts": "文字转语音", + "productUploadModels": "上传模型", + "productVc": "语音到语音", + "productVideo": "视频唇形同步", + "productsTitle": "人工智能工具" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/zh-Hans/TtsModelListPage.json b/packages/fakeyou.com/public/locales/zh-Hans/TtsModelListPage.json new file mode 100644 index 0000000000..2c2bc287e6 --- /dev/null +++ b/packages/fakeyou.com/public/locales/zh-Hans/TtsModelListPage.json @@ -0,0 +1,24 @@ +{ + "heroButtonPricing": "查看定价", + "heroButtonProfile": "查看我的个人资料", + "heroButtonSignUp": "报名", + "heroButtonUpgradePlan": "升级计划", + "heroText": "将文本转换为您最喜欢的角色的说话声音。", + "heroTitle": "文字转语音", + "ttsButtonClear": "清晰的文本", + "ttsButtonExplore": "探索声音", + "ttsButtonRandom": "随机语音", + "ttsButtonSpeak": "说话", + "ttsDetailsLanguageLabel": "语言:", + "ttsDetailsViewLink": "查看更多详情", + "ttsExploreButtonClearFilter": "清除类别过滤器", + "ttsExploreCategoryLabel": "类别", + "ttsExploreCategoryOptionText": "选择类别...", + "ttsExploreLanguageLabel": "语言", + "ttsExploreLanguageOptionText": "所有语言", + "ttsResultsTitle": "会话 TTS 结果", + "ttsTextInputLabel": "您的文字", + "ttsTextInputPlaceholder": "输入您想要的文字 {{character}} 在这里说...", + "ttsTooManyRequests": "<b>您发送的请求太多!</b> 慢一点。当服务器繁忙时,我们必须放慢速度。", + "ttsVoiceLabel": "嗓音 ({{0}} 从中选择)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/zh-Hans/UploadComponent.json b/packages/fakeyou.com/public/locales/zh-Hans/UploadComponent.json new file mode 100644 index 0000000000..a25f041946 --- /dev/null +++ b/packages/fakeyou.com/public/locales/zh-Hans/UploadComponent.json @@ -0,0 +1,8 @@ +{ + "uploadButtonClear": "清除", + "uploadButtonUploadAudio": "上传音频", + "uploadButtonUploaded": "已上传", + "uploadChangeFile": "更改文件", + "uploadFileTextDrop": "或将其放在此处", + "uploadFileTextUpload": "上传一个文件" +} \ No newline at end of file diff --git a/packages/fakeyou.com/public/locales/zh-Hans/VcModelListPage.json b/packages/fakeyou.com/public/locales/zh-Hans/VcModelListPage.json new file mode 100644 index 0000000000..a0fc86f40a --- /dev/null +++ b/packages/fakeyou.com/public/locales/zh-Hans/VcModelListPage.json @@ -0,0 +1,18 @@ +{ + "heroButtonPricing": "查看定价", + "heroButtonProfile": "查看我的个人资料", + "heroButtonSignUp": "报名", + "heroButtonUpgradePlan": "升级计划", + "heroText": "使用此工具将您的声音更改为您最喜欢的角色。", + "heroTitle": "语音到语音", + "vcButtonConvert": "转变", + "vcConvertLabel": "转换音频", + "vcPitchControlF0": "关闭时唱歌,开启时演讲", + "vcPitchControlLabel": "变桨控制", + "vcRecordAudioLabel": "录制音频", + "vcResultsTitle": "会议 V2V 结果", + "vcTabRecord": "麦克风", + "vcTabUpload": "上传", + "vcUploadFileLabel": "上传输入音频", + "vcVoiceLabel": "选择目标语音 ({{0}} 从中选择)" +} \ No newline at end of file diff --git a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/FaceAnimatorSuccess.tsx b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/FaceAnimatorSuccess.tsx index 8d1c338c12..d76fce1c44 100644 --- a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/FaceAnimatorSuccess.tsx +++ b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/FaceAnimatorSuccess.tsx @@ -19,11 +19,12 @@ interface Props { enqueueInferenceJob: any; sessionSubscriptionsWrapper: any; inferenceJobsByCategory: any; + t: any; } const DEFAULT_QUEUE_REFRESH_INTERVAL_MILLIS = 15000; -export default function FaceAnimatorSuccess({ audioProps, imageProps, style, enqueueInferenceJob, sessionSubscriptionsWrapper, inferenceJobsByCategory }: Props) { +export default function FaceAnimatorSuccess({ audioProps, imageProps, style, enqueueInferenceJob, sessionSubscriptionsWrapper, inferenceJobsByCategory, t }: Props) { const [pending, pendingSet] = useState<GetPendingTtsJobCountSuccessResponse>({ success: true, pending_job_count: 0, @@ -35,12 +36,12 @@ export default function FaceAnimatorSuccess({ audioProps, imageProps, style, enq const processStatus = (job: InferenceJob) => { switch (job.jobState) { case JobState.PENDING: - case JobState.UNKNOWN: return "Animation pending ..."; - case JobState.STARTED: return "Animation in progress"; - case JobState.ATTEMPT_FAILED: return `Animation failed ${job.attemptCount} attempt(s). Will retry...`; + case JobState.UNKNOWN: return t("status.animationPending"); + case JobState.STARTED: return t("status.animationInProgress"); + case JobState.ATTEMPT_FAILED: return t("status.animationPending",{ attemptCount: job.attemptCount }); case JobState.COMPLETE_FAILURE: - case JobState.DEAD: return "Animation request dead."; - case JobState.COMPLETE_SUCCESS: return "Animation successful"; + case JobState.DEAD: return t("status.animationDead"); + case JobState.COMPLETE_SUCCESS: return t("status.animationSuccess"); } }; @@ -73,7 +74,7 @@ export default function FaceAnimatorSuccess({ audioProps, imageProps, style, enq <h3>{ processStatus(job) }</h3> <span {...{ className: "job-id" }}>id: { job.jobToken }</span> </div> : <div> - <h3>Animation complete!</h3> + <h3>{ t("status.animationComplete") }</h3> <span {...{ className: "job-id" }}>id: { job.jobToken }</span> <a {...{ className: "btn btn-primary w-100 mt-4", @@ -82,7 +83,7 @@ export default function FaceAnimatorSuccess({ audioProps, imageProps, style, enq onClick:() => Analytics.voiceConversionClickDownload() }}> <FontAwesomeIcon icon={faDownload} className="me-2" /> - Download File{" "} + { t("inputs.downloadFile") } </a> </div>).reverse() }</div> diff --git a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/FaceAnimatorTitle.js b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/FaceAnimatorTitle.js index 49a8b1b2c6..2cbdd2decd 100644 --- a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/FaceAnimatorTitle.js +++ b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/FaceAnimatorTitle.js @@ -25,13 +25,13 @@ const ProgressLi = ({ children, disabled = false }: { children?: any, disabled?: }; export default function FaceAnimatorTitle({ ...rest }) { - const { audioProps, audioReady, imageProps, imageReady, indexSet, page, submit } = rest; + const { audioProps, audioReady, imageProps, imageReady, indexSet, page, submit, t } = rest; const noAudio = !audioReady || !audioProps.file; const noImg = !imageReady || !imageProps.file; const incomplete = noAudio || noImg; const working = imageProps.working && audioProps.working; - const slides = ["Generate",<Spinner />,"Make another"]; + const slides = [t("inputs.generate"),<Spinner />,t("inputs.makeAnother")]; const onClick = () => { if (page === 2) { @@ -41,19 +41,19 @@ export default function FaceAnimatorTitle({ ...rest }) { return <div {...{ className: "progress-header" }}> <h1 {...{ className: "fw-bold text-center text-md-start progress-heading" }}> - Face Animator + { t("headings.title") } </h1> <ul {...{ className: 'async-progress-tracker' }}> <ProgressLi {...{ disabled: noImg }}> - Image + { t("headings.image") } </ProgressLi> <ProgressLi {...{ disabled: noAudio }}> - Audio + { t("headings.audio") } </ProgressLi> </ul> <DynamicButton {...{ disabled: incomplete || working, onClick, slides, index: page }}/> <p {...{ className: "progress-description" }}> - Select and image with a clear face, and an audio sample, and generate a lipsynced video. + { t("headings.subtitle") } </p> </div> }; \ No newline at end of file diff --git a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx index 57248f3163..1a550990d2 100644 --- a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx +++ b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx @@ -1,7 +1,7 @@ import React, { useState } from "react"; import { animated, useTransition } from '@react-spring/web'; import { v4 as uuidv4 } from "uuid"; -import { useFile } from "hooks"; +import { useFile, useLocalize } from "hooks"; import { AudioInput, ImageInput, Spinner } from "components/common"; import { springs } from "resources"; import { @@ -27,7 +27,7 @@ import { SessionSubscriptionsWrapper } from "@storyteller/components/src/session import { FrontendInferenceJobType, InferenceJob } from "@storyteller/components/src/jobs/InferenceJob"; -interface LipSyncProps { audioProps: any, children?: any, imageProps: any, index: number, toggle: any, style: any, enqueueInferenceJob: any, sessionSubscriptionsWrapper: any, inferenceJobsByCategory: any, }; +interface LipSyncProps { audioProps: any, children?: any, imageProps: any, index: number, toggle: any, style: any, enqueueInferenceJob: any, sessionSubscriptionsWrapper: any, t: any, inferenceJobsByCategory: any, }; interface EditorProps { sessionSubscriptionsWrapper: SessionSubscriptionsWrapper; enqueueInferenceJob: ( @@ -40,14 +40,14 @@ interface EditorProps { const softSpring = { config: { mass: 1, tension: 80, friction: 10 } } -const InputPage = ({ audioProps, imageProps, toggle, style }: LipSyncProps ) => { +const InputPage = ({ audioProps, imageProps, toggle, style, t }: LipSyncProps ) => { return <animated.div {...{ className: "lipsync-editor", style }}> <div {...{ className: "grid-heading" }}> - <h5>Image</h5> + <h5>{ t("headings.image") }</h5> </div> <div {...{ className: "grid-heading" }}> - <h5>Audio</h5> + <h5>{ t("headings.audio") }</h5> </div> <div {...{ className: "grid-square lipsync-audio" }}> <ImageInput {...{ ...imageProps, onRest: () => toggle.image(imageProps.file ? true : false) }}/> @@ -59,10 +59,9 @@ const InputPage = ({ audioProps, imageProps, toggle, style }: LipSyncProps ) => </div> </animated.div>}; -const workStatus = ["","Uploading Audio","Uploading Image","Starting animation",""]; -// const jammy = ko => -const Working = ({ audioProps, imageProps, index, style }: LipSyncProps ) => { +const Working = ({ audioProps, imageProps, index, style, t }: LipSyncProps ) => { + const workStatus = ["",t("status.uploadingAudio"),t("status.uploadingImage"),t("status.requestingAnimation"),""]; const transitions = useTransition(index, { ...springs.soft, from: { opacity: 0, position: "absolute" }, @@ -80,6 +79,7 @@ const Working = ({ audioProps, imageProps, index, style }: LipSyncProps ) => { }; export default function LipsyncEditor({ enqueueInferenceJob, sessionSubscriptionsWrapper, inferenceJobsByCategory, ...rest }: EditorProps) { + const { t } = useLocalize("FaceAnimator"); // the ready states are set by functions which run after the upload input animation is completed, which then illuminates the respective checkmark in a staggered way to draw attention to the workflow, and reduces concurrent animations @@ -139,7 +139,7 @@ export default function LipsyncEditor({ enqueueInferenceJob, sessionSubscription }); }; const page = index === 0 ? 0 : index === 4 ? 2 : 1; - const headerProps = { audioProps, audioReady, imageProps, imageReady, indexSet, page, submit }; + const headerProps = { audioProps, audioReady, imageProps, imageReady, indexSet, page, submit , t}; const transitions = useTransition(index, { ...softSpring, @@ -161,6 +161,7 @@ export default function LipsyncEditor({ enqueueInferenceJob, sessionSubscription sessionSubscriptionsWrapper, inferenceJobsByCategory, index, + t, toggle: { audio: readyMedia(1), image: readyMedia(0) }, style }}/> : <></> From 7c2d656624b447017396cdac6850e7e6fc88e591 Mon Sep 17 00:00:00 2001 From: olivicmic <vic@vics.pics> Date: Sat, 23 Sep 2023 16:35:45 -0700 Subject: [PATCH 08/10] changed face-aniamtion routing component --- .../fakeyou.com/src/v2/view/PageContainer.tsx | 24 +++++-------------- .../face-animation/FaceAnimationPage.tsx | 2 +- 2 files changed, 7 insertions(+), 19 deletions(-) diff --git a/packages/fakeyou.com/src/v2/view/PageContainer.tsx b/packages/fakeyou.com/src/v2/view/PageContainer.tsx index 4cd07c07bb..13db5b9da7 100644 --- a/packages/fakeyou.com/src/v2/view/PageContainer.tsx +++ b/packages/fakeyou.com/src/v2/view/PageContainer.tsx @@ -81,7 +81,6 @@ import { VoiceConversionModelListItem } from "@storyteller/components/src/api/vo import { CommunityCommissionsPage } from "./pages/contest/CommunityCommissionsPage"; import { ProductUsageInfoPage } from "./pages/product_usage_info/ProductUsageInfoPage"; import { TestingPage } from "./pages/testing/TestingPage"; -import { FaceAnimationPage } from "./pages/face-animation/FaceAnimationPage"; interface Props { sessionWrapper: SessionWrapper; @@ -433,15 +432,6 @@ class PageContainer extends React.Component<Props, State> { <CreateCategoryPage sessionWrapper={this.props.sessionWrapper} /> </Route> - <Route path="/dev-lipsync"> - <LipsyncEditor {...{ - enqueueInferenceJob: this.props.enqueueInferenceJob, - sessionSubscriptionsWrapper: this.props.sessionSubscriptionsWrapper, - inferenceJobs: this.props.inferenceJobs, - inferenceJobsByCategory: this.props.inferenceJobsByCategory - }} /> - </Route> - <Route path="/media/:token"> <Media/> </Route> @@ -554,14 +544,12 @@ class PageContainer extends React.Component<Props, State> { </Route> <Route path="/face-animation"> - <FaceAnimationPage - sessionSubscriptionsWrapper={ - this.props.sessionSubscriptionsWrapper - } - enqueueInferenceJob={this.props.enqueueInferenceJob} - inferenceJobs={this.props.inferenceJobs} - inferenceJobsByCategory={this.props.inferenceJobsByCategory} - /> + <LipsyncEditor {...{ + enqueueInferenceJob: this.props.enqueueInferenceJob, + sessionSubscriptionsWrapper: this.props.sessionSubscriptionsWrapper, + inferenceJobs: this.props.inferenceJobs, + inferenceJobsByCategory: this.props.inferenceJobsByCategory + }} /> </Route> <Route path="/commissions"> diff --git a/packages/fakeyou.com/src/v2/view/pages/face-animation/FaceAnimationPage.tsx b/packages/fakeyou.com/src/v2/view/pages/face-animation/FaceAnimationPage.tsx index 5587e6bb3f..578837dd18 100644 --- a/packages/fakeyou.com/src/v2/view/pages/face-animation/FaceAnimationPage.tsx +++ b/packages/fakeyou.com/src/v2/view/pages/face-animation/FaceAnimationPage.tsx @@ -50,7 +50,7 @@ function FaceAnimationPage(props: Props) { if (EnqueueFaceAnimationIsSuccess(result)) { props.enqueueInferenceJob( - result.inference_job_token, + result.inference_job_token!, FrontendInferenceJobType.FaceAnimation ); } From 4c57d367bc46a100ac5ae76b70a08d54a10d96cd Mon Sep 17 00:00:00 2001 From: olivicmic <vic@vics.pics> Date: Wed, 27 Sep 2023 15:54:43 -0700 Subject: [PATCH 09/10] js -> to tsx file rename + responsiveness --- .../common/ImageInput/ImageInput.scss | 8 + .../common/ImageInput/ImageInput.tsx | 2 +- .../fakeyou.com/src/scss/_breakpoint.scss | 114 ++++++++++ .../src/scss/breakpoint/_context.scss | 95 ++++++++ .../src/scss/breakpoint/_helpers.scss | 151 ++++++++++++ .../src/scss/breakpoint/_legacy-settings.scss | 50 ++++ .../src/scss/breakpoint/_no-query.scss | 15 ++ .../src/scss/breakpoint/_parsers.scss | 215 ++++++++++++++++++ .../src/scss/breakpoint/_respond-to.scss | 82 +++++++ .../src/scss/breakpoint/_settings.scss | 71 ++++++ .../src/scss/breakpoint/parsers/_double.scss | 33 +++ .../src/scss/breakpoint/parsers/_query.scss | 82 +++++++ .../scss/breakpoint/parsers/_resolution.scss | 31 +++ .../src/scss/breakpoint/parsers/_single.scss | 26 +++ .../src/scss/breakpoint/parsers/_triple.scss | 36 +++ .../parsers/double/_default-pair.scss | 21 ++ .../breakpoint/parsers/double/_default.scss | 22 ++ .../parsers/double/_double-string.scss | 22 ++ .../parsers/resolution/_resolution.scss | 60 +++++ .../breakpoint/parsers/single/_default.scss | 13 ++ .../breakpoint/parsers/triple/_default.scss | 18 ++ .../lipsync/LipsyncEditor/DynamicButton.tsx | 2 +- ...AnimatorTitle.js => FaceAnimatorTitle.tsx} | 2 +- .../lipsync/LipsyncEditor/LipsyncEditor.scss | 72 ++---- .../lipsync/LipsyncEditor/LipsyncEditor.tsx | 35 ++- 25 files changed, 1214 insertions(+), 64 deletions(-) create mode 100755 packages/fakeyou.com/src/scss/_breakpoint.scss create mode 100755 packages/fakeyou.com/src/scss/breakpoint/_context.scss create mode 100755 packages/fakeyou.com/src/scss/breakpoint/_helpers.scss create mode 100755 packages/fakeyou.com/src/scss/breakpoint/_legacy-settings.scss create mode 100755 packages/fakeyou.com/src/scss/breakpoint/_no-query.scss create mode 100755 packages/fakeyou.com/src/scss/breakpoint/_parsers.scss create mode 100755 packages/fakeyou.com/src/scss/breakpoint/_respond-to.scss create mode 100755 packages/fakeyou.com/src/scss/breakpoint/_settings.scss create mode 100755 packages/fakeyou.com/src/scss/breakpoint/parsers/_double.scss create mode 100755 packages/fakeyou.com/src/scss/breakpoint/parsers/_query.scss create mode 100755 packages/fakeyou.com/src/scss/breakpoint/parsers/_resolution.scss create mode 100755 packages/fakeyou.com/src/scss/breakpoint/parsers/_single.scss create mode 100755 packages/fakeyou.com/src/scss/breakpoint/parsers/_triple.scss create mode 100755 packages/fakeyou.com/src/scss/breakpoint/parsers/double/_default-pair.scss create mode 100755 packages/fakeyou.com/src/scss/breakpoint/parsers/double/_default.scss create mode 100755 packages/fakeyou.com/src/scss/breakpoint/parsers/double/_double-string.scss create mode 100755 packages/fakeyou.com/src/scss/breakpoint/parsers/resolution/_resolution.scss create mode 100755 packages/fakeyou.com/src/scss/breakpoint/parsers/single/_default.scss create mode 100755 packages/fakeyou.com/src/scss/breakpoint/parsers/triple/_default.scss rename packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/{FaceAnimatorTitle.js => FaceAnimatorTitle.tsx} (93%) diff --git a/packages/fakeyou.com/src/components/common/ImageInput/ImageInput.scss b/packages/fakeyou.com/src/components/common/ImageInput/ImageInput.scss index aec912d70b..21d1aaeced 100644 --- a/packages/fakeyou.com/src/components/common/ImageInput/ImageInput.scss +++ b/packages/fakeyou.com/src/components/common/ImageInput/ImageInput.scss @@ -1,4 +1,12 @@ @import "scss/colours.scss"; +@import "scss/_breakpoint.scss"; + + +.image-upload-frame { + @include breakpoint(min-width 992px) { + aspect-ratio: 1/1; + } +} .fy-image-uploader { display: flex; diff --git a/packages/fakeyou.com/src/components/common/ImageInput/ImageInput.tsx b/packages/fakeyou.com/src/components/common/ImageInput/ImageInput.tsx index a5ec1b2c81..883fd0a67e 100644 --- a/packages/fakeyou.com/src/components/common/ImageInput/ImageInput.tsx +++ b/packages/fakeyou.com/src/components/common/ImageInput/ImageInput.tsx @@ -30,7 +30,7 @@ export default function ImageInput({ blob = "", clear = n, file, hideActions, hi opacity: loaded ? 1 : 0 }); - return <FileWrapper {...{ fileTypes, ...inputProps, ...rest }}> + return <FileWrapper {...{ fileTypes, panelClass: "image-upload-frame", ...inputProps, ...rest }}> <div {...{ className: "fy-image-uploader" }}> { file ? <> <a.img {...{ alt: "file preview", className: "file-preview", onLoad, src: blob, style }} /> diff --git a/packages/fakeyou.com/src/scss/_breakpoint.scss b/packages/fakeyou.com/src/scss/_breakpoint.scss new file mode 100755 index 0000000000..2ede6b7e2d --- /dev/null +++ b/packages/fakeyou.com/src/scss/_breakpoint.scss @@ -0,0 +1,114 @@ +////////////////////////////// +// Default Variables +////////////////////////////// +$Breakpoint-Settings: ( + 'default media': all, + 'default feature': min-width, + 'default pair': width, + + 'force all media type': false, + 'to ems': false, + 'transform resolutions': true, + + 'no queries': false, + 'no query fallbacks': false, + + 'base font size': 16px, + + 'legacy syntax': false +); + +$breakpoint: () !default; + +////////////////////////////// +// Imports +////////////////////////////// +@import "breakpoint/settings"; +@import 'breakpoint/context'; +@import 'breakpoint/helpers'; +@import 'breakpoint/parsers'; +@import 'breakpoint/no-query'; + +@import 'breakpoint/respond-to'; + +@import "breakpoint/legacy-settings"; + +////////////////////////////// +// Breakpoint Mixin +////////////////////////////// + +@mixin breakpoint($query, $no-query: false) { + @include legacy-settings-warning; + + // Reset contexts + @include private-breakpoint-reset-contexts(); + + $breakpoint: breakpoint($query, false); + + $query-string: map-get($breakpoint, 'query'); + $query-fallback: map-get($breakpoint, 'fallback'); + + $private-breakpoint-context-holder: map-get($breakpoint, 'context holder') !global; + $private-breakpoint-query-count: map-get($breakpoint, 'query count') !global; + + // Allow for an as-needed override or usage of no query fallback. + @if $no-query != false { + $query-fallback: $no-query; + } + + @if $query-fallback != false { + $context-setter: private-breakpoint-set-context('no-query', $query-fallback); + } + + // Print Out Query String + @if not breakpoint-get('no queries') { + @media #{$query-string} { + @content; + } + } + + @if breakpoint-get('no query fallbacks') != false or breakpoint-get('no queries') == true { + + $type: type-of(breakpoint-get('no query fallbacks')); + $print: false; + + @if ($type == 'bool') { + $print: true; + } + @else if ($type == 'string') { + @if $query-fallback == breakpoint-get('no query fallbacks') { + $print: true; + } + } + @else if ($type == 'list') { + @each $wrapper in breakpoint-get('no query fallbacks') { + @if $query-fallback == $wrapper { + $print: true; + } + } + } + + // Write Fallback + @if ($query-fallback != false) and ($print == true) { + $type-fallback: type-of($query-fallback); + + @if ($type-fallback != 'bool') { + #{$query-fallback} & { + @content; + } + } + @else { + @content; + } + } + } + + @include private-breakpoint-reset-contexts(); +} + + +@mixin mq($query, $no-query: false) { + @include breakpoint($query, $no-query) { + @content; + } +} diff --git a/packages/fakeyou.com/src/scss/breakpoint/_context.scss b/packages/fakeyou.com/src/scss/breakpoint/_context.scss new file mode 100755 index 0000000000..57947f5c8b --- /dev/null +++ b/packages/fakeyou.com/src/scss/breakpoint/_context.scss @@ -0,0 +1,95 @@ +////////////////////////////// +// Private Breakpoint Variables +////////////////////////////// +$private-breakpoint-context-holder: (); +$private-breakpoint-query-count: 0 !default; + +////////////////////////////// +// Breakpoint Has Context +// Returns whether or not you are inside a Breakpoint query +////////////////////////////// +@function breakpoint-has-context() { + @if length($private-breakpoint-query-count) { + @return true; + } + @else { + @return false; + } +} + +////////////////////////////// +// Breakpoint Get Context +// $feature: Input feature to get it's current MQ context. Returns false if no context +////////////////////////////// +@function breakpoint-get-context($feature) { + @if map-has-key($private-breakpoint-context-holder, $feature) { + $get: map-get($private-breakpoint-context-holder, $feature); + // Special handling of no-query from get side so /false/ prepends aren't returned + @if $feature == 'no-query' { + @if type-of($get) == 'list' and length($get) > 1 and nth($get, 1) == false { + $get: nth($get, length($get)); + } + } + @return $get; + } + @else { + @if breakpoint-has-context() and $feature == 'media' { + @return breakpoint-get('default media'); + } + @else { + @return false; + } + } +} + +////////////////////////////// +// Private function to set context +////////////////////////////// +@function private-breakpoint-set-context($feature, $value) { + @if $value == 'monochrome' { + $feature: 'monochrome'; + } + + $current: map-get($private-breakpoint-context-holder, $feature); + @if $current and length($current) == $private-breakpoint-query-count { + @warn "You have already queried against `#{$feature}`. Unexpected things may happen if you query against the same feature more than once in the same `and` query. Breakpoint is overwriting the current context with `#{$value}`"; + } + + @if not map-has-key($private-breakpoint-context-holder, $feature) { + $v-holder: (); + @for $i from 1 to $private-breakpoint-query-count { + @if $feature == 'media' { + $v-holder: append($v-holder, breakpoint-get('default media')); + } + @else { + $v-holder: append($v-holder, false); + } + } + $v-holder: append($v-holder, $value); + $private-breakpoint-context-holder: map-merge($private-breakpoint-context-holder, ($feature: $v-holder)) !global; + } + @else { + $v-holder: map-get($private-breakpoint-context-holder, $feature); + $length: length($v-holder); + @for $i from $length to $private-breakpoint-query-count - 1 { + @if $feature == 'media' { + $v-holder: append($v-holder, breakpoint-get('default media')); + } + @else { + $v-holder: append($v-holder, false); + } + } + $v-holder: append($v-holder, $value); + $private-breakpoint-context-holder: map-merge($private-breakpoint-context-holder, ($feature: $v-holder)) !global; + } + + @return true; +} + +////////////////////////////// +// Private function to reset context +////////////////////////////// +@mixin private-breakpoint-reset-contexts { + $private-breakpoint-context-holder: () !global; + $private-breakpoint-query-count: 0 !global; +} \ No newline at end of file diff --git a/packages/fakeyou.com/src/scss/breakpoint/_helpers.scss b/packages/fakeyou.com/src/scss/breakpoint/_helpers.scss new file mode 100755 index 0000000000..97e522d11a --- /dev/null +++ b/packages/fakeyou.com/src/scss/breakpoint/_helpers.scss @@ -0,0 +1,151 @@ +////////////////////////////// +// Converts the input value to Base EMs +////////////////////////////// +@function breakpoint-to-base-em($value) { + $value-unit: unit($value); + + // Will convert relative EMs into root EMs. + @if breakpoint-get('base font size') and type-of(breakpoint-get('base font size')) == 'number' and $value-unit == 'em' { + $base-unit: unit(breakpoint-get('base font size')); + + @if $base-unit == 'px' or $base-unit == '%' or $base-unit == 'em' or $base-unit == 'pt' { + @return base-conversion($value) / base-conversion(breakpoint-get('base font size')) * 1em; + } + @else { + @warn '#{breakpoint-get(\'base font size\')} is not set in valid units for font size!'; + @return false; + } + } + @else { + @return base-conversion($value); + } +} + +@function base-conversion($value) { + $unit: unit($value); + + @if $unit == 'px' { + @return $value / 16px * 1em; + } + @else if $unit == '%' { + @return $value / 100% * 1em; + } + @else if $unit == 'em' { + @return $value; + } + @else if $unit == 'pt' { + @return $value / 12pt * 1em; + } + @else { + @return $value; +// @warn 'Everything is terrible! What have you done?!'; + } +} + +////////////////////////////// +// Returns whether the feature can have a min/max pair +////////////////////////////// +$breakpoint-min-max-features: 'color', + 'color-index', + 'aspect-ratio', + 'device-aspect-ratio', + 'device-height', + 'device-width', + 'height', + 'monochrome', + 'resolution', + 'width'; + +@function breakpoint-min-max($feature) { + @each $item in $breakpoint-min-max-features { + @if $feature == $item { + @return true; + } + } + @return false; +} + +////////////////////////////// +// Returns whether the feature can have a string value +////////////////////////////// +$breakpoint-string-features: 'orientation', + 'scan', + 'color', + 'aspect-ratio', + 'device-aspect-ratio', + 'pointer', + 'luminosity'; + +@function breakpoint-string-value($feature) { + @each $item in $breakpoint-string-features { + @if breakpoint-min-max($item) { + @if $feature == 'min-#{$item}' or $feature == 'max-#{$item}' { + @return true; + } + } + @else if $feature == $item { + @return true; + } + } + @return false; +} + +////////////////////////////// +// Returns whether the feature is a media type +////////////////////////////// +$breakpoint-media-types: 'all', + 'braille', + 'embossed', + 'handheld', + 'print', + 'projection', + 'screen', + 'speech', + 'tty', + 'tv'; + +@function breakpoint-is-media($feature) { + @each $media in $breakpoint-media-types { + @if ($feature == $media) or ($feature == 'not #{$media}') or ($feature == 'only #{$media}') { + @return true; + } + } + + @return false; +} + +////////////////////////////// +// Returns whether the feature can stand alone +////////////////////////////// +$breakpoint-single-string-features: 'color', + 'color-index', + 'grid', + 'monochrome'; + +@function breakpoint-single-string($feature) { + @each $item in $breakpoint-single-string-features { + @if $feature == $item { + @return true; + } + } + @return false; +} + +////////////////////////////// +// Returns whether the feature +////////////////////////////// +@function breakpoint-is-resolution($feature) { + $resolutions: 'device-pixel-ratio', 'dpr'; + + @if breakpoint-get('transform resolutions') { + $resolutions: append($resolutions, 'resolution'); + } + + @each $reso in $resolutions { + @if index($feature, $reso) or index($feature, 'min-#{$reso}') or index($feature, 'max-#{$reso}') { + @return true; + } + } + + @return false; +} diff --git a/packages/fakeyou.com/src/scss/breakpoint/_legacy-settings.scss b/packages/fakeyou.com/src/scss/breakpoint/_legacy-settings.scss new file mode 100755 index 0000000000..e060ebe3dc --- /dev/null +++ b/packages/fakeyou.com/src/scss/breakpoint/_legacy-settings.scss @@ -0,0 +1,50 @@ +@mixin legacy-settings-warning { + $legacyVars: ( + 'default-media': 'default media', + 'default-feature': 'default feature', + 'force-media-all': 'force all media type', + 'to-ems': 'to ems', + 'resolutions': 'transform resolutions', + 'no-queries': 'no queries', + 'no-query-fallbacks': 'no query fallbacks', + 'base-font-size': 'base font size', + 'legacy-syntax': 'legacy syntax' + ); + + @each $legacy, $new in $legacyVars { + @if global-variable-exists('breakpoint-' + $legacy) { + @warn "In order to avoid variable namspace collisions, we have updated the way to change settings for Breakpoint. Please change all instances of `$breakpoint-#{$legacy}: {{setting}}` to `@include breakpoint-set('#{$new}', {{setting}})`. Variable settings, as well as this warning will be deprecated in a future release." + } + }; + + ////////////////////////////// + // Hand correct each setting + ////////////////////////////// + @if global-variable-exists('breakpoint-default-media') and $breakpoint-default-media != breakpoint-get('default media') { + @include breakpoint-set('default media', $breakpoint-default-media); + } + @if global-variable-exists('breakpoint-default-feature') and $breakpoint-default-feature != breakpoint-get('default feature') { + @include breakpoint-set('default feature', $breakpoint-default-feature); + } + @if global-variable-exists('breakpoint-force-media-all') and $breakpoint-force-media-all != breakpoint-get('force all media type') { + @include breakpoint-set('force all media type', $breakpoint-force-media-all); + } + @if global-variable-exists('breakpoint-to-ems') and $breakpoint-to-ems != breakpoint-get('to ems') { + @include breakpoint-set('to ems', $breakpoint-to-ems); + } + @if global-variable-exists('breakpoint-resolutions') and $breakpoint-resolutions != breakpoint-get('transform resolutions') { + @include breakpoint-set('transform resolutions', $breakpoint-resolutions); + } + @if global-variable-exists('breakpoint-no-queries') and $breakpoint-no-queries != breakpoint-get('no queries') { + @include breakpoint-set('no queries', $breakpoint-no-queries); + } + @if global-variable-exists('breakpoint-no-query-fallbacks') and $breakpoint-no-query-fallbacks != breakpoint-get('no query fallbacks') { + @include breakpoint-set('no query fallbacks', $breakpoint-no-query-fallbacks); + } + @if global-variable-exists('breakpoint-base-font-size') and $breakpoint-base-font-size != breakpoint-get('base font size') { + @include breakpoint-set('base font size', $breakpoint-base-font-size); + } + @if global-variable-exists('breakpoint-legacy-syntax') and $breakpoint-legacy-syntax != breakpoint-get('legacy syntax') { + @include breakpoint-set('legacy syntax', $breakpoint-legacy-syntax); + } +} \ No newline at end of file diff --git a/packages/fakeyou.com/src/scss/breakpoint/_no-query.scss b/packages/fakeyou.com/src/scss/breakpoint/_no-query.scss new file mode 100755 index 0000000000..0b5a81f697 --- /dev/null +++ b/packages/fakeyou.com/src/scss/breakpoint/_no-query.scss @@ -0,0 +1,15 @@ +@function breakpoint-no-query($query) { + @if type-of($query) == 'list' { + $keyword: nth($query, 1); + + @if type-of($keyword) == 'string' and ($keyword == 'no-query' or $keyword == 'no query' or $keyword == 'fallback') { + @return nth($query, 2); + } + @else { + @return false; + } + } + @else { + @return false; + } +} diff --git a/packages/fakeyou.com/src/scss/breakpoint/_parsers.scss b/packages/fakeyou.com/src/scss/breakpoint/_parsers.scss new file mode 100755 index 0000000000..f0b053feeb --- /dev/null +++ b/packages/fakeyou.com/src/scss/breakpoint/_parsers.scss @@ -0,0 +1,215 @@ +////////////////////////////// +// Import Parser Pieces +////////////////////////////// +@import "parsers/query"; +@import "parsers/single"; +@import "parsers/double"; +@import "parsers/triple"; +@import "parsers/resolution"; + +$Memo-Exists: function-exists(memo-get) and function-exists(memo-set); + +////////////////////////////// +// Breakpoint Function +////////////////////////////// +@function breakpoint($query, $contexts...) { + $run: true; + $return: (); + + // Grab the Memo Output if Memoization can be a thing + @if $Memo-Exists { + $return: memo-get(breakpoint, breakpoint $query $contexts); + + @if $return != null { + $run: false; + } + } + + @if not $Memo-Exists or $run { + // Internal Variables + $query-string: ''; + $query-fallback: false; + $return: (); + + // Reserve Global Private Breakpoint Context + $holder-context: $private-breakpoint-context-holder; + $holder-query-count: $private-breakpoint-query-count; + + // Reset Global Private Breakpoint Context + $private-breakpoint-context-holder: () !global; + $private-breakpoint-query-count: 0 !global; + + + // Test to see if it's a comma-separated list + $or-list: if(list-separator($query) == 'comma', true, false); + + + @if ($or-list == false and breakpoint-get('legacy syntax') == false) { + $query-string: breakpoint-parse($query); + } + @else { + $length: length($query); + + $last: nth($query, $length); + $query-fallback: breakpoint-no-query($last); + + @if ($query-fallback != false) { + $length: $length - 1; + } + + @if (breakpoint-get('legacy syntax') == true) { + $mq: (); + + @for $i from 1 through $length { + $mq: append($mq, nth($query, $i), comma); + } + + $query-string: breakpoint-parse($mq); + } + @else { + $query-string: ''; + @for $i from 1 through $length { + $query-string: $query-string + if($i == 1, '', ', ') + breakpoint-parse(nth($query, $i)); + } + } + } + + $return: ('query': $query-string, + 'fallback': $query-fallback, + 'context holder': $private-breakpoint-context-holder, + 'query count': $private-breakpoint-query-count + ); + @if length($contexts) > 0 and nth($contexts, 1) != false { + @if $query-fallback != false { + $context-setter: private-breakpoint-set-context('no-query', $query-fallback); + } + $context-map: (); + @each $context in $contexts { + $context-map: map-merge($context-map, ($context: breakpoint-get-context($context))); + } + $return: map-merge($return, (context: $context-map)); + } + + // Reset Global Private Breakpoint Context + $private-breakpoint-context-holder: () !global; + $private-breakpoint-query-count: 0 !global; + + @if $Memo-Exists { + $holder: memo-set(breakpoint, breakpoint $query $contexts, $return); + } + } + + @return $return; +} + +////////////////////////////// +// General Breakpoint Parser +////////////////////////////// +@function breakpoint-parse($query) { + // Increase number of 'and' queries + $private-breakpoint-query-count: $private-breakpoint-query-count + 1 !global; + + // Set up Media Type + $query-print: ''; + + $force-all: ((breakpoint-get('force all media type') == true) and (breakpoint-get('default media') == 'all')); + $empty-media: true; + @if ($force-all == true) or (breakpoint-get('default media') != 'all') { + // Force the print of the default media type if (force all is true and default media type is all) or (default media type is not all) + $query-print: breakpoint-get('default media'); + $empty-media: false; + } + + + $query-resolution: false; + + $query-holder: breakpoint-parse-query($query); + + + + // Loop over each parsed out query and write it to $query-print + $first: true; + + @each $feature in $query-holder { + $length: length($feature); + + // Parse a single feature + @if ($length == 1) { + // Feature is currently a list, grab the actual value + $feature: nth($feature, 1); + + // Media Type must by convention be the first item, so it's safe to flat override $query-print, which right now should only be the default media type + @if (breakpoint-is-media($feature)) { + @if ($force-all == true) or ($feature != 'all') { + // Force the print of the default media type if (force all is true and default media type is all) or (default media type is not all) + $query-print: $feature; + $empty-media: false; + + // Set Context + $context-setter: private-breakpoint-set-context(media, $query-print); + } + } + @else { + $parsed: breakpoint-parse-single($feature, $empty-media, $first); + $query-print: '#{$query-print} #{$parsed}'; + $first: false; + } + } + // Parse a double feature + @else if ($length == 2) { + @if (breakpoint-is-resolution($feature) != false) { + $query-resolution: $feature; + } + @else { + $parsed: null; + // If it's a string/number pair, + // we check to see if one is a single-string value, + // then we parse it as a normal double + $alpha: nth($feature, 1); + $beta: nth($feature, 2); + @if breakpoint-single-string($alpha) or breakpoint-single-string($beta) { + $parsed: breakpoint-parse-single($alpha, $empty-media, $first); + $query-print: '#{$query-print} #{$parsed}'; + $first: false; + $parsed: breakpoint-parse-single($beta, $empty-media, $first); + $query-print: '#{$query-print} #{$parsed}'; + } + @else { + $parsed: breakpoint-parse-double($feature, $empty-media, $first); + $query-print: '#{$query-print} #{$parsed}'; + $first: false; + } + } + } + // Parse a triple feature + @else if ($length == 3) { + $parsed: breakpoint-parse-triple($feature, $empty-media, $first); + $query-print: '#{$query-print} #{$parsed}'; + $first: false; + } + + } + + @if ($query-resolution != false) { + $query-print: breakpoint-build-resolution($query-print, $query-resolution, $empty-media, $first); + } + + // Loop through each feature that's been detected so far and append 'false' to the the value list to increment their counters + @each $f, $v in $private-breakpoint-context-holder { + $v-holder: $v; + $length: length($v-holder); + @if length($v-holder) < $private-breakpoint-query-count { + @for $i from $length to $private-breakpoint-query-count { + @if $f == 'media' { + $v-holder: append($v-holder, breakpoint-get('default media')); + } + @else { + $v-holder: append($v-holder, false); + } + } + } + $private-breakpoint-context-holder: map-merge($private-breakpoint-context-holder, ($f: $v-holder)) !global; + } + + @return $query-print; +} diff --git a/packages/fakeyou.com/src/scss/breakpoint/_respond-to.scss b/packages/fakeyou.com/src/scss/breakpoint/_respond-to.scss new file mode 100755 index 0000000000..e2462c5fce --- /dev/null +++ b/packages/fakeyou.com/src/scss/breakpoint/_respond-to.scss @@ -0,0 +1,82 @@ +//////////////////////// +// Default the Breakpoints variable +//////////////////////// +$breakpoints: () !default; +$BREAKPOINTS: () !default; + +//////////////////////// +// Respond-to API Mixin +//////////////////////// +@mixin respond-to($context, $no-query: false) { + @if length($breakpoints) > 0 and length($BREAKPOINTS) == 0 { + @warn "In order to avoid variable namespace collisions, we have updated the way to add breakpoints for respond-to. Please change all instances of `$breakpoints: add-breakpoint()` to `@include add-breakpoint()`. The `add-breakpoint()` function will be deprecated in a future release."; + $BREAKPOINTS: $breakpoints !global; + $breakpoints: () !global; + } + + @if type-of($BREAKPOINTS) != 'map' { + // Just in case someone writes gibberish to the $breakpoints variable. + @warn "Your breakpoints aren't a map! `respond-to` expects a map. Please check the value of $BREAKPOINTS variable."; + @content; + } + @else if map-has-key($BREAKPOINTS, $context) { + @include breakpoint(map-get($BREAKPOINTS, $context), $no-query) { + @content; + } + } + @else if not map-has-key($BREAKPOINTS, $context) { + @warn "`#{$context}` isn't a defined breakpoint! Please add it using `$breakpoints: add-breakpoint(`#{$context}`, $value);`"; + @content; + } + @else { + @warn "You haven't created any breakpoints yet! Make some already! `@include add-breakpoint($name, $bkpt)`"; + @content; + } +} + +////////////////////////////// +// Add Breakpoint to Breakpoints +// TODO: Remove function in next release +////////////////////////////// +@function add-breakpoint($name, $bkpt, $overwrite: false) { + $output: ($name: $bkpt); + + @if length($breakpoints) == 0 { + @return $output; + } + @else { + @if map-has-key($breakpoints, $name) and $overwrite != true { + @warn "You already have a breakpoint named `#{$name}`, please choose another breakpoint name, or pass in `$overwrite: true` to overwrite the previous breakpoint."; + @return $breakpoints; + } + @else if not map-has-key($breakpoints, $name) or $overwrite == true { + @return map-merge($breakpoints, $output); + } + } +} + +@mixin add-breakpoint($name, $bkpt, $overwrite: false) { + $output: ($name: $bkpt); + + @if length($BREAKPOINTS) == 0 { + $BREAKPOINTS: $output !global; + } + @else { + @if map-has-key($BREAKPOINTS, $name) and $overwrite != true { + @warn "You already have a breakpoint named `#{$name}`, please choose another breakpoint name, or pass in `$overwrite: true` to overwrite the previous breakpoint."; + $BREAKPOINTS: $BREAKPOINTS !global; + } + @else if not map-has-key($BREAKPOINTS, $name) or $overwrite == true { + $BREAKPOINTS: map-merge($BREAKPOINTS, $output) !global; + } + } +} + +@function get-breakpoint($name: false) { + @if $name == false { + @return $BREAKPOINTS; + } + @else { + @return map-get($BREAKPOINTS, $name); + } +} diff --git a/packages/fakeyou.com/src/scss/breakpoint/_settings.scss b/packages/fakeyou.com/src/scss/breakpoint/_settings.scss new file mode 100755 index 0000000000..05ee689404 --- /dev/null +++ b/packages/fakeyou.com/src/scss/breakpoint/_settings.scss @@ -0,0 +1,71 @@ +////////////////////////////// +// Has Setting +////////////////////////////// +@function breakpoint-has($setting) { + @if map-has-key($breakpoint, $setting) { + @return true; + } + @else { + @return false; + } +} + +////////////////////////////// +// Get Settings +////////////////////////////// +@function breakpoint-get($setting) { + @if breakpoint-has($setting) { + @return map-get($breakpoint, $setting); + } + @else { + @return map-get($Breakpoint-Settings, $setting); + } +} + +////////////////////////////// +// Set Settings +////////////////////////////// +@function breakpoint-set($setting, $value) { + @if (str-index($setting, '-') or str-index($setting, '_')) and str-index($setting, ' ') == null { + @warn "Words in Breakpoint settings should be separated by spaces, not dashes or underscores. Please replace dashes and underscores between words with spaces. Settings will not work as expected until changed."; + } + $breakpoint: map-merge($breakpoint, ($setting: $value)) !global; + @return true; +} + +@mixin breakpoint-change($setting, $value) { + $breakpoint-change: breakpoint-set($setting, $value); +} + +@mixin breakpoint-set($setting, $value) { + @include breakpoint-change($setting, $value); +} + +@mixin bkpt-change($setting, $value) { + @include breakpoint-change($setting, $value); +} +@mixin bkpt-set($setting, $value) { + @include breakpoint-change($setting, $value); +} + +////////////////////////////// +// Remove Setting +////////////////////////////// +@function breakpoint-reset($settings...) { + @if length($settings) == 1 { + $settings: nth($settings, 1); + } + + @each $setting in $settings { + $breakpoint: map-remove($breakpoint, $setting) !global; + } + @return true; +} + +@mixin breakpoint-reset($settings...) { + $breakpoint-reset: breakpoint-reset($settings); +} + +@mixin bkpt-reset($settings...) { + $breakpoint-reset: breakpoint-reset($settings); +} \ No newline at end of file diff --git a/packages/fakeyou.com/src/scss/breakpoint/parsers/_double.scss b/packages/fakeyou.com/src/scss/breakpoint/parsers/_double.scss new file mode 100755 index 0000000000..24580c1516 --- /dev/null +++ b/packages/fakeyou.com/src/scss/breakpoint/parsers/_double.scss @@ -0,0 +1,33 @@ +////////////////////////////// +// Import Pieces +////////////////////////////// +@import "double/default-pair"; +@import "double/double-string"; +@import "double/default"; + +@function breakpoint-parse-double($feature, $empty-media, $first) { + $parsed: ''; + $leader: ''; + // If we're forcing + @if not ($empty-media) or not ($first) { + $leader: 'and '; + } + + $first: nth($feature, 1); + $second: nth($feature, 2); + + // If we've got two numbers, we know we need to use the default pair because there are no media queries that has a media feature that is a number + @if type-of($first) == 'number' and type-of($second) == 'number' { + $parsed: breakpoint-parse-default-pair($first, $second); + } + // If they are both strings, we send it through the string parser + @else if type-of($first) == 'string' and type-of($second) == 'string' { + $parsed: breakpoint-parse-double-string($first, $second); + } + // If it's a string/number pair, we parse it as a normal double + @else { + $parsed: breakpoint-parse-double-default($first, $second); + } + + @return $leader + $parsed; +} diff --git a/packages/fakeyou.com/src/scss/breakpoint/parsers/_query.scss b/packages/fakeyou.com/src/scss/breakpoint/parsers/_query.scss new file mode 100755 index 0000000000..b138b3933b --- /dev/null +++ b/packages/fakeyou.com/src/scss/breakpoint/parsers/_query.scss @@ -0,0 +1,82 @@ +@function breakpoint-parse-query($query) { + // Parse features out of an individual query + $feature-holder: (); + $query-holder: (); + $length: length($query); + + @if $length == 2 { + // If we've got a string/number, number/string, check to see if it's a valid string/number pair or two singles + @if (type-of(nth($query, 1)) == 'string' and type-of(nth($query, 2)) == 'number') or (type-of(nth($query, 1)) == 'number' and type-of(nth($query, 2)) == 'string') { + + $number: ''; + $value: ''; + + @if type-of(nth($query, 1)) == 'string' { + $number: nth($query, 2); + $value: nth($query, 1); + } + @else { + $number: nth($query, 1); + $value: nth($query, 2); + } + + // If the string value can be a single value, check to see if the number passed in is a valid input for said single value. Fortunately, all current single-value options only accept unitless numbers, so this check is easy. + @if breakpoint-single-string($value) { + @if unitless($number) { + $feature-holder: append($value, $number, space); + $query-holder: append($query-holder, $feature-holder, comma); + @return $query-holder; + } + } + // If the string is a media type, split the query + @if breakpoint-is-media($value) { + $query-holder: append($query-holder, nth($query, 1)); + $query-holder: append($query-holder, nth($query, 2)); + @return $query-holder; + } + // If it's not a single feature, we're just going to assume it's a proper string/value pair, and roll with it. + @else { + $feature-holder: append($value, $number, space); + $query-holder: append($query-holder, $feature-holder, comma); + @return $query-holder; + } + + } + // If they're both numbers, we assume it's a double and roll with that + @else if (type-of(nth($query, 1)) == 'number' and type-of(nth($query, 2)) == 'number') { + $feature-holder: append(nth($query, 1), nth($query, 2), space); + $query-holder: append($query-holder, $feature-holder, comma); + @return $query-holder; + } + // If they're both strings and neither are singles, we roll with that. + @else if (type-of(nth($query, 1)) == 'string' and type-of(nth($query, 2)) == 'string') { + @if not breakpoint-single-string(nth($query, 1)) and not breakpoint-single-string(nth($query, 2)) { + $feature-holder: append(nth($query, 1), nth($query, 2), space); + $query-holder: append($query-holder, $feature-holder, comma); + @return $query-holder; + } + } + } + @else if $length == 3 { + // If we've got three items and none is a list, we check to see + @if type-of(nth($query, 1)) != 'list' and type-of(nth($query, 2)) != 'list' and type-of(nth($query, 3)) != 'list' { + // If none of the items are single string values and none of the values are media values, we're good. + @if (not breakpoint-single-string(nth($query, 1)) and not breakpoint-single-string(nth($query, 2)) and not breakpoint-single-string(nth($query, 3))) and ((not breakpoint-is-media(nth($query, 1)) and not breakpoint-is-media(nth($query, 2)) and not breakpoint-is-media(nth($query, 3)))) { + $feature-holder: append(nth($query, 1), nth($query, 2), space); + $feature-holder: append($feature-holder, nth($query, 3), space); + $query-holder: append($query-holder, $feature-holder, comma); + @return $query-holder; + } + // let's check to see if the first item is a media type + @else if breakpoint-is-media(nth($query, 1)) { + $query-holder: append($query-holder, nth($query, 1)); + $feature-holder: append(nth($query, 2), nth($query, 3), space); + $query-holder: append($query-holder, $feature-holder); + @return $query-holder; + } + } + } + + // If it's a single item, or if it's not a special case double or triple, we can simply return the query. + @return $query; +} diff --git a/packages/fakeyou.com/src/scss/breakpoint/parsers/_resolution.scss b/packages/fakeyou.com/src/scss/breakpoint/parsers/_resolution.scss new file mode 100755 index 0000000000..19769adf44 --- /dev/null +++ b/packages/fakeyou.com/src/scss/breakpoint/parsers/_resolution.scss @@ -0,0 +1,31 @@ +@import "resolution/resolution"; + +@function breakpoint-build-resolution($query-print, $query-resolution, $empty-media, $first) { + $leader: ''; + // If we're forcing + @if not ($empty-media) or not ($first) { + $leader: 'and '; + } + + @if breakpoint-get('transform resolutions') and $query-resolution { + $resolutions: breakpoint-make-resolutions($query-resolution); + $length: length($resolutions); + $query-holder: ''; + + @for $i from 1 through $length { + $query: '#{$query-print} #{$leader}#{nth($resolutions, $i)}'; + @if $i == 1 { + $query-holder: $query; + } + @else { + $query-holder: '#{$query-holder}, #{$query}'; + } + } + + @return $query-holder; + } + @else { + // Return with attached resolution + @return $query-print; + } +} diff --git a/packages/fakeyou.com/src/scss/breakpoint/parsers/_single.scss b/packages/fakeyou.com/src/scss/breakpoint/parsers/_single.scss new file mode 100755 index 0000000000..d9fd764a72 --- /dev/null +++ b/packages/fakeyou.com/src/scss/breakpoint/parsers/_single.scss @@ -0,0 +1,26 @@ +////////////////////////////// +// Import Pieces +////////////////////////////// +@import "single/default"; + +@function breakpoint-parse-single($feature, $empty-media, $first) { + $parsed: ''; + $leader: ''; + // If we're forcing + @if not ($empty-media) or not ($first) { + $leader: 'and '; + } + + // If it's a single feature that can stand alone, we let it + @if (breakpoint-single-string($feature)) { + $parsed: $feature; + // Set Context + $context-setter: private-breakpoint-set-context($feature, $feature); + } + // If it's not a stand alone feature, we pass it off to the default handler. + @else { + $parsed: breakpoint-parse-default($feature); + } + + @return $leader + '(' + $parsed + ')'; +} diff --git a/packages/fakeyou.com/src/scss/breakpoint/parsers/_triple.scss b/packages/fakeyou.com/src/scss/breakpoint/parsers/_triple.scss new file mode 100755 index 0000000000..e2732067f9 --- /dev/null +++ b/packages/fakeyou.com/src/scss/breakpoint/parsers/_triple.scss @@ -0,0 +1,36 @@ +////////////////////////////// +// Import Pieces +////////////////////////////// +@import "triple/default"; + +@function breakpoint-parse-triple($feature, $empty-media, $first) { + $parsed: ''; + $leader: ''; + + // If we're forcing + @if not ($empty-media) or not ($first) { + $leader: 'and '; + } + + // separate the string features from the value numbers + $string: null; + $numbers: null; + @each $val in $feature { + @if type-of($val) == string { + $string: $val; + } + @else { + @if type-of($numbers) == 'null' { + $numbers: $val; + } + @else { + $numbers: append($numbers, $val); + } + } + } + + $parsed: breakpoint-parse-triple-default($string, nth($numbers, 1), nth($numbers, 2)); + + @return $leader + $parsed; + +} diff --git a/packages/fakeyou.com/src/scss/breakpoint/parsers/double/_default-pair.scss b/packages/fakeyou.com/src/scss/breakpoint/parsers/double/_default-pair.scss new file mode 100755 index 0000000000..f88432ccdb --- /dev/null +++ b/packages/fakeyou.com/src/scss/breakpoint/parsers/double/_default-pair.scss @@ -0,0 +1,21 @@ +@function breakpoint-parse-default-pair($first, $second) { + $default: breakpoint-get('default pair'); + $min: ''; + $max: ''; + + // Sort into min and max + $min: min($first, $second); + $max: max($first, $second); + + // Set Context + $context-setter: private-breakpoint-set-context(min-#{$default}, $min); + $context-setter: private-breakpoint-set-context(max-#{$default}, $max); + + // Make them EMs if need be + @if (breakpoint-get('to ems') == true) { + $min: breakpoint-to-base-em($min); + $max: breakpoint-to-base-em($max); + } + + @return '(min-#{$default}: #{$min}) and (max-#{$default}: #{$max})'; +} diff --git a/packages/fakeyou.com/src/scss/breakpoint/parsers/double/_default.scss b/packages/fakeyou.com/src/scss/breakpoint/parsers/double/_default.scss new file mode 100755 index 0000000000..73190ed590 --- /dev/null +++ b/packages/fakeyou.com/src/scss/breakpoint/parsers/double/_default.scss @@ -0,0 +1,22 @@ +@function breakpoint-parse-double-default($first, $second) { + $feature: ''; + $value: ''; + + @if type-of($first) == 'string' { + $feature: $first; + $value: $second; + } + @else { + $feature: $second; + $value: $first; + } + + // Set Context + $context-setter: private-breakpoint-set-context($feature, $value); + + @if (breakpoint-get('to ems') == true) { + $value: breakpoint-to-base-em($value); + } + + @return '(#{$feature}: #{$value})' +} diff --git a/packages/fakeyou.com/src/scss/breakpoint/parsers/double/_double-string.scss b/packages/fakeyou.com/src/scss/breakpoint/parsers/double/_double-string.scss new file mode 100755 index 0000000000..c6fd0cb033 --- /dev/null +++ b/packages/fakeyou.com/src/scss/breakpoint/parsers/double/_double-string.scss @@ -0,0 +1,22 @@ +@function breakpoint-parse-double-string($first, $second) { + $feature: ''; + $value: ''; + + // Test to see which is the feature and which is the value + @if (breakpoint-string-value($first) == true) { + $feature: $first; + $value: $second; + } + @else if (breakpoint-string-value($second) == true) { + $feature: $second; + $value: $first; + } + @else { + @warn "Neither #{$first} nor #{$second} is a valid media query name."; + } + + // Set Context + $context-setter: private-breakpoint-set-context($feature, $value); + + @return '(#{$feature}: #{$value})'; +} \ No newline at end of file diff --git a/packages/fakeyou.com/src/scss/breakpoint/parsers/resolution/_resolution.scss b/packages/fakeyou.com/src/scss/breakpoint/parsers/resolution/_resolution.scss new file mode 100755 index 0000000000..3680421269 --- /dev/null +++ b/packages/fakeyou.com/src/scss/breakpoint/parsers/resolution/_resolution.scss @@ -0,0 +1,60 @@ +@function breakpoint-make-resolutions($resolution) { + $length: length($resolution); + + $output: (); + + @if $length == 2 { + $feature: ''; + $value: ''; + + // Find which is number + @if type-of(nth($resolution, 1)) == 'number' { + $value: nth($resolution, 1); + } + @else { + $value: nth($resolution, 2); + } + + // Determine min/max/standard + @if index($resolution, 'min-resolution') { + $feature: 'min-'; + } + @else if index($resolution, 'max-resolution') { + $feature: 'max-'; + } + + $standard: '(#{$feature}resolution: #{$value})'; + + // If we're not dealing with dppx, + @if unit($value) != 'dppx' { + $base: 96dpi; + @if unit($value) == 'dpcm' { + $base: 243.84dpcm; + } + // Write out feature tests + $webkit: ''; + $moz: ''; + $webkit: '(-webkit-#{$feature}device-pixel-ratio: #{$value / $base})'; + $moz: '(#{$feature}-moz-device-pixel-ratio: #{$value / $base})'; + // Append to output + $output: append($output, $standard, space); + $output: append($output, $webkit, space); + $output: append($output, $moz, space); + } + @else { + $webkit: ''; + $moz: ''; + $webkit: '(-webkit-#{$feature}device-pixel-ratio: #{$value / 1dppx})'; + $moz: '(#{$feature}-moz-device-pixel-ratio: #{$value / 1dppx})'; + $fallback: '(#{$feature}resolution: #{$value / 1dppx * 96dpi})'; + // Append to output + $output: append($output, $standard, space); + $output: append($output, $webkit, space); + $output: append($output, $moz, space); + $output: append($output, $fallback, space); + } + + } + + @return $output; +} diff --git a/packages/fakeyou.com/src/scss/breakpoint/parsers/single/_default.scss b/packages/fakeyou.com/src/scss/breakpoint/parsers/single/_default.scss new file mode 100755 index 0000000000..503ef427b0 --- /dev/null +++ b/packages/fakeyou.com/src/scss/breakpoint/parsers/single/_default.scss @@ -0,0 +1,13 @@ +@function breakpoint-parse-default($feature) { + $default: breakpoint-get('default feature'); + + // Set Context + $context-setter: private-breakpoint-set-context($default, $feature); + + @if (breakpoint-get('to ems') == true) and (type-of($feature) == 'number') { + @return '#{$default}: #{breakpoint-to-base-em($feature)}'; + } + @else { + @return '#{$default}: #{$feature}'; + } +} diff --git a/packages/fakeyou.com/src/scss/breakpoint/parsers/triple/_default.scss b/packages/fakeyou.com/src/scss/breakpoint/parsers/triple/_default.scss new file mode 100755 index 0000000000..7fa418dda7 --- /dev/null +++ b/packages/fakeyou.com/src/scss/breakpoint/parsers/triple/_default.scss @@ -0,0 +1,18 @@ +@function breakpoint-parse-triple-default($feature, $first, $second) { + + // Sort into min and max + $min: min($first, $second); + $max: max($first, $second); + + // Set Context + $context-setter: private-breakpoint-set-context(min-#{$feature}, $min); + $context-setter: private-breakpoint-set-context(max-#{$feature}, $max); + + // Make them EMs if need be + @if (breakpoint-get('to ems') == true) { + $min: breakpoint-to-base-em($min); + $max: breakpoint-to-base-em($max); + } + + @return '(min-#{$feature}: #{$min}) and (max-#{$feature}: #{$max})'; +} diff --git a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/DynamicButton.tsx b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/DynamicButton.tsx index 27d8f29f14..4946e83f5d 100644 --- a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/DynamicButton.tsx +++ b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/DynamicButton.tsx @@ -27,7 +27,7 @@ export default function DynamicButton({ children, className, disabled, index = 0 leave: { opacity: 0, position: "absolute" }, }); - return <a.button {...{ className: `fy-dynamic-button`, disabled, style, ...hoverProps, ...rest }}> + return <a.button {...{ className: `fy-dynamic-button${ className ? " " + className : "" }`, disabled, style, ...hoverProps, ...rest }}> { transitions(({ opacity, position }, content, s, i) => { return <a.div {...{ className: `button-slide ${i}`, style: { opacity, position: position as any } }}> { slides[content] } diff --git a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/FaceAnimatorTitle.js b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/FaceAnimatorTitle.tsx similarity index 93% rename from packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/FaceAnimatorTitle.js rename to packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/FaceAnimatorTitle.tsx index 2cbdd2decd..8671855ded 100644 --- a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/FaceAnimatorTitle.js +++ b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/FaceAnimatorTitle.tsx @@ -51,7 +51,7 @@ export default function FaceAnimatorTitle({ ...rest }) { { t("headings.audio") } </ProgressLi> </ul> - <DynamicButton {...{ disabled: incomplete || working, onClick, slides, index: page }}/> + <DynamicButton {...{ className: "face-animation-submit", disabled: incomplete || working, onClick, slides, index: page }}/> <p {...{ className: "progress-description" }}> { t("headings.subtitle") } </p> diff --git a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.scss b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.scss index 3d31871fa9..04430ccb15 100644 --- a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.scss +++ b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.scss @@ -1,39 +1,14 @@ +@import "scss/_breakpoint.scss"; +$under992: max-width 992px; + .lipsync-editor { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - grid-gap: 1rem; + padding: 1rem; - .grid-heading, .grid-square { - &:nth-child(odd) { - padding-left: 1rem; - } - &:nth-child(even) { - padding-right: 1rem; - } + .media-input-column { + display: inline-block; } - - .grid-heading { - display: flex; - align-items: center; - // background-color: blue; - // padding-left: 1rem; - h5 { - margin: 1rem 0 0; - // background: red; - line-height: 1em; - } - } - - .grid-square { - aspect-ratio: 1; - padding-bottom: 1rem; - - .fy-uploader { height: 100% } - } - - .fy-image-uploader { height: 100%; } - .lipsync-audio { - label { height: 100% } + @include breakpoint($under992) { + .media-input-column:first-of-type { margin-bottom: 1rem } } } @@ -41,7 +16,6 @@ display: flex; flex-wrap: wrap; align-items: center; - // margin: 1rem 0; padding: 1rem; .progress-heading { @@ -64,9 +38,6 @@ } svg { - // background-color: red; - // border: 2px solid #fff; - // border-radius: 50%; margin-right: .5rem; height: 2rem; width: 2rem; @@ -82,16 +53,23 @@ button { margin: 0 0 0 auto; background-color: #ccccff; - // flex-grow: 1; width: fit-content; + + @include breakpoint($under992) { + margin: 1rem 0 0; + width: 100%; + + .button-slide { + width: 100%; + } + } } } -.lipsync-panel { position: relative; height: fit-content; overflow: hidden; } - -// .lipsync-editor, .lipsync-working, .lipsync-success { -// position: absolute; -// } +.lipsync-panel { + position: relative; + overflow: hidden; +} .lipsync-working, .lipsync-working-notice { display: flex; @@ -100,14 +78,6 @@ width: 100%; } -// .lipsync-working-notice { -// background-color: red; -// } - -// .lipsync-working { -// background-color: green; -// } - .lipsync-working-notice { flex-direction: column; margin: 5rem; diff --git a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx index 1a550990d2..e9b351eb34 100644 --- a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx +++ b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx @@ -40,20 +40,35 @@ interface EditorProps { const softSpring = { config: { mass: 1, tension: 80, friction: 10 } } +// const InputPage = ({ audioProps, imageProps, toggle, style, t }: LipSyncProps ) => { + +// return <animated.div {...{ className: "lipsync-editor", style }}> +// <div {...{ className: "grid-heading" }}> +// <h5>{ t("headings.image") }</h5> +// </div> +// <div {...{ className: "grid-heading" }}> +// <h5>{ t("headings.audio") }</h5> +// </div> +// <div {...{ className: "grid-square lipsync-audio col-lg-6" }}> +// <ImageInput {...{ ...imageProps, onRest: () => toggle.image(imageProps.file ? true : false) }}/> +// </div> +// <div {...{ className: "grid-square col-lg-6" }}> +// <AudioInput {...{ ...audioProps, onRest: (p:any,c:any,item:any,l:any) => { +// toggle.audio(!!audioProps.file); +// }, hideActions: true } }/> +// </div> +// </animated.div>}; + const InputPage = ({ audioProps, imageProps, toggle, style, t }: LipSyncProps ) => { - return <animated.div {...{ className: "lipsync-editor", style }}> - <div {...{ className: "grid-heading" }}> + return <animated.div {...{ className: "lipsync-editor row", style }}> + <div {...{ className: "media-input-column col-lg-6" }}> <h5>{ t("headings.image") }</h5> - </div> - <div {...{ className: "grid-heading" }}> - <h5>{ t("headings.audio") }</h5> - </div> - <div {...{ className: "grid-square lipsync-audio" }}> <ImageInput {...{ ...imageProps, onRest: () => toggle.image(imageProps.file ? true : false) }}/> </div> - <div {...{ className: "grid-square" }}> - <AudioInput {...{ ...audioProps, onRest: (p:any,c:any,item:any,l:any) => { + <div {...{ className: "media-input-column col-lg-6" }}> + <h5>{ t("headings.audio") }</h5> + <AudioInput {...{ ...audioProps, onRest: (p:any,c:any,item:any,l:any) => { toggle.audio(!!audioProps.file); }, hideActions: true } }/> </div> @@ -131,7 +146,7 @@ export default function LipsyncEditor({ enqueueInferenceJob, sessionSubscription res.inference_job_token, FrontendInferenceJobType.FaceAnimation ); - indexSet(4); // set face animator API working page + indexSet(4); // set face animator API success page } }) .catch(e => { From 33a5e4252ffb4cd3fcbfe6b7e03a1779405136a1 Mon Sep 17 00:00:00 2001 From: BFlat <bombayapirat@gmail.com> Date: Thu, 28 Sep 2023 06:24:30 +0700 Subject: [PATCH 10/10] padding changes --- .../LipsyncEditor/FaceAnimatorTitle.tsx | 109 ++++--- .../lipsync/LipsyncEditor/LipsyncEditor.scss | 145 +++++----- .../lipsync/LipsyncEditor/LipsyncEditor.tsx | 273 +++++++++++------- 3 files changed, 319 insertions(+), 208 deletions(-) diff --git a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/FaceAnimatorTitle.tsx b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/FaceAnimatorTitle.tsx index 8671855ded..e84f271e37 100644 --- a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/FaceAnimatorTitle.tsx +++ b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/FaceAnimatorTitle.tsx @@ -1,59 +1,90 @@ -import React from 'react'; -import { animated, useSpring } from '@react-spring/web'; +import React from "react"; +import { animated, useSpring } from "@react-spring/web"; import { Spinner } from "components/common"; import { springs } from "resources"; -import DynamicButton from './DynamicButton'; +import DynamicButton from "./DynamicButton"; -const ProgressLi = ({ children, disabled = false }: { children?: any, disabled?: boolean }) => { +const ProgressLi = ({ + children, + disabled = false, +}: { + children?: any; + disabled?: boolean; +}) => { const style = useSpring({ ...springs.soft, - opacity: disabled ? .25 : 1 + opacity: disabled ? 0.25 : 1, }); - return <animated.li {...{ style }}> - <svg> - <circle {...{ cx: 16, cy: 16, r: 15, strokeWidth: "2", }}/> - { <polyline {...{ - fill: "none", - points: "9.5 18 14.5 22 22.5 12", - strokeLinecap: "round", - strokeLinejoin: "round", - strokeWidth: "4", - }}/> } - </svg> - { children } - </animated.li> + return ( + <animated.li {...{ style }}> + <svg> + <circle {...{ cx: 16, cy: 16, r: 15, strokeWidth: "2" }} /> + { + <polyline + {...{ + fill: "none", + points: "9.5 18 14.5 22 22.5 12", + strokeLinecap: "round", + strokeLinejoin: "round", + strokeWidth: "4", + }} + /> + } + </svg> + {children} + </animated.li> + ); }; export default function FaceAnimatorTitle({ ...rest }) { - const { audioProps, audioReady, imageProps, imageReady, indexSet, page, submit, t } = rest; + const { + audioProps, + audioReady, + imageProps, + imageReady, + indexSet, + page, + submit, + t, + } = rest; const noAudio = !audioReady || !audioProps.file; const noImg = !imageReady || !imageProps.file; const incomplete = noAudio || noImg; const working = imageProps.working && audioProps.working; - const slides = [t("inputs.generate"),<Spinner />,t("inputs.makeAnother")]; + const slides = [t("inputs.generate"), <Spinner />, t("inputs.makeAnother")]; const onClick = () => { if (page === 2) { - imageProps.clear(); audioProps.clear(); indexSet(0); + imageProps.clear(); + audioProps.clear(); + indexSet(0); } else if (!incomplete && !working) submit(); }; - return <div {...{ className: "progress-header" }}> - <h1 {...{ className: "fw-bold text-center text-md-start progress-heading" }}> - { t("headings.title") } - </h1> - <ul {...{ className: 'async-progress-tracker' }}> - <ProgressLi {...{ disabled: noImg }}> - { t("headings.image") } - </ProgressLi> - <ProgressLi {...{ disabled: noAudio }}> - { t("headings.audio") } - </ProgressLi> - </ul> - <DynamicButton {...{ className: "face-animation-submit", disabled: incomplete || working, onClick, slides, index: page }}/> - <p {...{ className: "progress-description" }}> - { t("headings.subtitle") } - </p> - </div> -}; \ No newline at end of file + return ( + <div {...{ className: "progress-header" }}> + <h1 + {...{ className: "fw-bold text-center text-md-start progress-heading" }} + > + {t("headings.title")} + </h1> + <ul {...{ className: "async-progress-tracker py-3 py-lg-0" }}> + <ProgressLi {...{ disabled: noImg }}>{t("headings.image")}</ProgressLi> + <ProgressLi {...{ disabled: noAudio }}> + {t("headings.audio")} + </ProgressLi> + </ul> + <DynamicButton + {...{ + className: "face-animation-submit", + disabled: incomplete || working, + onClick, + slides, + index: page, + }} + /> + <p {...{ className: "progress-description" }}>{t("headings.subtitle")}</p> + </div> + ); +} diff --git a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.scss b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.scss index 04430ccb15..bed71245ae 100644 --- a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.scss +++ b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.scss @@ -2,98 +2,103 @@ $under992: max-width 992px; .lipsync-editor { - padding: 1rem; + padding-top: 2rem; - .media-input-column { - display: inline-block; - } - @include breakpoint($under992) { - .media-input-column:first-of-type { margin-bottom: 1rem } - } + .media-input-column { + display: inline-block; + } + @include breakpoint($under992) { + .media-input-column:first-of-type { + margin-bottom: 1rem; + } + } } .progress-header { - display: flex; - flex-wrap: wrap; - align-items: center; - padding: 1rem; + display: flex; + flex-wrap: wrap; + align-items: center; + // padding: 1rem; - .progress-heading { - display: inline-block; - margin: auto 1rem auto 0; - } + .progress-heading { + display: inline-block; + margin: auto 1rem auto 0; + } - .async-progress-tracker { - display: inline-flex; - justify-content: space-around; - flex-grow: 1; - margin-right: 1rem; - padding-left: 0; + .async-progress-tracker { + display: inline-flex; + justify-content: space-around; + flex-grow: 1; + margin-right: 1rem; + padding-left: 0; - li { - display: flex; - align-items: center; - font-size: 1.25rem; - font-weight: 500; - } + li { + display: flex; + align-items: center; + font-size: 1.25rem; + font-weight: 500; + } - svg { - margin-right: .5rem; - height: 2rem; - width: 2rem; - stroke: white; - } - } + svg { + margin-right: 0.5rem; + height: 2rem; + width: 2rem; + stroke: white; + } + } - .progress-description { - margin-top: 1rem; - width: 100%; - } + .progress-description { + margin-top: 1rem; + width: 100%; + } - button { - margin: 0 0 0 auto; - background-color: #ccccff; - width: fit-content; + button { + margin: 0 0 0 auto; + background-color: #ccccff; + width: fit-content; - @include breakpoint($under992) { - margin: 1rem 0 0; - width: 100%; + @include breakpoint($under992) { + margin: 1rem 0 0; + width: 100%; - .button-slide { - width: 100%; - } - } - } + .button-slide { + width: 100%; + } + } + } } -.lipsync-panel { - position: relative; - overflow: hidden; +.lipsync-panel { + position: relative; + overflow: hidden; } -.lipsync-working, .lipsync-working-notice { - display: flex; - align-items: center; - justify-content: center; - width: 100%; +.lipsync-working, +.lipsync-working-notice { + display: flex; + align-items: center; + justify-content: center; + width: 100%; } .lipsync-working-notice { - flex-direction: column; - margin: 5rem; + flex-direction: column; + margin: 5rem; - .working-title { - white-space: nowrap; - } + .working-title { + white-space: nowrap; + } } .lipsync-success { - padding: .5rem 1rem 1rem; + padding: 0.5rem 1rem 1rem; - h3 { margin: 1rem auto 0 0; } + h3 { + margin: 1rem auto 0 0; + } - .job-id { - color: rgba(#fff, .66); - font-size: .75rem; - } -} \ No newline at end of file + .job-id { + color: rgba(#fff, 0.66); + font-size: 0.75rem; + } +} diff --git a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx index e9b351eb34..0bd90106bd 100644 --- a/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx +++ b/packages/fakeyou.com/src/v2/view/pages/lipsync/LipsyncEditor/LipsyncEditor.tsx @@ -1,5 +1,5 @@ import React, { useState } from "react"; -import { animated, useTransition } from '@react-spring/web'; +import { animated, useTransition } from "@react-spring/web"; import { v4 as uuidv4 } from "uuid"; import { useFile, useLocalize } from "hooks"; import { AudioInput, ImageInput, Spinner } from "components/common"; @@ -20,15 +20,28 @@ import { // EnqueueFaceAnimationRequest, } from "@storyteller/components/src/api/face_animation/EnqueueFaceAnimation"; // import { FrontendInferenceJobType } from "@storyteller/components/src/jobs/InferenceJob"; -import FaceAnimatorTitle from './FaceAnimatorTitle'; -import FaceAnimatorSuccess from './FaceAnimatorSuccess'; -import './LipsyncEditor.scss'; +import FaceAnimatorTitle from "./FaceAnimatorTitle"; +import FaceAnimatorSuccess from "./FaceAnimatorSuccess"; +import "./LipsyncEditor.scss"; import { SessionSubscriptionsWrapper } from "@storyteller/components/src/session/SessionSubscriptionsWrapper"; -import { FrontendInferenceJobType, InferenceJob } from "@storyteller/components/src/jobs/InferenceJob"; +import { + FrontendInferenceJobType, + InferenceJob, +} from "@storyteller/components/src/jobs/InferenceJob"; - -interface LipSyncProps { audioProps: any, children?: any, imageProps: any, index: number, toggle: any, style: any, enqueueInferenceJob: any, sessionSubscriptionsWrapper: any, t: any, inferenceJobsByCategory: any, }; -interface EditorProps { +interface LipSyncProps { + audioProps: any; + children?: any; + imageProps: any; + index: number; + toggle: any; + style: any; + enqueueInferenceJob: any; + sessionSubscriptionsWrapper: any; + t: any; + inferenceJobsByCategory: any; +} +interface EditorProps { sessionSubscriptionsWrapper: SessionSubscriptionsWrapper; enqueueInferenceJob: ( jobToken: string, @@ -36,9 +49,9 @@ interface EditorProps { ) => void; inferenceJobs: Array<InferenceJob>; inferenceJobsByCategory: Map<FrontendInferenceJobType, Array<InferenceJob>>; -}; +} -const softSpring = { config: { mass: 1, tension: 80, friction: 10 } } +const softSpring = { config: { mass: 1, tension: 80, friction: 10 } }; // const InputPage = ({ audioProps, imageProps, toggle, style, t }: LipSyncProps ) => { @@ -59,60 +72,107 @@ const softSpring = { config: { mass: 1, tension: 80, friction: 10 } } // </div> // </animated.div>}; -const InputPage = ({ audioProps, imageProps, toggle, style, t }: LipSyncProps ) => { +const InputPage = ({ + audioProps, + imageProps, + toggle, + style, + t, +}: LipSyncProps) => { + return ( + <animated.div {...{ className: "lipsync-editor row", style }}> + <div {...{ className: "media-input-column col-lg-6" }}> + <h5>{t("headings.image")}</h5> + <ImageInput + {...{ + ...imageProps, + onRest: () => toggle.image(imageProps.file ? true : false), + }} + /> + </div> + <div {...{ className: "media-input-column col-lg-6" }}> + <h5>{t("headings.audio")}</h5> + <AudioInput + {...{ + ...audioProps, + onRest: (p: any, c: any, item: any, l: any) => { + toggle.audio(!!audioProps.file); + }, + hideActions: true, + }} + /> + </div> + </animated.div> + ); +}; - return <animated.div {...{ className: "lipsync-editor row", style }}> - <div {...{ className: "media-input-column col-lg-6" }}> - <h5>{ t("headings.image") }</h5> - <ImageInput {...{ ...imageProps, onRest: () => toggle.image(imageProps.file ? true : false) }}/> - </div> - <div {...{ className: "media-input-column col-lg-6" }}> - <h5>{ t("headings.audio") }</h5> - <AudioInput {...{ ...audioProps, onRest: (p:any,c:any,item:any,l:any) => { - toggle.audio(!!audioProps.file); - }, hideActions: true } }/> - </div> -</animated.div>}; - - -const Working = ({ audioProps, imageProps, index, style, t }: LipSyncProps ) => { - const workStatus = ["",t("status.uploadingAudio"),t("status.uploadingImage"),t("status.requestingAnimation"),""]; +const Working = ({ audioProps, imageProps, index, style, t }: LipSyncProps) => { + const workStatus = [ + "", + t("status.uploadingAudio"), + t("status.uploadingImage"), + t("status.requestingAnimation"), + "", + ]; const transitions = useTransition(index, { ...springs.soft, from: { opacity: 0, position: "absolute" }, enter: { opacity: 1, position: "relative" }, leave: { opacity: 0, position: "absolute" }, }); - return <animated.div {...{ className: "lipsync-working", style }}> - <div {...{ className: "lipsync-working-notice" }}> - <h2 {...{ className: "working-title" }}> { transitions(({ opacity, position }, i) => { - return <animated.span {...{ className: "working-title-text", style: { opacity, position: position as any} }}>{ workStatus[index] } ...</animated.span>; - }) }</h2> - <Spinner /> - </div> - </animated.div>; + return ( + <animated.div {...{ className: "lipsync-working", style }}> + <div {...{ className: "lipsync-working-notice" }}> + <h2 {...{ className: "working-title" }}> + {" "} + {transitions(({ opacity, position }, i) => { + return ( + <animated.span + {...{ + className: "working-title-text", + style: { opacity, position: position as any }, + }} + > + {workStatus[index]} ... + </animated.span> + ); + })} + </h2> + <Spinner /> + </div> + </animated.div> + ); }; -export default function LipsyncEditor({ enqueueInferenceJob, sessionSubscriptionsWrapper, inferenceJobsByCategory, ...rest }: EditorProps) { +export default function LipsyncEditor({ + enqueueInferenceJob, + sessionSubscriptionsWrapper, + inferenceJobsByCategory, + ...rest +}: EditorProps) { const { t } = useLocalize("FaceAnimator"); // the ready states are set by functions which run after the upload input animation is completed, which then illuminates the respective checkmark in a staggered way to draw attention to the workflow, and reduces concurrent animations - const [imageReady,imageReadySet] = useState<boolean>(false); - const [audioReady,audioReadySet] = useState<boolean>(false); - const readyMedia = (m:number) => (t:boolean) => [imageReadySet,audioReadySet][m](t); + const [imageReady, imageReadySet] = useState<boolean>(false); + const [audioReady, audioReadySet] = useState<boolean>(false); + const readyMedia = (m: number) => (t: boolean) => + [imageReadySet, audioReadySet][m](t); const audioProps = useFile({}); // contains upload inout state and controls, see docs const imageProps = useFile({}); // contains upload inout state and controls, see docs - const [index,indexSet] = useState<number>(0); // index = slideshow slide position + const [index, indexSet] = useState<number>(0); // index = slideshow slide position const makeRequest = (mode: number) => ({ - uuid_idempotency_token: uuidv4(), - file: mode ? imageProps.file : audioProps.file, - source: "file", - type: mode ? "image" : "audio" + uuid_idempotency_token: uuidv4(), + file: mode ? imageProps.file : audioProps.file, + source: "file", + type: mode ? "image" : "audio", }); - const upImageAndMerge = async (audio: any) => ({ audio, image: await UploadImage(makeRequest(1)) }); + const upImageAndMerge = async (audio: any) => ({ + audio, + image: await UploadImage(makeRequest(1)), + }); const submit = async () => { if (!audioProps.file) return false; @@ -120,41 +180,50 @@ export default function LipsyncEditor({ enqueueInferenceJob, sessionSubscription indexSet(1); // set audio working page UploadAudio(makeRequest(0)) // start audio (0) upload - .then(res => { - if ("upload_token" in res) { - indexSet(2); // set image working page - } - return upImageAndMerge(res); // start image (1) upload, replace with Upload(imageRequest) - }) - .then(responses => { - if ("upload_token" in responses.image) { - indexSet(3); // set face animator API working page - return EnqueueFaceAnimation({ - uuid_idempotency_token: uuidv4(), - audio_source: { - maybe_media_upload_token: responses.audio.upload_token, - }, - image_source: { - maybe_media_upload_token: responses.image.upload_token, - }, - }); - } - }) - .then(res => { - if (res && res.inference_job_token) { - enqueueInferenceJob( - res.inference_job_token, - FrontendInferenceJobType.FaceAnimation - ); - indexSet(4); // set face animator API success page - } - }) - .catch(e => { - return { success : false }; - }); + .then((res) => { + if ("upload_token" in res) { + indexSet(2); // set image working page + } + return upImageAndMerge(res); // start image (1) upload, replace with Upload(imageRequest) + }) + .then((responses) => { + if ("upload_token" in responses.image) { + indexSet(3); // set face animator API working page + return EnqueueFaceAnimation({ + uuid_idempotency_token: uuidv4(), + audio_source: { + maybe_media_upload_token: responses.audio.upload_token, + }, + image_source: { + maybe_media_upload_token: responses.image.upload_token, + }, + }); + } + }) + .then((res) => { + if (res && res.inference_job_token) { + enqueueInferenceJob( + res.inference_job_token, + FrontendInferenceJobType.FaceAnimation + ); + indexSet(4); // set face animator API success page + } + }) + .catch((e) => { + return { success: false }; + }); }; const page = index === 0 ? 0 : index === 4 ? 2 : 1; - const headerProps = { audioProps, audioReady, imageProps, imageReady, indexSet, page, submit , t}; + const headerProps = { + audioProps, + audioReady, + imageProps, + imageReady, + indexSet, + page, + submit, + t, + }; const transitions = useTransition(index, { ...softSpring, @@ -163,25 +232,31 @@ export default function LipsyncEditor({ enqueueInferenceJob, sessionSubscription leave: { opacity: 0, position: "absolute" }, }); - return <div> - <div {...{ className: "container" }}> - <div {...{ className: "panel lipsync-panel" }}> - <FaceAnimatorTitle { ...headerProps }/> - { transitions((style, i) => { - const Page = [InputPage,Working,FaceAnimatorSuccess][page]; - return Page ? <Page {...{ - audioProps, - imageProps, - enqueueInferenceJob, - sessionSubscriptionsWrapper, - inferenceJobsByCategory, - index, - t, - toggle: { audio: readyMedia(1), image: readyMedia(0) }, - style - }}/> : <></> - }) } - </div> + return ( + <div {...{ className: "container-panel pt-4" }}> + <div {...{ className: "panel lipsync-panel p-3 py-4 p-md-4" }}> + <FaceAnimatorTitle {...headerProps} /> + {transitions((style, i) => { + const Page = [InputPage, Working, FaceAnimatorSuccess][page]; + return Page ? ( + <Page + {...{ + audioProps, + imageProps, + enqueueInferenceJob, + sessionSubscriptionsWrapper, + inferenceJobsByCategory, + index, + t, + toggle: { audio: readyMedia(1), image: readyMedia(0) }, + style, + }} + /> + ) : ( + <></> + ); + })} </div> - </div>; -}; \ No newline at end of file + </div> + ); +}