- HTML 83%
- Python 16.3%
- JavaScript 0.5%
- CSS 0.2%
| api | ||
| config | ||
| models | ||
| modules | ||
| static | ||
| .gitignore | ||
| generate_2d_scene.py | ||
| generate_3d_scene.py | ||
| generate_article.py | ||
| generate_music.py | ||
| generate_video.py | ||
| homepage_guide.md | ||
| main.py | ||
| README.md | ||
| requirements.txt | ||
MyChinaTravelArticleProduction
项目简介
本项目是一个基于AI能力的内容自动创作平台,专注于中国旅游主题内容的智能化生成。通过整合多种AI技术,实现从文字、音频到视频、交互场景的全方位内容创作能力。
核心定位
AI驱动的中国旅游内容创作引擎
- 降低旅游内容创作门槛
- 提升内容生产效率
- 创新旅游内容呈现形式
- 提供线上途径旅游体验
功能模块
1. AI主题文章生成
- 自动生成中国旅游主题文章
- 支持多种文体风格(攻略、游记、科普等)
- 智能整合景点信息、文化背景、参考文章
- 多语言内容输出能力,文章可选自动配图
示例输出:
- 📄 北京故宫_zh.md - 中文版
- 📄 北京故宫_en.md - 英文版
- 📄 杭州西湖_zh.md - 中文版
- 📄 杭州西湖_en.md - 英文版
2. AI主题音乐生成
- 根据旅游主题和场景,自动创作背景音乐
- 基于确定的输入歌词,生成人声歌曲
- 支持多种音乐风格和情绪表达
- 基于歌曲内容,自动生成配套MV(待实现)
示例输出:
- 🎵 music_20260604_210711.mp3 - 中文歌词生成
- 🎵 music_20260605_103157.mp3 - 英文歌词生成
3. AI主题视频生成
- 基于输入智能生成旅游主题视频
- 智能人物音及环境音融合
- 智能双语字幕生成(待实现)
示例输出:
4. AI可交互2D场景生成
- 生成可交互的2D旅游场景
- 支持用户选择和导航
- 融入故事化元素和互动环节
- 适配多种终端设备
可在项目根目录启动虚拟环境后,运行python generate_2d_scene.py serve并在浏览器直接访问(详情参见Demo4)
| 页面 | 截图1 | 截图2 | 截图3 |
|---|---|---|---|
| 城市主页 | ![]() |
![]() |
![]() |
| 区县冒险页 | ![]() |
![]() |
| |
5. AI可交互3D场景生成
- 构建沉浸式3D旅游环境
- 自由探索和互动体验
- 真实还原场景细节和氛围
可在项目根目录,运行【python main.py serve】启动web服务,然后跳转浏览器可交互访问:
| Park | Valley | |
|---|---|---|
| 深度图 | ![]() |
![]() |
| 3DGS截图 | ![]() |
![]() |
| 浏览器链接 | 点击跳转 | 点击跳转 |
技术架构
本项目采用模块化设计,各AI能力模块可独立调用,也可协同工作,形成完整的内容创作流水线。
快速开始
环境准备
# 1. 创建虚拟环境
python3 -m venv venv
source venv/bin/activate
# 2. 安装依赖
pip install -r requirements.txt
# 3. 配置环境变量(用于云端API,如 OpenRouter)
cp .env.example .env
# 编辑 .env,填入你的 API Key
Demo 1: AI主题文章生成
git方式A:基于参考文章生成(推荐)
将参考文章放在 static/article/input/ 目录下,系统会自动提取主题和格式:
# 使用本地模型(默认 gpt2-chinese-cluecorpussmall)
python generate_article.py -r reference_article.txt
# 或使用云端API(免费,质量更高,推荐 OpenRouter)
# 1. 注册获取 Key: https://openrouter.ai/
# 2. 配置 .env 中的 CLOUD_API_KEY,然后:
python generate_article.py -r reference_article.txt -st cloud
# 生成的文章保存在:
# static/article/output/[主题].md
方式B:指定主题 + 格式模板
当你有明确的主题和格式要求时:
# 提供主题 + 格式模板文件
python generate_article.py -t "北京故宫" -f travel_format.txt -s guide -l long
# 使用云端API(生成质量更高)
python generate_article.py -t "苏州园林" -f format.txt -st cloud
# 生成结果:
# static/article/output/[主题].md
本地模型
本地模型介绍、下载与配置详情请查看 models/README.md。
云端API
使用 OpenRouter 提供的云端模型,需配置 API Key,详见 config/README.md。
输入输出目录
static/article/
├── input/
│ ├── reference_article.txt # 参考文章(自动提取主题和格式)
│ └── travel_format.txt # 格式模板(当不使用参考文章时)
├── output/ # 生成的文章(.md 文件)
└── README.md # 详细使用说明
快速试用提示:
- 默认使用本地模型
- 使用云端API时添加
-st cloud参数 - 详细参数说明:查看
static/article/README.md
Demo 2: AI主题音乐生成
方式A:生成纯音乐
根据风格描述和时长生成纯音乐:
# 生成 30 秒的平静古风音乐
python generate_music.py -p "chinese traditional, guzheng, peaceful" -d 30
# 生成 60 秒的电子音乐
python generate_music.py -p "electronic, synthwave, 80s" -d 60
# 生成结果保存在:
# static/music/output/[时间戳].flac 和 .mp3
方式B:生成带歌词的音乐
将歌词文件放在 static/music/input/ 目录下:
# 使用歌词文件生成带人声的音乐
python generate_music.py -p "jpop, city pop, female vocal" -l sample_lyrics.txt -d 60
# 生成结果:
# static/music/output/music_YYYYMMDD_HHMMSS.flac
# static/music/output/music_YYYYMMDD_HHMMSS.mp3
本地模型
音乐生成基于 ACE-Step 1.5 本地模型,安装与配置详情请查看 models/README.md。
云端API
本模块当前基于本地模型,不支持云端API。
输入输出目录
static/music/
├── input/
│ ├── sample_lyrics.txt # 歌词文件(可选)
│ └── style_guide.txt # 风格参考说明
├── output/ # 生成的音乐文件(.flac 和 .mp3)
└── README.md # 详细使用说明
快速试用提示:
- 默认同时生成
.flac(无损)和.mp3(压缩)两种格式 -p提示词决定音乐风格,用英文描述效果更好-l歌词文件为可选,省略时生成纯音乐- 详细参数说明:查看
static/music/README.md
Demo 3: AI主题视频生成
方式A:直接输入提示词生成
根据提示词直接生成视频:
# 生成 5 秒动漫风格视频(需配置阿里云百炼 API Key,详见 config/README.md)
python generate_video.py -p "动漫风格的窈窕青春美少女在上海外滩向大家打招呼" -d 5 -r 720P
# 生成 10 秒风景视频
python generate_video.py -p "beautiful sunset over the Great Wall of China" -d 10 -r 1080P
# 生成结果保存在:
# static/video/output/video_YYYYMMDD_HHMMSS.mp4
方式B:使用提示词文件生成
将提示词放在 static/video/input/ 目录下:
# 使用提示词文件
python generate_video.py -f anime_girl.txt
# 生成结果:
# static/video/output/video_YYYYMMDD_HHMMSS.mp4
本地模型
本模块基于云端API,不支持本地模型。
云端API
使用阿里云百炼提供的文生视频模型,需配置 API Key,详见 config/README.md。
输入输出目录
static/video/
├── input/
│ ├── anime_girl.txt # 提示词文件(可选)
│ └── prompt_guide.txt # 提示词编写指南
├── output/ # 生成的视频文件(.mp4)
└── README.md # 详细使用说明
快速试用提示:
-p提示词直接描述视频内容,越详细效果越好-d时长支持:2/5/10/15 秒-r分辨率支持:720P(标清)、1080P(高清)- 任务提交后需等待 1-5 分钟生成时间
- 详细参数说明:查看
static/video/README.md
Demo 4: AI 2D城市地图站生成
自动生成可交互的城市旅游地图网站,包含城市主地图和各区县冒险子页面。
完整流程(以上海市为例)
Step 1: 下载 OSM 地图数据
# 下载上海市的 OSM 数据(道路、建筑、景点等)
python generate_2d_scene.py download -c "上海市"
# 可以随时运行指令检查数据完整程度
python generate_2d_scene.py download -c "上海市" --check
# 注:由于一次性下载全部模块,失败率较高,可在后续指定-t增量下载完善尚未下载成功的部分
# 1. 增量更新城市boundary信息
python generate_2d_scene.py download -c "昆明市" -t boundary
# 2. 增量更新道路(城市级)
python generate_2d_scene.py download -c "昆明市" -t roads
# 3. 增量更新旅游景点(城市级)
python generate_2d_scene.py download -c "昆明市" -t tourist_attractions
# 4. 增量更新行政区划边界(城市级)
python generate_2d_scene.py download -c "昆明市" -t administrative
# 5. 增量更新城市基底(默认按城市边界下载;多 tag 合并)
python generate_2d_scene.py download -c "昆明市" -t city_base
# 数据保存到:
# static/scene_2d/input/上海市/
# ├── osm_data_上海市_YYYYMMDD_HHMMSS.json # 全市 OSM 数据
# └── osm_data_city_base_上海市-*.json # 各区县城市基底数据
Step 2: 生成区县边界数据(依赖 Step 1)
# 从 OSM 数据中提取区县边界信息
python generate_2d_scene.py district -c "上海市"
# 生成结果:
# static/scene_2d/input/上海市/districts.json
Step 3: 生成景点 POI 数据(依赖 Step 1)
# 从 OSM 数据中提取旅游景点信息
python generate_2d_scene.py location -c "上海市"
# 生成结果:
# static/scene_2d/input/上海市/locations.csv
Step 4: 生成城市主地图(依赖 Step 2、Step 3)
# 生成城市主页 index.html(含高德瓦片底图 + 区县列表 + 景点标记)
python generate_2d_scene.py generate --index -c "上海市"
# 生成结果:
# static/scene_2d/output/上海市/index.html
Step 5: 生成区县冒险子页面(依赖 Step 2、Step 3)
# 批量生成所有区县子页面
python generate_2d_scene.py generate --district -c "上海市"
# 或只生成单个区县
python generate_2d_scene.py generate --district -c "上海市" --name "黄浦区"
# 生成结果:
# static/scene_2d/output/上海市/
# ├── index.html # 城市主地图
# ├── 黄浦区.html # 黄浦区冒险地图
# ├── 徐汇区.html # 徐汇区冒险地图
# ├── ...
# └── _data/ # 各区县地理数据
Step 6: 启动本地服务预览(依赖 Step 4、Step 5)
# 在项目根目录启动预览服务(端口 9000)
python generate_2d_scene.py serve
# 在浏览器中访问首页:
# http://localhost:9000/
# 首页包含城市选择下拉列表,可直接跳转到对应城市页面
本地模型
地图渲染生成部分,主要基于 OpenStreetMap 数据,无需 AI 模型。
冒险流程剧本生成,来自本地大语言模型。
冒险流程素材生成,来自本地文生图模型。
云端API
本模块基于本地处理,不支持云端API。
输入输出目录
static/scene_2d/
├── input/
│ ├── 上海市/ # 城市特定数据目录
│ │ ├── districts.json # 区县边界信息
│ │ ├── locations.csv # 景点 POI 数据
│ │ ├── osm_data_上海市_*.json # OSM 原始数据
│ │ └── osm_data_city_base_*.json # 区县城市基底
│ └── ... # 其他城市数据
├── output/
│ ├── 上海市/ # 城市特定输出目录
│ │ ├── index.html # 城市主地图
│ │ ├── 黄浦区.html # 区县冒险子页面
│ │ ├── 徐汇区.html
│ │ └── _data/ # 各区县 GeoJSON 数据
│ └── ...
├── index_template.html # 主页模板
├── subpage_template_maplibre.html # 区县子页模板
└── README.md # 详细使用说明
快速试用提示:
- 完整流程需依次执行
download→district→location→generate -c参数指定城市名,支持中文城市名(如 "上海市", "北京市", "广州市")- 数据和输出文件会自动按城市分类存放在对应目录下
- 生成的 HTML 可直接在浏览器中打开查看
- 详细参数说明:查看
static/scene_2d/README.md
Demo 5: AI 3D场景页面生成
基于 HY-World 2.0 模型,从输入图像序列生成3D场景(深度图、法线图、点云、高斯溅射),并通过本地服务预览。
完整流程(以 Park 场景为例)
Step 1: 生成3D场景
# 从图像序列生成3D场景(深度、法线、点云、高斯溅射等)
python generate_3d_scene.py -m hyworld2 -t generate_scene --input "static/scene_3d/input/examples/worldrecon/realistic/Park"
# 生成结果保存在:
# static/scene_3d/output/examples/worldrecon/realistic/Park/
# ├── camera_params.json # 相机参数
# ├── gaussians.ply # 高斯溅射点云
# ├── depth/ # 深度图预览
# ├── normal/ # 法线图预览
# ├── points/ # 点云 PLY
# └── trace.json # 执行轨迹
Step 2: 启动本地服务预览
# 在项目根目录启动预览服务(端口 9000)
python generate_2d_scene.py serve
# 在浏览器中访问3D场景输出文件:
# http://localhost:9000/static/scene_3d/output/examples/worldrecon/realistic/Park/
# 如果路径符合Demo4中地点名称的话,可以直接从2D地图跳转(eg:如果static/scene_3d/output/上海市/滴水湖/output.html存在,则2D地图的地点浮窗会出现跳转入口)
本地模型
3D场景生成基于 HY-World 2.0 本地模型(通过 mlx-spatial 在 Mac 上运行),安装与配置详情请查看 models/README.md。
云端API
本模块基于本地模型,不支持云端API。
输入输出目录
static/scene_3d/
├── input/
│ └── examples/worldrecon/realistic/Park/ # 输入图像序列
│ ├── image_0001.jpg
│ ├── image_0002.jpg
│ └── ...
├── output/
│ └── examples/worldrecon/realistic/Park/ # 3D场景输出
│ ├── camera_params.json # 相机参数
│ ├── gaussians.ply # 高斯溅射点云
│ ├── depth/ # 深度图预览
│ │ ├── depth_b00_f000.png
│ │ └── ...
│ ├── normal/ # 法线图预览
│ │ ├── normal_b00_f000.png
│ │ └── ...
│ ├── points/
│ │ └── points.ply # 点云 PLY
│ └── trace.json # 执行轨迹
└── README.md # 详细使用说明
快速试用提示:
-m hyworld2指定使用 HY-World 2.0 模型-t generate_scene指定任务类型为场景生成--input参数指向包含图像序列的目录- 支持
--memory-profile参数(safe/balanced/fast)控制内存使用 - 可通过
--heads参数指定输出头(camera,depth,normal,points,gs) - 详细参数说明:查看
static/scene_3d/README.md
快速命令速查
# === 文章生成 ===
# 基于参考文章(本地模型)
python generate_article.py -r reference_article.txt
# 基于参考文章(云端API)
python generate_article.py -r reference_article.txt -st cloud
# 指定主题和格式
python generate_article.py -t "杭州西湖" -f travel_format.txt -l long
# === 音乐生成 ===
# 生成纯音乐(30秒)
python generate_music.py -p "chinese traditional, peaceful" -d 30
# 生成带歌词的音乐(60秒)
python generate_music.py -p "jpop, city pop, female vocal" -l sample_lyrics.txt -d 60
# === 视频生成 ===
# 基于提示词生成视频(需配置阿里云百炼 API Key,详见 config/README.md)
python generate_video.py -p "动漫风格的窈窕青春美少女在上海外滩向大家打招呼" -d 5 -r 1080P
# 使用提示词文件生成视频
python generate_video.py -f anime_girl.txt
# 查询视频任务状态
python generate_video.py --status task-id-xxx
项目结构
MyChinaTravelArticleProduction/
├── generate_article.py # 文章生成命令行工具
├── generate_music.py # 音乐生成命令行工具
├── generate_video.py # 视频生成命令行工具
├── download_model.py # 模型下载工具
├── modules/ # 核心模块
│ ├── article_generator.py # 文章生成逻辑
│ ├── music_generator.py # 音乐生成逻辑
│ └── video_generator.py # 视频生成逻辑
├── config/ # 配置文件
│ ├── settings.py # 项目配置
│ ├── runninghub_config.json # RunningHub 配置
│ └── README.md # 云端 API 配置详情
├── static/ # 静态资源(输入/输出)
│ ├── article/ # 文章生成的输入输出
│ │ ├── input/ # 参考文章、格式模板
│ │ ├── output/ # 生成的文章
│ │ └── README.md # 详细使用说明
│ ├── music/ # 音乐生成的输入输出
│ │ ├── input/ # 歌词、风格参考
│ │ ├── output/ # 生成的音乐
│ │ └── README.md # 详细使用说明
│ └── video/ # 视频生成的输入输出
│ ├── input/ # 提示词文件
│ ├── output/ # 生成的视频
│ └── README.md # 详细使用说明
│ └── scene_2d/ # AI 2D 旅游地图
│ ├── input/ # locations.csv + districts.json
│ ├── output/ # index.html + 区县子页面
│ ├── _data/昆明市-<区县>/ # 各区县 OSM GeoJSON
│ ├── index_template.html # 主页 Leaflet 模板
│ ├── subpage_template_maplibre.html # 区县子页 MapLibre 模板
│ └── district_adventure_map.md # 区县冒险地图技术方案
├── models/ # 本地模型目录
│ └── README.md # 本地模型下载与配置详情
├── .env # 环境变量配置
├── requirements.txt # 依赖列表
└── README.md # 本文件
开发计划
4. AI 2D 旅游地图生成
生成城市主地图 index.html 和各区县冒险地图子页面。
命令
# 生成城市主地图 index.html
python generate_2d_scene.py generate \
-i static/scene_2d/input/locations.csv \
-d static/scene_2d/input/districts.json \
-o static/scene_2d/output
# 批量生成全部区县子页面
python generate_2d_scene.py generate --district \
-c 昆明市 -d static/scene_2d/input/districts.json \
-o static/scene_2d/output
# 只生成单个区县
python generate_2d_scene.py generate --district \
-c 昆明市 --name 五华区 \
-d static/scene_2d/input/districts.json \
-o static/scene_2d/output
输入 / 模板 / 输出
| 方向 | 文件 | 说明 |
|---|---|---|
| 输入 | static/scene_2d/input/districts.json |
区县列表(id/name/area/经纬度/boundary)+ 全市边界 |
| 输入 | static/scene_2d/input/locations.csv |
景点 POI(district/rating/category/lat/lng/district_rating_rank) |
| 输入 | static/scene_2d/_data/昆明市-<区县>/ |
下载后的区县 OSM GeoJSON(road/building/landuse/park/water/landmarks) |
| 模板 | static/scene_2d/index_template.html |
主页 Leaflet 模板(占位符由 generate_html 替换) |
| 模板 | static/scene_2d/subpage_template_maplibre.html |
区县子页 MapLibre 模板 |
| 输出 | static/scene_2d/output/index.html |
城市主地图(高德瓦片底图 + 16 区县 + Top10 景点 marker) |
| 输出 | static/scene_2d/output/<区县名>.html |
区县冒险地图子页面(MapLibre + 卡通纹理) |
index.html 设计(重要 · 下次修改请先读)
- 技术栈:Leaflet + 高德瓦片底图(
L.tileLayer webrd0{s}.is.autonavi.com)。 - 为什么 roadsData 是空 {}:历史上曾把 osm_data_昆明市_YYYYMMDD.json 的 roads GeoJSON(65MB+)嵌入 index.html,导致最终 HTML 71MB,浏览器 V8 解析耗时 3~5 秒。改为 roads_data = {} 占位符后 71MB -> 1.7MB,高德瓦片已自带路网/绿地/水体/地名,不影响视觉。若以后要手绘路网图层,可在 generate_2d_scene.py 的 _cmd_generate_index 中取消注释路网读取逻辑并在 index_template.html 里恢复 L.geoJSON(roadsData).addTo(map)。
- Header 文案:
🏰 AI 2D HomePage - {city_name_cn}/{city_name_en},城市名由 generate_html 自动推断(city_name_cn <- districts[].id 前缀、city_name_en <- districts.json 的 city_boundary name 属性)。
区县列表(左侧)
-
标题:
🏛️ 区县列表 | Districts (N)。 -
排序优先级(area_rank):由 Python 端和前端 AREA_RANK 常量双重保证一致,顺序是
全市范围 -> 市辖区 -> 县级市 -> 下辖县 -> 自治县同级别内按中文名拼音升序(localeCompare "zh")。
-
每行内容:左侧
🏛️ [area] 区县名 ✅(✅ 表示 output 下存在对应子页面 .html),右侧N 个地点(N = 该区县 Top10 景点 POI 数,从 locations.csv 实时统计)。 -
点击行为:selectedDistrict = did -> 重新渲染区县列表(高亮选中)+ 地点列表(只保留该区县)+ showBoundary(did) 高亮该区县边界 + 地图 flyTo 该区县中心 + 自动弹出 marker popup。
-
易错点(JS 闭包坑):renderDistrictList / renderLocationList 里都用了
for (var i = 0; ...)循环 +var loc = filtered[i]的写法,必须用 IIFE(function(did){...})(d.id)包裹 onclick,否则会被 JS 闭包 bug 坑(点击总是跳到最后一项)。
地点列表(左侧)
- 标题:
📍 地点列表 | Places (N)。 - 未选区县时显示全市 Top10 × 16 区县 ≈ 118 条。选了区县后只显示该区县的 Top10。
- 每行
icon 名称 / ⭐ rating · 类别。点击 -> 地图 flyTo 该点 zoom=14 -> 打开对应 marker popup。
地图
- 高德瓦片(中文标注,style=7),16 个区县 circleMarker(半径 5~14 按面积分级),1 个全市边界 polygon(蓝色虚线),Top10 POI 红色 pin(iconMap 按 type 分类:star/tree/museum/mountain/architecture/food/default)。
- 区县 marker popup:含区县名 + 面积 + 人口 + 描述 + (若 output 下存在该区县子页面 .html)🎮 红色按钮
进入 XX 区 冒险地图-> window.open 打开子页。按钮是否出现由 _scan_district_pages(args.output, districts) 在 generate 命令执行时扫描 output 目录决定。
数据流
Python 端 (_cmd_generate_index)
├── read_locations_csv() -> Top10 筛选 -> loc_counter 统计每区县 location_count
├── read_districts_json() -> 为每个 district 注入 area_rank / location_count
├── generate_html(center, {}, locations, districts, city_boundary, district_pages)
│ └── 读 index_template.html,替换 {{CENTER_LAT}}/{{CENTER_LNG}}/{{ROADS_DATA}}/{{LOCATIONS}}/{{DISTRICTS}}/{{CITY_BOUNDARY}}/{{DISTRICT_PAGES}}
└── 写 output/index.html
前端(index.html 打开后)
├── 同步解析 5 个 var 数据(roadsData = {},其他 < 2MB)
├── L.map -> L.tileLayer(高德) -> 16 区县 marker + 118 POI pin + 边界 polygon
├── renderDistrictList + renderLocationList(点击 -> 重绘)
└── popup 按钮 -> districtPages[did] 存在则 window.open
区县子页:详见 static/scene_2d/district_adventure_map.md。
- 基础框架搭建
- AI文章生成模块
- AI音乐生成模块
- AI视频生成模块
- AI 2D场景生成模块
- AI 3D大世界生成模块
贡献指南
欢迎提交Issue和Pull Request,共同完善本项目。
许可证
(待定)









