WWW.YOUINFO.SITE
标签聚合 生成器

/tag/生成器

v2ex · 2026-06-09 22:06:38+08:00 · tech

最近折腾 UI 老要用到 iOS 那种 squircle(超椭圆)圆角——就是比普通 border-radius 更顺滑、苹果 App 图标那种形状。网上现成工具要么只 能导固定形状,要么要登录,干脆自己写了一个。 地址: https://squirclegenerator.com (纯前端,不用注册,不上传任何东西) 能做的: 拖滑块调宽、高、圆角平滑度(其实就是超椭圆的指数 n) 实时预览 + 选颜色 一键复制 CSS clip-path ,或下载像素级精确的 SVG 带了几个预设:iOS 应用图标、按钮、卡片、头像 实现就是超椭圆公式 |x/a|^n + |y/b|^n = 1 采样生成路径,clip-path 和 SVG 两种输出,整站纯静态零构建。 主要自己用着方便,顺手分享。有不好用或者想加的功能,欢迎拍砖 🙏

LinuxDo 最新话题 · 2026-06-09 21:44:27+08:00 · tech

Python版本 """ 基于音节/字数精确分配时间 """ import re import tkinter as tk from tkinter import ttk, filedialog, messagebox, scrolledtext # ==================== 核心逻辑 ==================== def count_english_syllables(word): w = word.strip('.,;:!?"\'()[]{}').lower() if not w: return 0 vowels = set("aeiouy") count = 0 prev_is_vowel = False for ch in w: is_vowel = ch in vowels if is_vowel and not prev_is_vowel: count += 1 prev_is_vowel = is_vowel if w.endswith("e") and not w.endswith("le") and count > 1: count -= 1 if w.endswith("le") and len(w) > 2 and w[-3] not in vowels: count += 1 return max(count, 1) def count_pronunciation_units(text): total = 0 tokens = re.findall(r'[\u4e00-\u9fff]|[a-zA-Z]+|\d+%?|[^\s]', text) for token in tokens: if re.match(r'[\u4e00-\u9fff]', token): total += 1 elif re.match(r'[a-zA-Z]+', token): total += count_english_syllables(token) elif re.match(r'\d+%?', token): digits = token.replace('%', '') total += min(len(digits) + 1, 5) return total def split_sentences(text): parts = re.split(r'(?<=[.,;])\s+', text) return [p.strip() for p in parts if p.strip()] def ms_to_parts(ms): total_sec = ms / 1000 m = int(total_sec // 60) s = total_sec - m * 60 return m, s def fmt_lyrics3(ms): m, s = ms_to_parts(ms) return f"[{m:02d}:{s:05.2f}]" def fmt_srt(ms): m, s = ms_to_parts(ms) return f"{m:02d}:{s:05.2f}".replace(".", ",") def fmt_ass(ms): m, s = ms_to_parts(ms) h = m // 60 m = m % 60 return f"{h}:{m:02d}:{s:05.2f}" def fmt_vtt(ms): m, s = ms_to_parts(ms) return f"{m:02d}:{s:06.3f}" def generate_subtitles(text, total_seconds, fmt="lyrics3"): total_ms = float(total_seconds) * 1000 sentences = split_sentences(text) if not sentences: return "", 0 units_per_sentence = [count_pronunciation_units(s) for s in sentences] total_units = sum(units_per_sentence) if total_units == 0: return "", 0 ms_per_unit = total_ms / total_units timings = [] cur = 0.0 for i, s in enumerate(sentences): dur = units_per_sentence[i] * ms_per_unit timings.append((cur, cur + dur, s)) cur += dur formatters = {"lyrics3": fmt_lyrics3, "srt": fmt_srt, "ass": fmt_ass, "vtt": fmt_vtt} f = formatters.get(fmt, fmt_lyrics3) lines = [] if fmt == "vtt": lines.append("WEBVTT\n") elif fmt == "ass": lines.append("[Script Info]") lines.append("ScriptType: v4.00+") lines.append("PlayResX: 384") lines.append("PlayResY: 288\n") lines.append("[V4+ Styles]") lines.append("Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding") lines.append("Style: Default,Arial,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1\n") lines.append("[Events]") lines.append("Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text") for i, (start, end, sent) in enumerate(timings): if fmt == "srt": lines.append(str(i + 1)) lines.append(f"{f(start)} --> {f(end)}") lines.append(sent) lines.append("") elif fmt == "ass": lines.append(f"Dialogue: 0,{f(start)},{f(end)},Default,,0,0,0,,{sent}") elif fmt == "vtt": lines.append(f"{f(start)} --> {f(end)}") lines.append(sent) lines.append("") else: lines.append(f"{f(start)}{sent}") return "\n".join(lines), len(sentences) # ==================== GUI ==================== class SubtitleApp: def __init__(self, root): self.root = root self.root.title("字幕时间轴生成器") self.root.geometry("900x720") self.root.configure(bg="#1e1e2e") self.root.minsize(700, 550) # 样式 style = ttk.Style() style.theme_use("clam") style.configure("TFrame", background="#1e1e2e") style.configure("TLabel", background="#1e1e2e", foreground="#cdd6f4", font=("Segoe UI", 11)) style.configure("TButton", background="#45475a", foreground="#cdd6f4", font=("Segoe UI", 10), borderwidth=0, padding=8) style.map("TButton", background=[("active", "#585b70")]) style.configure("TEntry", fieldbackground="#313244", foreground="#cdd6f4", font=("Segoe UI", 11), padding=6) style.configure("TCombobox", fieldbackground="#313244", foreground="#cdd6f4", font=("Segoe UI", 11), padding=4) self.build_ui() def build_ui(self): # 主容器 main = ttk.Frame(self.root, padding=20) main.pack(fill="both", expand=True) # 标题 title = tk.Label(main, text="🎬 字幕时间轴生成器", font=("Segoe UI", 20, "bold"), bg="#1e1e2e", fg="#cba6f7") title.pack(pady=(0, 5)) subtitle = tk.Label(main, text="基于音节/字数精确分配时间 · 支持中英混合", font=("Segoe UI", 10), bg="#1e1e2e", fg="#6c7086") subtitle.pack(pady=(0, 20)) # 输入区域 input_frame = ttk.Frame(main) input_frame.pack(fill="both", expand=True) lbl_input = tk.Label(input_frame, text="📝 输入文本(按句号/逗号/分号自动分句)", font=("Segoe UI", 11, "bold"), bg="#1e1e2e", fg="#a6adc8") lbl_input.pack(anchor="w") self.text_input = scrolledtext.ScrolledText( input_frame, height=10, font=("Segoe UI", 11), bg="#313244", fg="#cdd6f4", insertbackground="#cdd6f4", relief="flat", borderwidth=0, padx=12, pady=12, wrap=tk.WORD, highlightthickness=1, highlightbackground="#45475a" ) self.text_input.pack(fill="both", expand=True, pady=(5, 15)) # 设置行 settings_frame = ttk.Frame(main) settings_frame.pack(fill="x", pady=(0, 15)) # 时长 dur_frame = ttk.Frame(settings_frame) dur_frame.pack(side="left", padx=(0, 30)) ttk.Label(dur_frame, text="⏱ 总时长(秒)").pack(side="left", padx=(0, 8)) self.duration_var = tk.StringVar(value="73") self.duration_entry = ttk.Entry(dur_frame, textvariable=self.duration_var, width=10) self.duration_entry.pack(side="left") # 格式 fmt_frame = ttk.Frame(settings_frame) fmt_frame.pack(side="left", padx=(0, 30)) ttk.Label(fmt_frame, text="📄 输出格式").pack(side="left", padx=(0, 8)) self.format_var = tk.StringVar(value="lyrics3") fmt_combo = ttk.Combobox(fmt_frame, textvariable=self.format_var, values=["lyrics3", "srt", "ass", "vtt"], state="readonly", width=10) fmt_combo.pack(side="left") # 统计 self.stats_var = tk.StringVar(value="分句: 0 句 | 总发音单位: 0") stats_label = tk.Label(settings_frame, textvariable=self.stats_var, font=("Segoe UI", 10), bg="#1e1e2e", fg="#6c7086") stats_label.pack(side="right") # 按钮 btn_frame = ttk.Frame(main) btn_frame.pack(fill="x", pady=(0, 15)) self.btn_generate = tk.Button( btn_frame, text="✨ 生成字幕", font=("Segoe UI", 12, "bold"), bg="#cba6f7", fg="#1e1e2e", activebackground="#b4befe", activeforeground="#1e1e2e", relief="flat", borderwidth=0, padx=24, pady=10, cursor="hand2", command=self.on_generate ) self.btn_generate.pack(side="left", padx=(0, 10)) self.btn_copy = tk.Button( btn_frame, text="📋 复制全部", font=("Segoe UI", 11), bg="#45475a", fg="#cdd6f4", activebackground="#585b70", activeforeground="#cdd6f4", relief="flat", borderwidth=0, padx=20, pady=10, cursor="hand2", command=self.on_copy ) self.btn_copy.pack(side="left", padx=(0, 10)) self.btn_save = tk.Button( btn_frame, text="💾 保存文件", font=("Segoe UI", 11), bg="#45475a", fg="#cdd6f4", activebackground="#585b70", activeforeground="#cdd6f4", relief="flat", borderwidth=0, padx=20, pady=10, cursor="hand2", command=self.on_save ) self.btn_save.pack(side="left") # 输出区域 output_frame = ttk.Frame(main) output_frame.pack(fill="both", expand=True) lbl_output = tk.Label(output_frame, text="📤 生成结果", font=("Segoe UI", 11, "bold"), bg="#1e1e2e", fg="#a6adc8") lbl_output.pack(anchor="w") self.text_output = scrolledtext.ScrolledText( output_frame, height=12, font=("Cascadia Code", 10), bg="#11111b", fg="#a6e3a1", insertbackground="#a6e3a1", relief="flat", borderwidth=0, padx=12, pady=12, wrap=tk.NONE, highlightthickness=1, highlightbackground="#45475a" ) self.text_output.pack(fill="both", expand=True, pady=(5, 0)) def on_generate(self): text = self.text_input.get("1.0", "end-1c").strip() if not text: messagebox.showwarning("提示", "请先输入文本。") return try: duration = float(self.duration_var.get()) if duration <= 0: raise ValueError except ValueError: messagebox.showwarning("提示", "请输入有效的正数时长(秒)。") return fmt = self.format_var.get() result, count = generate_subtitles(text, duration, fmt) self.text_output.delete("1.0", "end") if result: self.text_output.insert("1.0", result) total_units = sum(count_pronunciation_units(s) for s in split_sentences(text)) self.stats_var.set(f"分句: {count} 句 | 总发音单位: {total_units}") def on_copy(self): result = self.text_output.get("1.0", "end-1c").strip() if result: self.root.clipboard_clear() self.root.clipboard_append(result) messagebox.showinfo("提示", "已复制到剪贴板!") def on_save(self): result = self.text_output.get("1.0", "end-1c").strip() if not result: messagebox.showwarning("提示", "没有可保存的内容,请先生成字幕。") return fmt = self.format_var.get() exts = {"lyrics3": ".txt", "srt": ".srt", "ass": ".ass", "vtt": ".vtt"} ext = exts.get(fmt, ".txt") path = filedialog.asksaveasfilename( defaultextension=ext, filetypes=[(f"{fmt.upper()} 字幕", f"*{ext}"), ("所有文件", "*.*")] ) if path: with open(path, "w", encoding="utf-8") as f: f.write(result) messagebox.showinfo("提示", f"已保存到:{path}") if __name__ == "__main__": root = tk.Tk() app = SubtitleApp(root) root.mainloop() HTML版本 3 个帖子 - 3 位参与者 阅读完整话题

v2ex · 2026-06-07 17:20:22+08:00 · tech

GPT image 2 的图片质量是目前最好的,就用这个做了个解释视频生成器 Knowcast 。 在 https://www.knowcast.app 要做知识科普,故事解说都可以用这个。 做的过程中发现越做越难。 发现 GPT image 2 还是有不少问题,比如它有极繁主义倾向,而且连贯故事的 prompt 不是很好写,画面 prompt 调整了好久。下了很多功夫。找到合适的 API 也麻烦(吐槽一下好多 gpt image 中转站质量很差) 如果大家想生成一些讲解解说类视频,很推荐试一下。 可以生成教学视频,绘本,新闻讲解等等。

v2ex · 2026-06-07 16:20:22+08:00 · tech

GPT image 2 的图片质量是目前最好的,就用这个做了个解释视频生成器 Knowcast 。 在 https://www.knowcast.app 要做知识科普,故事解说都可以用这个。 做的过程中发现越做越难。 发现 GPT image 2 还是有不少问题,比如它有极繁主义倾向,而且连贯故事的 prompt 不是很好写,画面 prompt 调整了好久。下了很多功夫。找到合适的 API 也麻烦(吐槽一下好多 gpt image 中转站质量很差) 如果大家想生成一些讲解解说类视频,很推荐试一下。 可以生成教学视频,绘本,新闻讲解等等。

v2ex · 2026-05-27 22:01:09+08:00 · tech

最近看到 X 上 Adrian Punk 分享了一套宠物拍立得水彩风格的提示词,自己试了一下效果很不错,就把它做成了一个在线小模版。 只需要填写宠物名称、性格等几个字段,就能生成下图右边这种风格: 页面在这里: https://vivify.video/zh/ai-prompts/pet-polaroid-watercolor-generator 这个页面是我最近做的 AI 图片/视频生成站 Vivify.video 里的一个 Prompt 模版页。 之前做过一个 GPT Image 生图站,域名有侵权风险,就重新做了这个站,也顺便加上了 AI 视频功能。 注册送 20 积分,v 友跳转过去会额外送 100 永久积分,差不多可以生成 24 张 1k 图,足够基本使用了。 欢迎大家试试,有建议和 bug 随时反馈。

v2ex · 2026-05-27 10:01:09+08:00 · tech

两个月前开始做一个 AI LandingPage 生成器(叫 Lando ),核心功能很简单:用一段话描述项目需求,AI 自动生成一个 LandingPage ,还可以在上面收集用户意向。 产品基本做完了,目前处于早期阶段,用户不多。分享一些开发过程中的真实问题和思考,希望对正在做类似事情的人有帮助。 一些真实的感受: "AI 生成页面"这个需求是真的,但用户预期管理很难。 AI 生成的页面不可能跟定制的一样完美。有人觉得能用,有人觉得还要大改。目前的做法是在生成的 prompt 上给一些引导示例,但这个问题还在摸索。 独立开发最大的瓶颈不是写代码,是获客。 功能做完了,技术问题解决了,然后发现根本没人知道你做了个东西。以前觉得写代码最难,现在发现让人来用才是最难的。这个月 70% 的时间花在运营上,写代码反而只有 30%。 技术栈选 Nuxt 4 + Prisma 7 踩了一些坑。 这俩版本都太新了,文档不全,社区支持也少。遇到奇怪的问题要花很多时间排查,有些问题甚至只能自己去读源码解决。如果重新选,可能会用更成熟的组合。 定价不知道怎么定。 基础版 9 块/月,专业版 99 块/月。但说实话这个定价是拍脑袋定的,没有数据支撑。高了没人买,低了没利润,还在摸索。 目前最困惑的几个问题: 怎么做冷启动?目前试了小红书发帖、朋友推荐,效果一般 定价多少比较合理?同类产品有的免费,有的几十美金一个月 AI 生成的内容质量怎么持续优化?提示词调了几十版还是有随机性 如果你做过类似的事情,或者有什么想法,欢迎来聊聊。 产品链接(还在很早期,轻喷): 链接

LinuxDo 最新话题 · 2026-05-23 13:06:17+08:00 · tech

cover.517778.xyz 媒体库封面生成器 如题,本人毫无代码经验,近日了解到了一些vibe coding项目,就用opendesign搞了这个个小网站挂在cf上,可能会有点卡。 关于如何在网页上去套用我做好的psd文件或者是我做好的示例图片作为模板,始终找不到一个能够实现的办法,只能通过给点提示词一次次调整 。或许有懂的佬友指点一下迷津吗? 1 个帖子 - 1 位参与者 阅读完整话题

v2ex · 2026-05-21 23:25:56+08:00 · tech

我只做了几件事,把 google 的搜索数据导出,喂给 AI ,然后开始立项,写方案开发,跟开发进度,AI 一气呵成 不过最后还是得单独对部分地方进行微调 大家可以试试看 : https://rnggenerator.com/ 另外有工具网站想换链接的也可以留言,我有点想搞一个中文的产品发布站,免费给大家提供一个 DR20+的链接,另外就是想弄一个交换链接的地方,现在发外链太难了

V2EX - 技术 · 2026-05-17 18:07:50+08:00 · tech

大家好,这是我做的一个头像生成小工具: fan-avatar 。 它基于开源头像库 DiceBear 开发,内置 30 种不同头像风格 ,支持随机生成、头像美化、历史记录、下载保存、自定义背景等功能。 还在纠结头像用什么?打开它点一下,就能随机生成一个独一无二的头像。 工具里包含卡通人物、像素风、极简图标、机器人、抽象图案等多种画风,每种风格都有大量随机组合。生成结果不满意,可以继续随机;觉得差一点意思,也可以使用美化功能,对头像进行简单调整。 喜欢的头像可以直接下载,支持透明背景和自定义底色,适合用在社交账号、论坛头像、游戏资料、临时昵称头像等场景。 简单来说,它不是那种复杂的 AI 头像生成器,而是一个轻量、快速、有点上头的随机头像小玩具。没事点两下,可能就刷到一个挺顺眼的头像。

V2EX - 技术 · 2026-05-17 18:07:50+08:00 · tech

大家好,这是我做的一个头像生成小工具: fan-avatar 。 它基于开源头像库 DiceBear 开发,内置 30 种不同头像风格 ,支持随机生成、头像美化、历史记录、下载保存、自定义背景等功能。 还在纠结头像用什么?打开它点一下,就能随机生成一个独一无二的头像。 工具里包含卡通人物、像素风、极简图标、机器人、抽象图案等多种画风,每种风格都有大量随机组合。生成结果不满意,可以继续随机;觉得差一点意思,也可以使用美化功能,对头像进行简单调整。 喜欢的头像可以直接下载,支持透明背景和自定义底色,适合用在社交账号、论坛头像、游戏资料、临时昵称头像等场景。 简单来说,它不是那种复杂的 AI 头像生成器,而是一个轻量、快速、有点上头的随机头像小玩具。没事点两下,可能就刷到一个挺顺眼的头像。

V2EX - 技术 · 2026-05-17 17:06:47+08:00 · tech

大家好,这是我做的一个头像生成小工具: fan-avatar 。 它基于开源头像库 DiceBear 开发,内置 30 种不同头像风格 ,支持随机生成、头像美化、历史记录、下载保存、自定义背景等功能。 还在纠结头像用什么?打开它点一下,就能随机生成一个独一无二的头像。 工具里包含卡通人物、像素风、极简图标、机器人、抽象图案等多种画风,每种风格都有大量随机组合。生成结果不满意,可以继续随机;觉得差一点意思,也可以使用美化功能,对头像进行简单调整。 喜欢的头像可以直接下载,支持透明背景和自定义底色,适合用在社交账号、论坛头像、游戏资料、临时昵称头像等场景。 简单来说,它不是那种复杂的 AI 头像生成器,而是一个轻量、快速、有点上头的随机头像小玩具。没事点两下,可能就刷到一个挺顺眼的头像。

V2EX - 技术 · 2026-05-17 13:59:42+08:00 · tech

大家好,这是我做的一个头像生成小工具: fan-avatar 。 它基于开源头像库 DiceBear 开发,内置 30 种不同头像风格 ,支持随机生成、头像美化、历史记录、下载保存、自定义背景等功能。 还在纠结头像用什么?打开它点一下,就能随机生成一个独一无二的头像。 工具里包含卡通人物、像素风、极简图标、机器人、抽象图案等多种画风,每种风格都有大量随机组合。生成结果不满意,可以继续随机;觉得差一点意思,也可以使用美化功能,对头像进行简单调整。 喜欢的头像可以直接下载,支持透明背景和自定义底色,适合用在社交账号、论坛头像、游戏资料、临时昵称头像等场景。 简单来说,它不是那种复杂的 AI 头像生成器,而是一个轻量、快速、有点上头的随机头像小玩具。没事点两下,可能就刷到一个挺顺眼的头像。