528 |
529 | Enter URLs
530 |
538 |
539 |
540 | {parsedUrls.length > 0 && (
541 |
542 |
Parsed URLs
543 |
544 | {parsedUrls.map((url, index) => {
545 | const domain = new URL(url).hostname;
546 | const faviconUrl = `https://www.google.com/s2/favicons?domain=${domain}`;
547 |
548 | return (
549 |
553 |
554 |
{
559 | // Fallback if favicon fails to load
560 | (e.target as HTMLImageElement).style.display =
561 | "none";
562 | }}
563 | />
564 |
{url}
565 |
566 |
removeUrl(index)}
571 | className="opacity-0 group-hover:opacity-100 transition-opacity"
572 | >
573 |
574 |
575 |
576 | );
577 | })}
578 |
579 |
580 | )}
581 |
582 |
583 |
584 |
585 |
586 | Image URLs (Optional)
587 |
588 |
596 |
597 |
598 | {parsedImageUrls.length > 0 && (
599 |
600 |
Parsed Image URLs
601 |
602 | {parsedImageUrls.map((url, index) => (
603 |
607 |
608 |
609 |
{
614 | const target = e.target as HTMLImageElement;
615 | target.src =
616 | 'data:image/svg+xml,
';
617 | target.className = "w-full h-full p-1";
618 | }}
619 | />
620 |
621 |
{url}
622 |
623 |
removeImageUrl(index)}
628 | className="opacity-0 group-hover:opacity-100 transition-opacity"
629 | >
630 |
631 |
632 |
633 | ))}
634 |
635 |
636 | )}
637 |
638 |
639 |
650 |
651 |
652 |
653 | Advanced Settings
654 |
655 |
656 |
657 |
658 | Additional Instructions
659 |
660 |
666 |
667 | Optional: Add any specific requirements or preferences for
668 | the podcast generation
669 |
670 |
671 |
672 |
673 |
674 |
678 | form.setValue("isLongForm", checked)
679 | }
680 | />
681 | Long-form Content
682 |
683 |
684 |
685 |
686 | Creativity Level ({form.watch("creativityLevel")})
687 |
688 |
691 | form.setValue("creativityLevel", value)
692 | }
693 | max={1}
694 | step={0.1}
695 | className="w-full"
696 | />
697 |
698 |
699 |
700 |
701 |
Interviewer Role
702 |
703 |
704 |
705 |
706 |
707 |
708 |
709 | Define the role of the first speaker (e.g.,
710 | Host, Moderator, Journalist)
711 |
712 |
713 |
714 |
715 |
716 |
717 |
718 |
719 |
720 |
721 |
Expert Role
722 |
723 |
724 |
725 |
726 |
727 |
728 |
729 | Define the role of the second speaker (e.g.,
730 | Guest Expert, Specialist, Researcher)
731 |
732 |
733 |
734 |
735 |
736 |
737 |
738 |
739 |
740 |
Conversation Style
741 |
742 | {customConversationStyles.map((style) => (
743 |
{
752 | const current = form.watch("conversationStyles");
753 | if (current.includes(style)) {
754 | form.setValue(
755 | "conversationStyles",
756 | current.filter((s) => s !== style)
757 | );
758 | } else {
759 | form.setValue("conversationStyles", [
760 | ...current,
761 | style,
762 | ]);
763 | }
764 | }}
765 | >
766 | {style}
767 |
768 | ))}
769 |
{
771 | setCustomConversationStyles((prev) => [
772 | ...prev,
773 | value as ConversationStyle,
774 | ]);
775 | const current = form.watch("conversationStyles");
776 | if (!current.includes(value)) {
777 | form.setValue("conversationStyles", [
778 | ...current,
779 | value,
780 | ]);
781 | }
782 | }}
783 | placeholder="Enter custom style"
784 | />
785 |
786 |
787 |
788 |
789 |
Dialogue Structure
790 |
791 | {customDialogueStructures.map((structure) => (
792 |
{
803 | const current = form.watch("dialogueStructure");
804 | if (current.includes(structure)) {
805 | form.setValue(
806 | "dialogueStructure",
807 | current.filter((s) => s !== structure)
808 | );
809 | } else {
810 | form.setValue("dialogueStructure", [
811 | ...current,
812 | structure,
813 | ]);
814 | }
815 | }}
816 | >
817 | {structure}
818 |
819 | ))}
820 |
{
822 | setCustomDialogueStructures((prev) => [
823 | ...prev,
824 | value as DialogueStructure,
825 | ]);
826 | const current = form.watch("dialogueStructure");
827 | if (!current.includes(value)) {
828 | form.setValue("dialogueStructure", [
829 | ...current,
830 | value,
831 | ]);
832 | }
833 | }}
834 | placeholder="Enter custom structure"
835 | />
836 |
837 |
838 |
839 |
840 |
Engagement Techniques
841 |
842 | {customEngagementTechniques.map((technique) => (
843 |
{
854 | const current = form.watch(
855 | "engagementTechniques"
856 | );
857 | if (current.includes(technique)) {
858 | form.setValue(
859 | "engagementTechniques",
860 | current.filter((t) => t !== technique)
861 | );
862 | } else {
863 | form.setValue("engagementTechniques", [
864 | ...current,
865 | technique,
866 | ]);
867 | }
868 | }}
869 | >
870 | {technique}
871 |
872 | ))}
873 |
{
875 | setCustomEngagementTechniques((prev) => [
876 | ...prev,
877 | value as EngagementTechnique,
878 | ]);
879 | const current = form.watch("engagementTechniques");
880 | if (!current.includes(value)) {
881 | form.setValue("engagementTechniques", [
882 | ...current,
883 | value,
884 | ]);
885 | }
886 | }}
887 | placeholder="Enter custom technique"
888 | />
889 |
890 |
891 |
892 |
893 |
894 |
Text-to-Speech Model
895 |
896 |
897 |
898 |
904 |
905 |
906 |
907 |
908 |
909 |
910 | API Key Setup Instructions:
911 |
912 |
913 | Google Gemini:
914 |
915 |
916 | Go to Google Cloud Console
917 |
918 | Enable both "Vertex AI API" and "Cloud
919 | Text-to-Speech API"
920 |
921 |
922 | Create an API key with access to these APIs
923 |
924 |
925 | Add Cloud Text-to-Speech API permission to
926 | the key
927 |
928 |
929 |
930 | OpenAI: Get your API key from
931 | OpenAI dashboard
932 |
933 |
934 | ElevenLabs: Get your API key
935 | from ElevenLabs dashboard
936 |
937 |
938 | Edge TTS: No API key required
939 | - free to use
940 |
941 |
942 |
943 |
944 |
945 |
946 |
949 | form.setValue("ttsModel", value)
950 | }
951 | >
952 |
953 |
954 |
955 |
956 |
957 | Google Gemini Multi (requires API key)
958 |
959 |
960 | Microsoft Edge TTS (Free)
961 |
962 |
963 | OpenAI TTS (requires API key)
964 |
965 |
966 | ElevenLabs (requires API key)
967 |
968 |
969 |
970 |
971 |
972 |
973 |
974 |
975 |
976 |
977 | {isGenerating && (
978 |
979 |
980 |
981 | {statusMessage || `Generating podcast... ${progress}%`}
982 |
983 |
984 | )}
985 |
986 | {audioUrl && (
987 |
988 |
989 |
Generated Podcast
990 |
991 |
992 | Your browser does not support the audio element.
993 |
994 |
995 |
996 |
997 | window.open(audioUrl)}
1000 | variant="secondary"
1001 | >
1002 |
1003 | Download
1004 |
1005 |
1006 |
1007 | {transcript && (
1008 |
1009 |
1010 | View Transcript
1011 |
1012 |
1013 |
1014 | {transcript}
1015 |
1016 |
1017 |
1018 |
1019 |
1020 | )}
1021 |
1022 | )}
1023 |
1024 |
1025 | {isGenerating ? (
1026 | <>
1027 |
1028 | Generating Podcast
1029 | >
1030 | ) : (
1031 | <>
1032 |
1033 | Generate Podcast
1034 | >
1035 | )}
1036 |
1037 |
1038 |