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 位参与者 阅读完整话题
IT之家 5 月 1 日消息,美国宇航局(NASA)近期推出交互式照片时间轴, 首次全景展示了在美国载人绕月任务“阿耳忒弥斯 2 号”(Artemis II)期间,宇航员在“猎户座”飞船内的太空生活。 用户可以通过时间轴选项,查看尼康相机、GoPro 等常规设备拍摄的照片,还能查看宇航员通过 iPhone 17 Pro Max 拍摄记录的任务全程。 在照片内容方面,宇航员通过上述影像设备,在微重力环境下拍摄了丰富的舱内画面。这些影像不仅包括宇航员漂浮状态下的群组自拍、固定在座位上的工作照,还有透过飞船前窗拍摄的日食景象与壮丽的地球轮廓。 NASA 为本次任务制定了严格的个人设备使用规范。为确保系统安全,宇航员必须彻底禁用 iPhone 17 Pro Max 的无线电功能,并严禁其与飞船飞行系统建立任何直接连接。IT之家附上相关截图如下: 在飞行的关键阶段,宇航员需使用魔术贴将手机牢牢固定,或将其安全存放在宇航服口袋中。同时,宇航员无法直接用手机发送内容,所有照片和视频均需通过“猎户座”飞船的机载通信系统传回地球。 参考 ARTEMIS II PHOTO TIMELINE
[网站自荐] 几分钟内为视频生成 Netflix 级别字幕 CoffeeTrans: 一键式为音视频生成 Netflix 级别的精准时间轴字幕 大家好,很高兴在这里向各位介绍我的新产品 CoffeeTrans 。这是一款针对音频或者视频的上传、字幕识别、翻译、导出的一键式转录翻译平台 网址 : https://coffeetrans.app 为什么开发 CoffeeTrans ? 我的大学专业是计算机,接触过很多国外高质量课程,社区贡献了很多高质量的课程翻译,但是更多的课程没有人搬运,我自己英语还做不到流畅的正常速度观看吸收,因此想做一个自己的翻译工具 我知道社区有一些开源的实现,我自己也跑过,老实说对于普通人来说存在一些问题:安装有门槛容易包错、需要比较好的机器性能才能跑比较大的 Whisper 模型,转录速度比不够快、翻译经常抽风,跑到一半直接断了、字幕烧录非常的吃机器性能,一套流程下来耗时挺长的,当然如果是偶尔使用还是可以接受的 又有很多人会说了,这不就调用一下转录模型和大模型进行翻译吗?是的,这个承认,但是多少产品不是这样呢,一个功能到一个产品是有很多坑要踩的 另外就是国外也有很多类似的平台,不过很多聚焦于全视频处理平台,转录和翻译是其中的一小部分,额度很小并且比较贵,对于专门做转录和翻译的选择会更少 最后,因为自己也想搓一个就做了 为什么取名叫 CoffeeTrans ? 我希望泡杯咖啡的时间就能完成高质量的翻译过程,所以就叫 CoffeeTrans 了 核心特点 快速翻译 :相比本地 Whisper 转录,使用 CoffeeTrans 的转录更快,2 小时的视频可以在几分钟内转录完成 批量处理 :可以上传多个文件同时转录翻译 多语言支持 :这应该是转录翻译的基本功能 高质量翻译 :基于最新的大语言模型,翻译质量有保障。 上下文感知 :在翻译之前会整体扫描一遍上下文,自动提取术语、关系等,后续翻译都会携带上下文,保证翻译的连续性和准确性 多格式支持 :支持常见的音视频格式 精准时间轴 :生成的字幕时间轴非常准确,对于需要处理字幕的人来说非常有用 字幕导出 :支持导出为 srt 方便二次修改 支持一次翻译为多种语言 :可以一次性选择翻译为多种目标语言,极大的减少工作量,节省 credits 智能去除语气词 :智能去除语气词,让字幕更加自然流畅 技术选型 转录:使用了云服务商提供的 API 翻译:使用大模型做上下文提取 + 翻译 存储:Cloudflare R2 字幕烧录:Modal 动态创建 worker 应用场景 学生 :学习国外优质课程 独立开发 :发布自己的多语言版本介绍 法律/金融/医疗专业人士 :高效翻译专业领域的视频观看 内容创作者 :将自己的课程发布到全球,获取全球观众 ... 免费用户有 30 积分的额度(相当于 30 分钟的转录或者 30 分钟的翻译,一分钟的转录或者翻译消耗 1 个积分) 立即体验 : https://coffeetrans.app 感谢大家的支持!有任何使用问题或功能建议,欢迎在这里交流!
[网站自荐] 几分钟内为视频生成 Netflix 级别字幕 CoffeeTrans: 一键式为音视频生成 Netflix 级别的精准时间轴字幕 大家好,很高兴在这里向各位介绍我的新产品 CoffeeTrans 。这是一款针对音频或者视频的上传、字幕识别、翻译、导出的一键式转录翻译平台 网址 : https://coffeetrans.app 为什么开发 CoffeeTrans ? 我的大学专业是计算机,接触过很多国外高质量课程,社区贡献了很多高质量的课程翻译,但是更多的课程没有人搬运,我自己英语还做不到流畅的正常速度观看吸收,因此想做一个自己的翻译工具 我知道社区有一些开源的实现,我自己也跑过,老实说对于普通人来说存在一些问题:安装有门槛容易包错、需要比较好的机器性能才能跑比较大的 Whisper 模型,转录速度比不够快、翻译经常抽风,跑到一半直接断了、字幕烧录非常的吃机器性能,一套流程下来耗时挺长的,当然如果是偶尔使用还是可以接受的 又有很多人会说了,这不就调用一下转录模型和大模型进行翻译吗?是的,这个承认,但是多少产品不是这样呢,一个功能到一个产品是有很多坑要踩的 另外就是国外也有很多类似的平台,不过很多聚焦于全视频处理平台,转录和翻译是其中的一小部分,额度很小并且比较贵,对于专门做转录和翻译的选择会更少 最后,因为自己也想搓一个就做了 为什么取名叫 CoffeeTrans ? 我希望泡杯咖啡的时间就能完成高质量的翻译过程,所以就叫 CoffeeTrans 了 核心特点 快速翻译 :相比本地 Whisper 转录,使用 CoffeeTrans 的转录更快,2 小时的视频可以在几分钟内转录完成 批量处理 :可以上传多个文件同时转录翻译 多语言支持 :这应该是转录翻译的基本功能 高质量翻译 :基于最新的大语言模型,翻译质量有保障。 上下文感知 :在翻译之前会整体扫描一遍上下文,自动提取术语、关系等,后续翻译都会携带上下文,保证翻译的连续性和准确性 多格式支持 :支持常见的音视频格式 精准时间轴 :生成的字幕时间轴非常准确,对于需要处理字幕的人来说非常有用 字幕导出 :支持导出为 srt 方便二次修改 支持一次翻译为多种语言 :可以一次性选择翻译为多种目标语言,极大的减少工作量,节省 credits 智能去除语气词 :智能去除语气词,让字幕更加自然流畅 技术选型 转录:使用了云服务商提供的 API 翻译:使用大模型做上下文提取 + 翻译 存储:Cloudflare R2 字幕烧录:Modal 动态创建 worker 应用场景 学生 :学习国外优质课程 独立开发 :发布自己的多语言版本介绍 法律/金融/医疗专业人士 :高效翻译专业领域的视频观看 内容创作者 :将自己的课程发布到全球,获取全球观众 ... 免费用户有 30 积分的额度(相当于 30 分钟的转录或者 30 分钟的翻译,一分钟的转录或者翻译消耗 1 个积分) 立即体验 : https://coffeetrans.app 感谢大家的支持!有任何使用问题或功能建议,欢迎在这里交流!
[网站自荐] 几分钟内为视频生成 Netflix 级别字幕 CoffeeTrans: 一键式为音视频生成 Netflix 级别的精准时间轴字幕 大家好,很高兴在这里向各位介绍我的新产品 CoffeeTrans 。这是一款针对音频或者视频的上传、字幕识别、翻译、导出的一键式转录翻译平台 网址 : https://coffeetrans.app 为什么开发 CoffeeTrans ? 我的大学专业是计算机,接触过很多国外高质量课程,社区贡献了很多高质量的课程翻译,但是更多的课程没有人搬运,我自己英语还做不到流畅的正常速度观看吸收,因此想做一个自己的翻译工具 我知道社区有一些开源的实现,我自己也跑过,老实说对于普通人来说存在一些问题:安装有门槛容易包错、需要比较好的机器性能才能跑比较大的 Whisper 模型,转录速度比不够快、翻译经常抽风,跑到一半直接断了、字幕烧录非常的吃机器性能,一套流程下来耗时挺长的,当然如果是偶尔使用还是可以接受的 又有很多人会说了,这不就调用一下转录模型和大模型进行翻译吗?是的,这个承认,但是多少产品不是这样呢,一个功能到一个产品是有很多坑要踩的 另外就是国外也有很多类似的平台,不过很多聚焦于全视频处理平台,转录和翻译是其中的一小部分,额度很小并且比较贵,对于专门做转录和翻译的选择会更少 最后,因为自己也想搓一个就做了 为什么取名叫 CoffeeTrans ? 我希望泡杯咖啡的时间就能完成高质量的翻译过程,所以就叫 CoffeeTrans 了 核心特点 快速翻译 :相比本地 Whisper 转录,使用 CoffeeTrans 的转录更快,2 小时的视频可以在几分钟内转录完成 批量处理 :可以上传多个文件同时转录翻译 多语言支持 :这应该是转录翻译的基本功能 高质量翻译 :基于最新的大语言模型,翻译质量有保障。 上下文感知 :在翻译之前会整体扫描一遍上下文,自动提取术语、关系等,后续翻译都会携带上下文,保证翻译的连续性和准确性 多格式支持 :支持常见的音视频格式 精准时间轴 :生成的字幕时间轴非常准确,对于需要处理字幕的人来说非常有用 字幕导出 :支持导出为 srt 方便二次修改 支持一次翻译为多种语言 :可以一次性选择翻译为多种目标语言,极大的减少工作量,节省 credits 智能去除语气词 :智能去除语气词,让字幕更加自然流畅 技术选型 转录:使用了云服务商提供的 API 翻译:使用大模型做上下文提取 + 翻译 存储:Cloudflare R2 字幕烧录:Modal 动态创建 worker 应用场景 学生 :学习国外优质课程 独立开发 :发布自己的多语言版本介绍 法律/金融/医疗专业人士 :高效翻译专业领域的视频观看 内容创作者 :将自己的课程发布到全球,获取全球观众 ... 免费用户有 30 积分的额度(相当于 30 分钟的转录或者 30 分钟的翻译,一分钟的转录或者翻译消耗 1 个积分) 立即体验 : https://coffeetrans.app 感谢大家的支持!有任何使用问题或功能建议,欢迎在这里交流!
[网站自荐] 几分钟内为视频生成 Netflix 级别字幕 CoffeeTrans: 一键式为音视频生成 Netflix 级别的精准时间轴字幕 大家好,很高兴在这里向各位介绍我的新产品 CoffeeTrans 。这是一款针对音频或者视频的上传、字幕识别、翻译、导出的一键式转录翻译平台 网址 : https://coffeetrans.app 为什么开发 CoffeeTrans ? 我的大学专业是计算机,接触过很多国外高质量课程,社区贡献了很多高质量的课程翻译,但是更多的课程没有人搬运,我自己英语还做不到流畅的正常速度观看吸收,因此想做一个自己的翻译工具 我知道社区有一些开源的实现,我自己也跑过,老实说对于普通人来说存在一些问题:安装有门槛容易包错、需要比较好的机器性能才能跑比较大的 Whisper 模型,转录速度比不够快、翻译经常抽风,跑到一半直接断了、字幕烧录非常的吃机器性能,一套流程下来耗时挺长的,当然如果是偶尔使用还是可以接受的 又有很多人会说了,这不就调用一下转录模型和大模型进行翻译吗?是的,这个承认,但是多少产品不是这样呢,一个功能到一个产品是有很多坑要踩的 另外就是国外也有很多类似的平台,不过很多聚焦于全视频处理平台,转录和翻译是其中的一小部分,额度很小并且比较贵,对于专门做转录和翻译的选择会更少 最后,因为自己也想搓一个就做了 为什么取名叫 CoffeeTrans ? 我希望泡杯咖啡的时间就能完成高质量的翻译过程,所以就叫 CoffeeTrans 了 核心特点 快速翻译 :相比本地 Whisper 转录,使用 CoffeeTrans 的转录更快,2 小时的视频可以在几分钟内转录完成 批量处理 :可以上传多个文件同时转录翻译 多语言支持 :这应该是转录翻译的基本功能 高质量翻译 :基于最新的大语言模型,翻译质量有保障。 上下文感知 :在翻译之前会整体扫描一遍上下文,自动提取术语、关系等,后续翻译都会携带上下文,保证翻译的连续性和准确性 多格式支持 :支持常见的音视频格式 精准时间轴 :生成的字幕时间轴非常准确,对于需要处理字幕的人来说非常有用 字幕导出 :支持导出为 srt 方便二次修改 支持一次翻译为多种语言 :可以一次性选择翻译为多种目标语言,极大的减少工作量,节省 credits 智能去除语气词 :智能去除语气词,让字幕更加自然流畅 技术选型 转录:使用了云服务商提供的 API 翻译:使用大模型做上下文提取 + 翻译 存储:Cloudflare R2 字幕烧录:Modal 动态创建 worker 应用场景 学生 :学习国外优质课程 独立开发 :发布自己的多语言版本介绍 法律/金融/医疗专业人士 :高效翻译专业领域的视频观看 内容创作者 :将自己的课程发布到全球,获取全球观众 ... 免费用户有 30 积分的额度(相当于 30 分钟的转录或者 30 分钟的翻译,一分钟的转录或者翻译消耗 1 个积分) 立即体验 : https://coffeetrans.app 感谢大家的支持!有任何使用问题或功能建议,欢迎在这里交流!
IT之家 4 月 29 日消息,小红书等平台的网友发帖反馈称,微信朋友圈的页面排版发生了明显变化。 有用户反映,这一变化出现在 8.0.71 及以上的 iOS 版本的微信中。在“我的朋友圈”页面内,原本位于配图右侧的文字描述已调整至配图上方,发布日期的显示形式也同步进行了精简。 针对此次页面排版调整,腾讯客服回应称,文字位置的变化属于展示形式的优化调整,旨在持续提升用户的浏览体验。 此外,页面右上角新增了“朋友圈相册”入口,支持按年 / 月 / 日缩放浏览历史动态,逻辑类似苹果原生相册。另外,在文章音频播放界面中,新增“原文”入口和“评论”按钮,支持边听音频边查看原文或评论,无需跳转。 还有博主反馈称,iOS 版微信正灰度测试新功能,可多选文字形式复制聊天记录。 IT之家提醒,目前该系列变化可能仍处于灰度测试或逐步推送阶段,有不少用户表示自己的朋友圈界面尚未出现上述改动。 有部分网友反馈称,习惯多年来的排版后看到新的布局感到不习惯,也有网友认为新布局更便于按时间线查找过往内容。 大家在 IT之家微信号 回复“ 微信 ”两字,即可获取当前最新官方内部版微信下载。
今天使用 CC 开发一个中国 24 史网站,用于介绍中国 24 史,以时间轴的展示各个朝代的国祚长短, https://china.zorezoro.com/