diff --git a/enjoy/src/i18n/en.json b/enjoy/src/i18n/en.json index b9c8e21a..b67f0c1b 100644 --- a/enjoy/src/i18n/en.json +++ b/enjoy/src/i18n/en.json @@ -567,5 +567,8 @@ "areYouSureToDeleteThisNote": "Are you sure to delete this note?", "notesCount": "{{count}} notes", "source": "source", - "noNotesYet": "No notes yet" + "noNotesYet": "No notes yet", + "editTranscription": "Edit transcription", + "saveTranscription": "Save transcription", + "areYouSureToSaveTranscription": "It will perform a force-alignment between the audio and your edited transcription. Are you sure to continue?" } diff --git a/enjoy/src/i18n/zh-CN.json b/enjoy/src/i18n/zh-CN.json index 7c0de682..d554cfd4 100644 --- a/enjoy/src/i18n/zh-CN.json +++ b/enjoy/src/i18n/zh-CN.json @@ -566,5 +566,8 @@ "areYouSureToDeleteThisNote": "您确定要删除这条笔记吗?", "notesCount": "{{count}} 条笔记", "source": "来源", - "noNotesYet": "还没有笔记" + "noNotesYet": "还没有笔记", + "editTranscription": "编辑语音文本", + "saveTranscription": "保存语音文本", + "areYouSureToSaveTranscription": "即将根据您修改后的语音文本对语音重新进行对齐,确定要继续吗?" } diff --git a/enjoy/src/renderer/components/medias/index.ts b/enjoy/src/renderer/components/medias/index.ts index ba93a3a5..968448f9 100644 --- a/enjoy/src/renderer/components/medias/index.ts +++ b/enjoy/src/renderer/components/medias/index.ts @@ -5,6 +5,7 @@ export * from "./media-recordings"; export * from "./media-current-recording"; export * from "./media-recorder"; export * from "./media-transcription"; +export * from "./media-transcription-form"; export * from "./media-player"; export * from "./media-provider"; export * from "./media-tabs"; diff --git a/enjoy/src/renderer/components/medias/media-transcription-form.tsx b/enjoy/src/renderer/components/medias/media-transcription-form.tsx new file mode 100644 index 00000000..cf18e028 --- /dev/null +++ b/enjoy/src/renderer/components/medias/media-transcription-form.tsx @@ -0,0 +1,121 @@ +import { MediaPlayerProviderContext } from "@renderer/context"; +import { + AlertDialog, + AlertDialogAction, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, + AlertDialogTrigger, + Button, + Dialog, + DialogClose, + DialogContent, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, + Textarea, + toast, +} from "@renderer/components/ui"; +import { TimelineEntry } from "echogarden/dist/utilities/Timeline"; +import { t } from "i18next"; +import { useContext, useState } from "react"; +import { LoaderIcon } from "lucide-react"; + +export const MediaTranscriptionForm = () => { + const [open, setOpen] = useState(false); + + return ( + + + + + + + + + ); +}; + +export const TranscriptionForm = (props: { + setOpen: (value: boolean) => void; +}) => { + const { setOpen } = props; + const [submiting, setSubmiting] = useState(false); + const { transcription, generateTranscription } = useContext( + MediaPlayerProviderContext + ); + const [content, setContent] = useState( + transcription.result.timeline.map((t: TimelineEntry) => t.text).join("\n\n") + ); + + const handleSave = async () => { + setSubmiting(true); + try { + await generateTranscription(content); + setOpen(false); + } catch (e) { + toast.error(e.message); + } + + setSubmiting(false); + }; + + return ( + <> + + {t("editTranscription")} + +
+