春联生成模型-中文-base实操手册:批量生成+导出PDF功能扩展

📅 发布时间:2026/7/8 23:12:41 👁️ 浏览次数:
春联生成模型-中文-base实操手册:批量生成+导出PDF功能扩展
春联生成模型-中文-base实操手册批量生成导出PDF功能扩展1. 引言让AI帮你写春联从单条到批量春节贴春联是咱们的传统习俗。但每年想一副有新意、有文采的对联对很多人来说是个头疼事。要么自己憋半天想不出来要么网上找的千篇一律缺乏个性。现在好了有了AI春联生成模型。你只需要输入两个字的祝福词比如“安康”、“团圆”、“发财”它就能自动帮你生成一副完整的、对仗工整的春联。这解决了“从无到有”的问题。但如果你需要给公司几十个部门、给亲朋好友批量定制春联呢一条一条手动输入、复制、整理效率太低了。或者你想把生成好的春联直接打印出来做成精美的PDF文件方便分发和保存又该怎么办这篇文章就是来解决这些“从有到好”、“从好到高效”的问题。我将手把手带你基于开源的“春联生成模型-中文-base”扩展出两个超级实用的功能批量生成一次性输入多个主题词自动生成多副春联。导出PDF将生成的春联自动排版成美观的、可直接打印的PDF文件。整个过程不需要你精通深度学习只需要会一点基础的Python和命令行操作。我会把每一步都讲清楚并提供完整的、可运行的代码。学完这篇你就能搭建一个属于自己的、功能强大的“AI春联工坊”。2. 环境准备与模型部署在开始扩展功能之前我们得先把基础环境搭好让原始的春联生成模型跑起来。2.1 基础环境检查与启动这个模型基于Gradio构建Web界面用起来很方便。我们先确保基础服务能正常运行。进入项目目录通常模型和相关代码已经放在了一个特定路径下。我们首先导航过去。cd /root/spring_couplet_generation安装依赖检查并安装运行所需的Python包。pip install -r requirements.txt如果requirements.txt文件里已经包含了gradio和modelscope等这一步会帮你装好。如果遇到网络问题可以尝试使用国内镜像源比如加上-i https://pypi.tuna.tsinghua.edu.cn/simple。验证模型路径根据文档模型需要预先下载并放在指定位置。我们确认一下。ls -la /root/ai-models/iic/spring_couplet_generation/你应该能看到类似pytorch_model.bin,config.json这样的模型文件。如果目录是空的你可能需要先按照项目说明下载模型。启动基础服务使用提供的脚本启动。./start.sh或者直接运行Python脚本python3 app.py如果一切顺利你会在终端看到输出表明服务已经在http://localhost:7860启动了。访问测试打开你的浏览器访问http://localhost:7860。你应该能看到一个简单的网页有一个输入框让你写祝福词比如“吉祥”一个提交按钮以及显示生成结果的地方。 尝试输入“如意”点击提交看看是否能成功生成一副春联。如果成功了恭喜你基础环境没问题了2.2 理解原始代码结构为了扩展功能我们需要先看看原来的app.py大概是怎么工作的。不用怕我们只看关键部分。用编辑器打开app.py它的核心结构通常是这样import gradio as gr from modelscope.pipelines import pipeline # ... 可能还有其他导入 # 1. 加载模型 pipe pipeline(text-generation, model/root/ai-models/iic/spring_couplet_generation, devicecpu) # 或 cuda # 2. 定义生成春联的函数 def generate_couplet(keyword): # 这里会构造一个给模型的提示prompt比如“生成关于[keyword]的春联” prompt f上联 # 调用模型 pipeline 生成文本 result pipe(prompt, ...) # 从生成的文本中提取出上联、下联和横批 # ... 处理逻辑 ... return couplet_up, couplet_down, couplet_horizontal # 3. 创建 Gradio 界面 with gr.Blocks() as demo: gr.Markdown(# AI 春联生成器) keyword_input gr.Textbox(label输入两字祝福词) submit_btn gr.Button(提交) up_output gr.Textbox(label上联) down_output gr.Textbox(label下联) horizontal_output gr.Textbox(label横批) # 将按钮点击事件绑定到生成函数 submit_btn.click(fngenerate_couplet, inputskeyword_input, outputs[up_output, down_output, horizontal_output]) # 4. 启动应用 demo.launch(server_name0.0.0.0, server_port7860)理解了这个流程我们就知道要在哪里“动手术”了。核心是那个generate_couplet函数和 Gradio 界面。我们的扩展将围绕它们进行。3. 功能一实现批量春联生成现在我们来解决第一个痛点如何一次性生成多副春联思路很简单我们准备一个包含多个祝福词的列表比如从一个文件里读取或者直接在网页上输入多行文本然后循环调用generate_couplet函数把所有的结果收集起来。3.1 创建批量生成函数我们首先在app.py里添加一个新的函数。这个函数接收一个字符串这个字符串包含多个祝福词用逗号、空格或者换行分隔。def generate_couplets_batch(keywords_text): 批量生成春联 Args: keywords_text: 字符串包含多个祝福词用逗号、空格、换行或分号分隔。 Returns: 一个列表里面每个元素是一个字典包含‘keyword’ ‘上联’ ‘下联’ ‘横批’。 # 1. 分割关键词 # 支持多种分隔符逗号、空格、换行、分号 import re # 使用正则表达式分割字符串 separators r[,\s\n;] keywords [k.strip() for k in re.split(separators, keywords_text) if k.strip()] if not keywords: return [{keyword: 无, 上联: 请输入有效关键词, 下联: , 横批: }] results [] # 2. 循环处理每个关键词 for kw in keywords: try: up, down, horizontal generate_couplet(kw) # 调用原来的单条生成函数 results.append({ keyword: kw, 上联: up, 下联: down, 横联: horizontal # 注意这里键名和之前单条输出可能不同保持统一 }) except Exception as e: # 如果某个词生成失败记录错误信息 results.append({ keyword: kw, 上联: f生成失败: {str(e)}, 下联: , 横联: }) return results代码解释re.split(separators, keywords_text)这是一个灵活的分割方法无论用户用逗号、空格还是换行分隔关键词我们都能正确识别。[k.strip() for k in ... if k.strip()]这行代码做了两件事1) 去掉每个关键词前后的空格2) 过滤掉分割后产生的空字符串。我们循环调用之前写好的generate_couplet函数确保生成逻辑一致。用try...except包裹避免因为某个词生成失败导致整个批量任务崩溃。3.2 在Web界面上添加批量功能光有函数不行我们得让用户能在网页上用。我们需要修改Gradio界面增加一个用于批量输入的文本框和一个显示批量结果的区域。在原来创建界面的代码块里with gr.Blocks() as demo:里面添加以下组件with gr.Blocks() as demo: gr.Markdown(# AI 春联生成器 - 增强版) # 原有的单条生成部分 with gr.Tab(单条生成): # ... 保留原有的 keyword_input, submit_btn, up_output 等组件和绑定逻辑 ... # 为了清晰我们假设原有代码在这里 pass # 新增的批量生成部分 with gr.Tab(批量生成): gr.Markdown(### 批量生成春联) gr.Markdown(在下方输入多个祝福词用逗号、空格或换行分隔。例如吉祥, 如意, 安康, 发财) batch_keyword_input gr.Textbox( label输入多个祝福词, placeholder例如吉祥, 如意, 安康\n或每行一个词, lines5 ) batch_submit_btn gr.Button(批量生成, variantprimary) # 用一个JSON组件或者Dataframe来展示结构化的批量结果会更美观 batch_output gr.JSON(label生成结果) # Gradio的JSON组件可以漂亮地显示字典列表 # 绑定批量生成函数到按钮 batch_submit_btn.click( fngenerate_couplets_batch, inputsbatch_keyword_input, outputsbatch_output )关键点我们使用了gr.Tab()来创建标签页这样“单条生成”和“批量生成”功能可以互不干扰界面更清爽。batch_keyword_input的lines5属性让它变成一个多行文本框方便输入。gr.JSON()组件非常适合展示我们函数返回的“字典列表”这种结构它会自动格式化成可折叠展开的树状结构查看非常方便。现在重启你的应用 (python3 app.py)刷新页面你应该能看到一个“批量生成”的标签页。在里面输入“平安, 喜乐, 富贵”点击“批量生成”就能一次性得到三副春联了4. 功能二实现春联导出为PDF批量生成的结果很好但如果能直接导出成一个漂亮的、能打印的文件那就更完美了。接下来我们实现PDF导出功能。4.1 安装PDF生成库Python里生成PDF的库很多比如ReportLab、FPDF、WeasyPrint需要HTML转PDF等。这里我们选用一个简单易上手的FPDF。首先安装它pip install fpdf4.2 创建PDF生成函数我们在app.py里再添加一个函数它接收我们批量生成的结果那个字典列表然后生成一个PDF文件。from fpdf import FPDF import os import tempfile def generate_pdf(couplets_data): 将春联数据生成PDF文件 Args: couplets_data: 列表格式同 generate_couplets_batch 的返回结果。 Returns: 生成的PDF文件的临时路径。 if not couplets_data: # 如果没有数据生成一个提示PDF couplets_data [{keyword: 无数据, 上联: 未生成任何春联, 下联: , 横联: }] # 创建一个FPDF对象使用A4纸单位毫米 pdf FPDF(orientationP, unitmm, formatA4) pdf.add_page() pdf.add_font(SimSun, , /usr/share/fonts/truetype/wqy/wqy-microhei.ttc, uniTrue) # 添加中文字体路径需根据系统调整 pdf.set_font(SimSun, size16) # 添加标题 pdf.cell(0, 20, txtAI生成春联集锦, lnTrue, alignC) pdf.ln(10) # 换行 pdf.set_font(SimSun, size12) for i, item in enumerate(couplets_data, 1): keyword item.get(keyword, ) up item.get(上联, ) down item.get(下联, ) horizontal item.get(横联, ) # 写入一个春联单元 pdf.cell(0, 10, txtf第{i}组 - 主题【{keyword}】, lnTrue) pdf.set_font(SimSun, size14) pdf.cell(0, 10, txtf上联{up}, lnTrue) pdf.cell(0, 10, txtf下联{down}, lnTrue) pdf.cell(0, 10, txtf横批{horizontal}, lnTrue, alignC) pdf.set_font(SimSun, size12) pdf.ln(15) # 每组春联后空行 # 创建临时文件保存PDF temp_file tempfile.NamedTemporaryFile(deleteFalse, suffix.pdf) pdf_path temp_file.name pdf.output(pdf_path) temp_file.close() return pdf_path代码解释与注意事项中文字体这是生成中文PDF最关键也最容易出错的一步。pdf.add_font(...)这行代码指定了中文字体文件的路径。示例中的路径/usr/share/fonts/truetype/wqy/wqy-microhei.ttc是Linux系统中文泉驿微米黑字体的常见位置。你需要根据你的实际系统环境调整这个路径。如何找字体在Linux终端可以用fc-list :langzh命令查找已安装的中文字体路径。备用方案你可以将一个中文字体文件如simsun.ttc,simhei.ttf放到项目目录下然后使用相对路径如./simsun.ttc。布局我们使用cell和ln方法来控制文本位置和换行。alignC表示居中。临时文件我们使用tempfile.NamedTemporaryFile来创建一个临时的PDF文件。deleteFalse参数确保文件不会被自动删除因为我们需要返回它的路径供Gradio下载。后续可能需要考虑清理这些临时文件。4.3 在界面上添加PDF导出按钮现在我们需要把PDF生成功能和批量生成的结果关联起来并提供一个下载按钮。修改“批量生成”标签页下的代码with gr.Tab(批量生成): gr.Markdown(### 批量生成春联) gr.Markdown(在下方输入多个祝福词用逗号、空格或换行分隔。例如吉祥, 如意, 安康, 发财) batch_keyword_input gr.Textbox(...) # 同上 batch_submit_btn gr.Button(批量生成, variantprimary) batch_output gr.JSON(label生成结果) # 新增PDF导出区域 gr.Markdown(---) gr.Markdown(### 导出为PDF) pdf_generate_btn gr.Button(生成PDF文件) pdf_download gr.File(label下载PDF, interactiveFalse) # 先设置为不可交互生成后才有文件 # 绑定函数 # 定义一个中间函数它先批量生成再生成PDF最后返回PDF文件路径和批量结果 def batch_then_pdf(keywords_text): batch_results generate_couplets_batch(keywords_text) pdf_path generate_pdf(batch_results) return pdf_path, batch_results # 点击“批量生成”按钮只更新JSON结果 batch_submit_btn.click( fngenerate_couplets_batch, inputsbatch_keyword_input, outputsbatch_output ) # 点击“生成PDF文件”按钮更新JSON结果和文件下载组件 pdf_generate_btn.click( fnbatch_then_pdf, # 使用新的组合函数 inputsbatch_keyword_input, outputs[pdf_download, batch_output] # 注意输出顺序第一个给File组件第二个给JSON组件 )关键点我们新增了一个pdf_generate_btn按钮和一个gr.File()下载组件。创建了一个新的函数batch_then_pdf它把“批量生成”和“PDF生成”两个步骤串联起来并返回PDF文件路径和批量结果。将pdf_generate_btn的点击事件绑定到这个组合函数。它的输出同时更新pdf_download文件和batch_outputJSON预览。这样用户点击“生成PDF文件”后既能预览结果又能直接下载排版好的PDF。现在重启应用在批量生成页面输入几个词点击“生成PDF文件”稍等片刻下方就会出现一个下载链接点击即可保存生成的春联集锦.pdf。5. 完整代码整合与优化建议为了方便你直接使用这里提供一个整合了所有功能的app.py核心代码框架。你需要将其与原始模型加载部分结合。import gradio as gr from modelscope.pipelines import pipeline from fpdf import FPDF import tempfile import re import os # 1. 加载原始模型 pipe pipeline(text-generation, model/root/ai-models/iic/spring_couplet_generation, devicecpu) # 2. 核心函数定义 def generate_couplet(keyword): 原始单条生成函数 (根据你的实际模型调整prompt和解析逻辑) # 这里需要你根据实际模型调整提示词和结果解析方式 # 假设模型直接返回拼接好的字符串如“上联... 下联... 横批...” prompt f生成关于{keyword}的春联 # 调用模型这里需要你根据实际pipeline的返回值调整 generated_text pipe(prompt, max_length100, do_sampleTrue)[0][generated_text] # 解析 generated_text提取上联、下联、横批 # 这是一个示例解析逻辑你需要根据模型实际输出修改 lines generated_text.split(\n) up_line lines[0].replace(上联, ).strip() if len(lines) 0 else down_line lines[1].replace(下联, ).strip() if len(lines) 1 else horizontal lines[2].replace(横批, ).strip() if len(lines) 2 else return up_line, down_line, horizontal def generate_couplets_batch(keywords_text): 批量生成函数 separators r[,\s\n;] keywords [k.strip() for k in re.split(separators, keywords_text) if k.strip()] if not keywords: return [{keyword: 无, 上联: 请输入有效关键词, 下联: , 横联: }] results [] for kw in keywords: try: up, down, horizontal generate_couplet(kw) results.append({keyword: kw, 上联: up, 下联: down, 横联: horizontal}) except Exception as e: results.append({keyword: kw, 上联: f生成失败, 下联: str(e), 横联: }) return results def generate_pdf(couplets_data): PDF生成函数 pdf FPDF() pdf.add_page() # !!! 重要设置正确的中文字体路径 !!! font_path /usr/share/fonts/truetype/wqy/wqy-microhei.ttc # 请修改为你的字体路径 if os.path.exists(font_path): pdf.add_font(SimSun, , font_path, uniTrue) pdf.set_font(SimSun, size16) else: pdf.set_font(Arial, size16) # 备选英文字体 pdf.cell(0, 20, txtAI生成春联集锦, lnTrue, alignC) pdf.ln(10) if pdf.font_family SimSun: pdf.set_font(SimSun, size12) else: pdf.set_font(Arial, size12) for i, item in enumerate(couplets_data, 1): kw item.get(keyword, ) up item.get(上联, ) down item.get(下联, ) hor item.get(横联, ) pdf.cell(0, 10, txtf第{i}组 - 主题【{kw}】, lnTrue) if pdf.font_family SimSun: pdf.set_font(SimSun, size14) else: pdf.set_font(Arial, size14) pdf.cell(0, 10, txtf上联{up}, lnTrue) pdf.cell(0, 10, txtf下联{down}, lnTrue) pdf.cell(0, 10, txtf横批{hor}, lnTrue, alignC) if pdf.font_family SimSun: pdf.set_font(SimSun, size12) else: pdf.set_font(Arial, size12) pdf.ln(15) temp_file tempfile.NamedTemporaryFile(deleteFalse, suffix.pdf) pdf_path temp_file.name pdf.output(pdf_path) temp_file.close() return pdf_path def batch_then_pdf(keywords_text): 组合函数批量生成 - 生成PDF batch_results generate_couplets_batch(keywords_text) pdf_path generate_pdf(batch_results) return pdf_path, batch_results # 3. 构建Gradio界面 with gr.Blocks(titleAI春联生成器-增强版, themegr.themes.Soft()) as demo: gr.Markdown(# AI 春联生成器 - 增强版 (批量生成 PDF导出)) with gr.Tab( 单条生成): gr.Markdown(### 输入一个祝福词生成一副春联) with gr.Row(): with gr.Column(scale1): single_keyword gr.Textbox(label两字祝福词, placeholder例如吉祥) single_btn gr.Button(生成, variantprimary) with gr.Column(scale2): single_up gr.Textbox(label上联, interactiveFalse) single_down gr.Textbox(label下联, interactiveFalse) single_hor gr.Textbox(label横批, interactiveFalse) single_btn.click(fngenerate_couplet, inputssingle_keyword, outputs[single_up, single_down, single_hor]) with gr.Tab( 批量生成与导出): gr.Markdown(### 一次性生成多副春联并可导出为PDF) with gr.Row(): with gr.Column(): batch_input gr.Textbox(label输入多个祝福词, placeholder例如吉祥, 如意, 安康\n或每行一个词, lines6) with gr.Row(): batch_btn gr.Button(批量生成, variantprimary) pdf_btn gr.Button(生成并导出PDF, variantsecondary) with gr.Column(): batch_output gr.JSON(label生成结果预览) pdf_download gr.File(label下载PDF文件, interactiveFalse) batch_btn.click(fngenerate_couplets_batch, inputsbatch_input, outputsbatch_output) pdf_btn.click(fnbatch_then_pdf, inputsbatch_input, outputs[pdf_download, batch_output]) gr.Markdown(---) gr.Markdown(**使用提示**批量生成时关键词用逗号、空格或换行分隔。导出PDF前请确保系统已安装中文字体。) # 4. 启动应用 if __name__ __main__: demo.launch(server_name0.0.0.0, server_port7860, shareFalse)你需要做的调整模型加载和generate_couplet函数这部分代码高度依赖于你使用的具体模型达摩院PALM。上面的generate_couplet函数是一个占位符。你必须根据模型的实际调用方式、输入提示词格式和输出文本格式来重写这个函数的内部逻辑。这是整个项目能工作的前提。中文字体路径将font_path变量修改为你系统上真实存在的中文字体文件路径。依赖安装确保已安装gradio,modelscope,fpdf。6. 总结与扩展思路通过以上步骤我们成功地将一个基础的AI春联生成模型扩展成了一个具备批量处理和PDF导出能力的实用工具。整个过程我们聚焦于工程落地提供了每一步的代码和解释。回顾一下我们实现的核心功能批量生成通过一个灵活的分词函数和循环调用实现了对多个主题词的并行实际上是串行处理并将结果以结构化的JSON格式展示。PDF导出利用FPDF库将结构化的春联数据自动排版成格式规范、包含中文的PDF文档并集成到Web界面中提供一键下载。你可以进一步扩展的方向异步生成优化目前的批量生成是顺序执行的如果词很多会有点慢。可以考虑用asyncio或线程池进行并发请求大幅提升速度。PDF模板美化现在的PDF排版比较基础。你可以设计更精美的模板比如加入红色背景、书法字体、边框图案让生成的PDF更像真正的春联纸。结果后处理对AI生成的对联进行简单的平仄、对仗检查或者提供一个“换一换”按钮对不满意的单条结果重新生成。历史记录与收藏增加数据库让用户可以保存自己生成过的春联。部署与分享使用Gradio的shareTrue参数创建一个临时公网链接或者将应用部署到服务器方便朋友同事一起使用。这个项目展示了如何围绕一个核心AI模型通过简单的编程构建出更贴合实际需求的应用层功能。希望这个实操手册能帮你快速上手也激发你更多的创意。动手试试吧定制一份独一无二的AI春联大礼包获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。