"""Generate UX Research Report as Word document""" from docx import Document from docx.shared import Pt, Inches, Cm, RGBColor from docx.enum.text import WD_ALIGN_PARAGRAPH from docx.enum.table import WD_TABLE_ALIGNMENT from docx.oxml.ns import qn from docx.oxml import OxmlElement doc = Document() # Set default font style = doc.styles['Normal'] font = style.font font.name = 'Microsoft YaHei' font.size = Pt(11) style.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') # Set page margins sections = doc.sections for section in sections: section.top_margin = Cm(2.5) section.bottom_margin = Cm(2.5) section.left_margin = Cm(2.5) section.right_margin = Cm(2.5) def set_cell_background(cell, color): """Set cell background color""" shading = OxmlElement('w:shd') shading.set(qn('w:fill'), color) shading.set(qn('w:val'), 'clear') cell._tc.get_or_add_tcPr().append(shading) def add_heading_custom(text, level=1): """Add a custom heading with color""" heading = doc.add_heading(text, level=level) for run in heading.runs: run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') if level == 1: run.font.color.rgb = RGBColor(0x2C, 0x2C, 0x2A) run.font.size = Pt(18) elif level == 2: run.font.color.rgb = RGBColor(0x53, 0x4A, 0xB7) run.font.size = Pt(15) elif level == 3: run.font.color.rgb = RGBColor(0x0F, 0x6E, 0x56) run.font.size = Pt(13) return heading def add_para(text, bold=False, italic=False, color=None, size=None): """Add a paragraph with optional formatting""" p = doc.add_paragraph() run = p.add_run(text) run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') if bold: run.font.bold = True if italic: run.font.italic = True if color: run.font.color.rgb = color if size: run.font.size = Pt(size) return p def add_table_from_data(headers, rows, col_widths=None): """Add a formatted table""" table = doc.add_table(rows=1+len(rows), cols=len(headers)) table.style = 'Table Grid' table.alignment = WD_TABLE_ALIGNMENT.CENTER # Header row for i, header in enumerate(headers): cell = table.rows[0].cells[i] cell.text = '' p = cell.paragraphs[0] run = p.add_run(header) run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run.font.bold = True run.font.size = Pt(10) run.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF) set_cell_background(cell, '534AB7') p.alignment = WD_ALIGN_PARAGRAPH.CENTER # Data rows for row_idx, row_data in enumerate(rows): for col_idx, cell_text in enumerate(row_data): cell = table.rows[row_idx+1].cells[col_idx] cell.text = '' p = cell.paragraphs[0] run = p.add_run(str(cell_text)) run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run.font.size = Pt(10) if row_idx % 2 == 1: set_cell_background(cell, 'F1EFE8') if col_widths: for row in table.rows: for i, width in enumerate(col_widths): row.cells[i].width = Cm(width) return table # ==================== COVER PAGE ==================== title_p = doc.add_paragraph() title_p.alignment = WD_ALIGN_PARAGRAPH.CENTER title_p.space_before = Pt(120) run = title_p.add_run('6岁儿童英语自主学习工具') run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run.font.size = Pt(28) run.font.bold = True run.font.color.rgb = RGBColor(0x53, 0x4A, 0xB7) subtitle_p = doc.add_paragraph() subtitle_p.alignment = WD_ALIGN_PARAGRAPH.CENTER run = subtitle_p.add_run('用户体验研究报告') run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run.font.size = Pt(20) run.font.color.rgb = RGBColor(0x0F, 0x6E, 0x56) doc.add_paragraph() doc.add_paragraph() # Info box info_items = [ ('研究主题', '本地视频/音频/PDF中英辅导反馈学习工具'), ('研究者', 'UX Researcher'), ('日期', '2026-07-30'), ('研究阶段', '探索性研究 + 概念验证'), ('产品构想', '家长下发本地学习资源,儿童自主完成学习,AI提供中英辅导反馈'), ] for label, value in info_items: p = doc.add_paragraph() p.alignment = WD_ALIGN_PARAGRAPH.CENTER run = p.add_run(f'{label}:{value}') run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run.font.size = Pt(11) run.font.color.rgb = RGBColor(0x5F, 0x5E, 0x5A) doc.add_page_break() # ==================== SECTION 1: RESEARCH OVERVIEW ==================== add_heading_custom('一、研究概述', 1) add_heading_custom('1.1 研究目标', 2) add_para('主要问题:', bold=True) questions = [ '6岁儿童在英语学习过程中面临哪些核心障碍?', '家长在辅导孩子英语学习时的主要痛点是什么?', '如何设计一个让孩子能"自主完成学习"的工具?', '本地视频/音频/PDF资源如何与中英辅导反馈有效结合?', ] for i, q in enumerate(questions, 1): p = doc.add_paragraph(style='List Number') run = p.add_run(q) run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run.font.size = Pt(11) add_para('成功指标:', bold=True) metrics = [ '识别至少8个核心痛点并完成优先级排序', '产出2个核心用户画像', '绘制完整的双用户旅程地图', '形成可执行的产品功能规划', ] for m in metrics: p = doc.add_paragraph(style='List Bullet') run = p.add_run(m) run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run.font.size = Pt(11) add_heading_custom('1.2 研究方法', 2) add_table_from_data( ['方法', '样本量', '目的', '理由'], [ ['家长深度访谈', '8-10人', '理解资源管理、辅导体验、效果评估痛点', '获取深度定性洞察'], ['儿童行为观察', '5-6组', '观察实际学习行为、注意力模式、交互偏好', '儿童无法有效自我表达,需观察法'], ['竞品分析', '8款产品', '了解市场现状和功能差距', '识别差异化机会'], ['问卷调查', '100+份', '验证定性发现的普遍性', '量化痛点发生率'], ], [3.5, 2, 5, 5] ) add_heading_custom('1.3 参与者标准', 2) add_para('家长参与者:', bold=True) parent_criteria = [ '有3-7岁孩子的家长,孩子正在或即将开始英语启蒙', '过去3个月内使用过至少2种英语学习资源', '双职工家庭优先(时间约束更明显)', ] for c in parent_criteria: p = doc.add_paragraph(style='List Bullet') run = p.add_run(c) run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run.font.size = Pt(11) add_para('儿童观察对象:', bold=True) child_criteria = [ '5-7岁,处于英语启蒙阶段', '有基本的平板/手机操作能力', '排除有特殊教育需求的儿童', ] for c in child_criteria: p = doc.add_paragraph(style='List Bullet') run = p.add_run(c) run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run.font.size = Pt(11) add_heading_custom('1.4 研究局限', 2) add_para('本研究基于行业最佳实践和已有研究数据综合分析,尚未进行实地调研。6岁儿童的用户画像基于发展心理学研究和教育产品行业数据构建。建议在概念原型完成后进行可用性测试验证。') doc.add_page_break() # ==================== SECTION 2: USER PERSONAS ==================== add_heading_custom('二、用户画像', 1) add_heading_custom('2.1 儿童画像:小乐(主要用户)', 2) add_para('人口统计', bold=True, color=RGBColor(0x53, 0x4A, 0xB7)) add_table_from_data( ['属性', '描述'], [ ['年龄', '6岁'], ['教育', '幼儿园大班/小学一年级'], ['数字素养', '能独立操作平板基础功能(点选、滑动、返回)'], ], [3, 13] ) add_para('行为模式', bold=True, color=RGBColor(0x53, 0x4A, 0xB7)) add_table_from_data( ['维度', '特征'], [ ['注意力时长', '单次集中注意力8-12分钟,需分段式学习设计'], ['学习偏好', '视觉+听觉双通道学习者,需要动手操作来维持专注'], ['决策因素', '"好玩"优先于"有用",即时奖励是核心驱动力'], ['情感特征', '对动画角色有强烈情感投射,容易被鼓励性语言激励'], ], [3, 13] ) add_para('核心痛点', bold=True, color=RGBColor(0x53, 0x4A, 0xB7)) add_table_from_data( ['编号', '痛点', '影响', '频率'], [ ['P1', '看不懂文字指令', '极高', '每次使用'], ['P2', '无人即时纠正发音', '极高', '经常'], ['P3', '遇到困难无人求助', '高', '经常'], ], [1.5, 7, 2, 3] ) add_para('使用场景', bold=True, color=RGBColor(0x53, 0x4A, 0xB7)) add_table_from_data( ['维度', '描述'], [ ['环境', '家中,平板为主要设备'], ['时段', '放学后17:00-18:00 或 睡前20:00-20:30'], ['干扰', '玩具、电视、兄弟姐妹争抢设备'], ['家长状态', '可能在做饭/工作,无法实时陪伴'], ], [3, 13] ) add_para('能力边界', bold=True, color=RGBColor(0x53, 0x4A, 0xB7)) add_para('能独立完成: 跟读、点选操作、简单的拖拽') add_para('不能独立完成: 阅读理解、复杂导航、文字输入') p = doc.add_paragraph() p.style = doc.styles['Intense Quote'] if 'Intense Quote' in [s.name for s in doc.styles] else doc.styles['Normal'] run = p.add_run('"妈妈说学完就可以看动画片,但我不知道还要学多久,有时候听不懂它在说什么,也不知道我读得对不对..."') run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run.font.italic = True run.font.size = Pt(11) run.font.color.rgb = RGBColor(0x53, 0x4A, 0xB7) doc.add_paragraph() add_heading_custom('2.2 家长画像:王妈妈(次要用户)', 2) add_para('人口统计', bold=True, color=RGBColor(0x53, 0x4A, 0xB7)) add_table_from_data( ['属性', '描述'], [ ['年龄', '30-35岁'], ['家庭', '双职工,有一个6岁孩子'], ['数字素养', '中高级,熟练使用各类App'], ], [3, 13] ) add_para('行为模式', bold=True, color=RGBColor(0x53, 0x4A, 0xB7)) add_table_from_data( ['维度', '特征'], [ ['可用时间', '工作日晚间碎片化,周末相对完整'], ['资源获取', '微信群分享、网盘下载、App购买'], ['决策因素', '内容质量、难度匹配、孩子兴趣'], ['管理需求', '对"学习效果可量化"有强需求'], ], [3, 13] ) add_para('核心痛点', bold=True, color=RGBColor(0x53, 0x4A, 0xB7)) add_table_from_data( ['编号', '痛点', '影响', '频率'], [ ['P4', '资源分散难管理', '高', '经常'], ['P5', '无法评估学习效果', '高', '经常'], ['P6', '辅导能力有限(发音不标准)', '中高', '经常'], ], [1.5, 7, 2, 3] ) add_para('成功标准', bold=True, color=RGBColor(0x53, 0x4A, 0xB7)) add_para('资源5分钟内完成下发 | 孩子能独立完成80%学习任务 | 家长可查看学习报告') p = doc.add_paragraph() run = p.add_run('"我手机里存了一堆英语启蒙视频和PDF,但每次给孩子看都得翻半天。而且他看完了我也不知道学没学会,我又没时间一直陪着..."') run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run.font.italic = True run.font.size = Pt(11) run.font.color.rgb = RGBColor(0x53, 0x4A, 0xB7) doc.add_page_break() # ==================== SECTION 3: USER JOURNEY ==================== add_heading_custom('三、用户旅程地图', 1) add_heading_custom('3.1 旅程阶段概览', 2) add_para('整个学习旅程分为5个阶段,家长和儿童在各自轨道上并行运作:') add_table_from_data( ['阶段', '家长行为', '儿童行为', '家长情绪', '儿童情绪'], [ ['1.资源准备', '收集视频/音频/PDF', '(未参与)', '焦虑', '—'], ['2.课件下发', '选择当天课件推送到平板', '被叫来学习,打开设备', '焦虑→不确定', '不情愿'], ['3.自主学习', '偶尔检查进度', '看视频/听音频/跟读', '不确定', '有兴趣(高峰)'], ['4.辅导反馈', '被叫去纠正发音/解释', '尝试跟读,不知道对不对', '焦虑(谷底)', '挫败(谷底)'], ['5.效果回顾', '问"学完了没"', '完成任务,等表扬', '困惑', '期待'], ], [2.5, 4, 4, 2.5, 2.5] ) add_heading_custom('3.2 关键洞察', 2) insights = [ ('最大的情绪低谷出现在"辅导反馈"阶段', '孩子挫败、家长焦虑同时发生。这正是"中英辅导反馈"功能需要解决的核心问题:用AI替代家长即时辅导角色。'), ('"效果回顾"阶段的信息真空', '家长困惑于"学没学会",孩子不知道"学了多少"。需要通过学习报告和数据看板来填补。'), ('"自主学习"阶段是情绪高峰', '孩子在看视频/听音频时最有兴趣,但注意力容易跑偏。需要在内容中嵌入互动节点维持专注。'), ('"课件下发"阶段的摩擦', '家长手动操作繁琐,孩子找不到内容。需要极简的下发流程和图标化的儿童端展示。'), ] for i, (title, desc) in enumerate(insights, 1): p = doc.add_paragraph() run = p.add_run(f'{i}. {title}') run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run.font.bold = True run.font.size = Pt(11) run.font.color.rgb = RGBColor(0x53, 0x4A, 0xB7) p2 = doc.add_paragraph() p2.paragraph_format.left_indent = Cm(1) run2 = p2.add_run(desc) run2.font.name = 'Microsoft YaHei' run2.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run2.font.size = Pt(11) doc.add_page_break() # ==================== SECTION 4: PAIN POINT ANALYSIS ==================== add_heading_custom('四、痛点分析', 1) add_heading_custom('4.1 痛点清单与优先级', 2) add_table_from_data( ['编号', '痛点', '用户', '影响度', '频率', '优先级'], [ ['P1', '看不懂文字指令', '儿童', '9', '9', 'P0-紧急'], ['P2', '无人即时纠正发音', '儿童', '9', '8', 'P0-紧急'], ['P3', '遇到困难无人求助', '儿童', '8', '7', 'P1-高'], ['P4', '资源分散难管理', '家长', '7', '8', 'P1-高'], ['P5', '无法评估学习效果', '家长', '8', '6', 'P1-高'], ['P6', '辅导能力有限', '家长', '7', '7', 'P2-中'], ['P7', '注意力容易分散', '儿童', '6', '9', 'P2-中'], ['P8', '学习动力不足', '儿童', '6', '7', 'P2-中'], ], [1.2, 5, 1.5, 1.5, 1.5, 2.5] ) add_heading_custom('4.2 痛点-解决方案映射', 2) add_table_from_data( ['痛点', '解决方案', '对应功能模块', '优先级'], [ ['P1 看不懂文字', '图标化界面+语音引导+动画提示', '儿童端-图标化学习首页', 'MVP'], ['P2 无人纠正发音', 'AI语音识别+发音评分+即时反馈', '儿童端-AI辅导引擎', 'MVP'], ['P3 遇困无人求助', '智能提示+"求助"按钮(一键呼叫家长)', '儿童端-辅导引擎', 'MVP'], ['P4 资源分散', '统一资源管理中心,支持视频/音频/PDF', '家长端-资源管理中心', 'MVP'], ['P5 效果难评估', '学习数据看板+完成率/跟读评分/报告', '家长端-学习效果看板', 'MVP'], ['P6 辅导能力有限', 'AI替代家长辅导,标准发音示范', '儿童端-AI辅导引擎', 'MVP'], ['P7 注意力分散', '分段式学习(8分钟/段)+互动节点', '儿童端-播放器', 'V2'], ['P8 动力不足', '游戏化激励(星星/角色成长/进度地图)', '儿童端-游戏化系统', 'V2'], ], [3, 5, 4.5, 1.5] ) doc.add_page_break() # ==================== SECTION 5: DESIGN RECOMMENDATIONS ==================== add_heading_custom('五、产品设计建议', 1) add_heading_custom('5.1 核心设计原则', 2) principles = [ ('零文字依赖原则', '儿童端界面不依赖任何文字,所有指令通过图标、动画和语音传达。6岁儿童的识字量不足以支撑文字导航。'), ('8分钟分段原则', '每个学习单元控制在8分钟以内,匹配6岁儿童的注意力时长。单元之间设置互动休息环节。'), ('即时反馈原则', '每一次跟读、点选操作必须在500ms内给出反馈。正向反馈优先,纠正反馈温和。'), ('家长可观测原则', '所有学习行为产生可量化数据,家长端实时可见。消除"不知道学没学会"的信息真空。'), ('离线优先原则', '本地资源本地播放,AI辅导支持离线基础功能,确保无网络环境下也能完成核心学习流程。'), ] for i, (title, desc) in enumerate(principles, 1): p = doc.add_paragraph() run = p.add_run(f'{i}. {title}') run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run.font.bold = True run.font.size = Pt(11) run.font.color.rgb = RGBColor(0x0F, 0x6E, 0x56) p2 = doc.add_paragraph() p2.paragraph_format.left_indent = Cm(1) run2 = p2.add_run(desc) run2.font.name = 'Microsoft YaHei' run2.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run2.font.size = Pt(11) add_heading_custom('5.2 家长端功能规划', 2) add_para('5.2.1 资源管理中心', bold=True, color=RGBColor(0x53, 0x4A, 0xB7)) features = [ '本地导入: 支持视频(mp4/mov/avi)、音频(mp3/wav/m4a)、PDF格式一键导入', '自动识别: 系统自动识别文件格式并分类存储', '标签管理: 家长可手动添加难度标签和主题标签', '中英字幕关联: 视频资源可关联SRT字幕文件,系统自动匹配中英双语', ] for f in features: p = doc.add_paragraph(style='List Bullet') run = p.add_run(f) run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run.font.size = Pt(11) add_para('5.2.2 课件下发引擎', bold=True, color=RGBColor(0x53, 0x4A, 0xB7)) features = [ '任务包组合: 选择1-3个资源组成每日学习任务包', '学习计划: 设定每日学习时长(建议15-25分钟)和内容顺序', '一键推送: 选好资源后一键推送到儿童端设备', '定时下发: 支持设定固定学习时间自动推送', ] for f in features: p = doc.add_paragraph(style='List Bullet') run = p.add_run(f) run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run.font.size = Pt(11) add_para('5.2.3 学习效果看板', bold=True, color=RGBColor(0x53, 0x4A, 0xB7)) features = [ '实时进度: 当日任务完成率(已完成/总数)', '跟读评分: 每次跟读的发音准确度评分(1-5星)', '趋势分析: 一周/一月学习时长和评分趋势图', '薄弱标注: 自动识别得分较低的词汇/句子并标注', '周报推送: 每周自动生成学习报告,包含总结和建议', ] for f in features: p = doc.add_paragraph(style='List Bullet') run = p.add_run(f) run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run.font.size = Pt(11) add_para('5.2.4 屏幕时间管理', bold=True, color=RGBColor(0x53, 0x4A, 0xB7)) features = [ '时长上限: 设定每日最大使用时长', '自动提醒: 达到时长上限后儿童端自动提醒休息', '学习/休息循环: 建议每8分钟学习+2分钟休息', ] for f in features: p = doc.add_paragraph(style='List Bullet') run = p.add_run(f) run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run.font.size = Pt(11) add_heading_custom('5.3 儿童端功能规划', 2) add_para('5.3.1 图标化学习首页', bold=True, color=RGBColor(0x0F, 0x6E, 0x56)) features = [ '任务卡片: "今天的学习任务"以大卡片形式展示,配有动画预览', '语音播报: 进入首页自动语音播报"点击这里开始今天的学习吧"', '进度可视化: 已完成/未完成任务用颜色区分(绿色/灰色)', '角色陪伴: 虚拟学习伙伴角色引导全程操作', ] for f in features: p = doc.add_paragraph(style='List Bullet') run = p.add_run(f) run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run.font.size = Pt(11) add_para('5.3.2 多媒体学习播放器', bold=True, color=RGBColor(0x0F, 0x6E, 0x56)) add_para('视频模式:', bold=True) features = [ '中英双语字幕显示', '逐句暂停跟读功能', '点击字幕可重复播放当前句', '长按字幕显示中文翻译', ] for f in features: p = doc.add_paragraph(style='List Bullet 2') run = p.add_run(f) run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run.font.size = Pt(11) add_para('音频模式:', bold=True) features = [ '波形可视化展示', '跟读模式: 播放一句→暂停→录音→对比波形', '循环播放单句', ] for f in features: p = doc.add_paragraph(style='List Bullet 2') run = p.add_run(f) run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run.font.size = Pt(11) add_para('PDF模式:', bold=True) features = [ 'TTS语音朗读(中英双语)', '点击单词即时翻译并朗读', '翻页动画+音效', ] for f in features: p = doc.add_paragraph(style='List Bullet 2') run = p.add_run(f) run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run.font.size = Pt(11) add_para('5.3.3 AI中英辅导引擎', bold=True, color=RGBColor(0x0F, 0x6E, 0x56)) features = [ '语音识别: 识别儿童跟读的英语发音', '发音评分: 对比标准发音,给出1-5星评分', '即时反馈: 5星="Amazing!" + 撒花动画; 3-4星="Good job!" + 星星动画; 1-2星="再试一次吧" + 鼓励动画', '错误纠正: 针对发音错误给出具体提示(如"注意th的发音哦")', '中文解释: 任何不理解的内容,点击"问号"按钮获得中文解释', '求助功能: 点击"呼叫妈妈"按钮,家长端收到通知', ] for f in features: p = doc.add_paragraph(style='List Bullet') run = p.add_run(f) run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run.font.size = Pt(11) add_para('5.3.4 游戏化激励系统', bold=True, color=RGBColor(0x0F, 0x6E, 0x56)) features = [ '星星奖励: 完成任务获得星星,跟读5星额外奖励', '角色成长: 积累星星解锁虚拟角色的新装扮/等级', '进度地图: 学习进度以冒险地图形式展示', '成就徽章: 完成特定挑战获得徽章', ] for f in features: p = doc.add_paragraph(style='List Bullet') run = p.add_run(f) run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run.font.size = Pt(11) add_heading_custom('5.4 技术支撑层', 2) add_table_from_data( ['模块', '关键技术', '性能要求'], [ ['本地文件管理', '文件系统API + 格式解析器', '支持主流格式,导入<3秒'], ['语音识别引擎', '儿童语音模型 + 发音对比算法', '反馈延迟<500ms,准确率>85%'], ['中英翻译服务', '翻译API + TTS双语朗读', '离线基础词库5000+'], ['数据同步', '本地存储 + 家长端推送', '离线优先,联网自动同步'], ], [3.5, 6, 5] ) doc.add_page_break() # ==================== SECTION 6: USABILITY TESTING ==================== add_heading_custom('六、可用性测试方案', 1) add_heading_custom('6.1 测试目标', 2) goals = [ '验证6岁儿童能否独立完成一次完整学习流程(从打开App到完成任务)', '评估家长下发资源的操作效率(目标: 5分钟内完成)', '测试AI辅导反馈的准确性和儿童接受度', ] for g in goals: p = doc.add_paragraph(style='List Bullet') run = p.add_run(g) run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run.font.size = Pt(11) add_heading_custom('6.2 测试协议', 2) add_para('参与者: 6组家庭(家长+6岁儿童)') add_para('任务清单:', bold=True) add_table_from_data( ['任务', '用户', '成功标准', '观察重点'], [ ['T1: 导入3个资源', '家长', '3分钟内完成', '操作步骤数、犹豫点'], ['T2: 组成学习任务并下发', '家长', '2分钟内完成', '理解难度、流程顺畅度'], ['T3: 独立打开并开始学习', '儿童', '1分钟内进入学习', '是否需要家长帮助'], ['T4: 完成视频跟读环节', '儿童', '独立完成3次跟读', '注意力维持、反馈接受'], ['T5: 完成音频跟读环节', '儿童', '独立完成2次跟读', '波形对比理解度'], ['T6: 完成PDF阅读环节', '儿童', '独立翻页+点词翻译', '交互发现率'], ['T7: 查看学习报告', '家长', '理解报告内容', '信息获取效率'], ], [4, 1.5, 3.5, 4] ) add_para('测试指标:', bold=True) add_table_from_data( ['指标', '目标值'], [ ['任务完成率', '>80%'], ['任务完成时间', '记录并优化'], ['错误次数', '记录并减少'], ['儿童满意度', '笑脸量表 1-5分'], ['家长满意度', 'SUS量表'], ], [5, 8] ) doc.add_page_break() # ==================== SECTION 7: SUCCESS METRICS ==================== add_heading_custom('七、成功指标与衡量', 1) add_heading_custom('7.1 量化指标', 2) add_table_from_data( ['指标', '基线', 'MVP目标', 'V2目标'], [ ['儿童独立完成率', '-', '80%', '90%'], ['家长下发耗时', '-', '<5分钟', '<3分钟'], ['跟读反馈延迟', '-', '<500ms', '<300ms'], ['发音评分准确率', '-', '>85%', '>92%'], ['日均学习时长', '-', '15-25分钟', '15-30分钟'], ['周活跃天数', '-', '4天/周', '5天/周'], ['家长NPS', '-', '>40', '>50'], ], [4, 2, 3, 3] ) add_heading_custom('7.2 质性指标', 2) qualitative = [ '儿童主动发起学习行为(非家长催促)', '家长反馈"不再需要全程陪伴"', '儿童跟读信心提升(表现为更愿意开口)', '家长减少其他辅导工具的使用', ] for q in qualitative: p = doc.add_paragraph(style='List Bullet') run = p.add_run(q) run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run.font.size = Pt(11) doc.add_page_break() # ==================== SECTION 8: RISKS ==================== add_heading_custom('八、风险与缓解措施', 1) add_table_from_data( ['风险', '概率', '影响', '缓解措施'], [ ['儿童语音识别准确率不足', '高', '高', '使用儿童专用语音模型,初期宽容度调高'], ['儿童注意力无法维持8分钟', '中', '中', '设计3-5分钟短单元,增加互动频率'], ['家长不信任AI辅导效果', '中', '高', '提供免费试用期,展示对比数据'], ['本地资源格式兼容性问题', '中', '中', '支持主流格式,提供格式转换指南'], ['屏幕时间争议', '低', '中', '内置时长管理,家长完全可控'], ], [5, 1.5, 1.5, 6] ) doc.add_page_break() # ==================== SECTION 9: NEXT STEPS ==================== add_heading_custom('九、下一步建议', 1) add_para('短期(2周内)', bold=True, color=RGBColor(0x53, 0x4A, 0xB7)) short_term = [ '基于本研究结论制作低保真原型', '招募6组家庭进行概念测试', '验证儿童语音识别技术可行性', ] for i, s in enumerate(short_term, 1): p = doc.add_paragraph(style='List Number') run = p.add_run(s) run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run.font.size = Pt(11) add_para('中期(1-2月)', bold=True, color=RGBColor(0x53, 0x4A, 0xB7)) mid_term = [ '开发MVP原型(家长端资源管理 + 儿童端视频跟读 + AI辅导)', '进行2轮可用性测试迭代', '完善语音识别模型在儿童发音场景下的表现', ] for i, m in enumerate(mid_term, 1): p = doc.add_paragraph(style='List Number') run = p.add_run(m) run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run.font.size = Pt(11) add_para('长期(3-6月)', bold=True, color=RGBColor(0x53, 0x4A, 0xB7)) long_term = [ 'V2版本加入游戏化系统和PDF互动功能', '建立长期学习数据追踪体系', '探索AI个性化学习路径推荐', ] for i, l in enumerate(long_term, 1): p = doc.add_paragraph(style='List Number') run = p.add_run(l) run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run.font.size = Pt(11) doc.add_paragraph() doc.add_paragraph() # Footer info p = doc.add_paragraph() p.alignment = WD_ALIGN_PARAGRAPH.CENTER run = p.add_run('研究者: UX Researcher | 研究日期: 2026-07-30 | 下一步: 原型制作与可用性测试') run.font.name = 'Microsoft YaHei' run.element.rPr.rFonts.set(qn('w:eastAsia'), 'Microsoft YaHei') run.font.size = Pt(10) run.font.color.rgb = RGBColor(0x88, 0x87, 0x80) # Save output_path = r'C:\Users\neotao\WorkBuddy\2026-07-30-18-10-00\UX研究报告_6岁儿童英语学习工具.docx' doc.save(output_path) print(f'Document saved to: {output_path}')