diff --git a/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/ollama/docker-compose.yml b/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/ollama/docker-compose.yml index 2dc3602c..c8bb8ed1 100644 --- a/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/ollama/docker-compose.yml +++ b/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/ollama/docker-compose.yml @@ -13,11 +13,11 @@ services: - OLLAMA_HOST=0.0.0.0 volumes: - ollama-data:/root/.ollama - # 小模型 1.5b 约 1GB,3b 约 2GB,按需调整内存限制 + # 推荐跑 qwen2.5:3b(约 2GB),3b 需约 3GB 运行内存,故限 5G deploy: resources: limits: - memory: 4G + memory: 5G volumes: ollama-data: diff --git a/01_卡资(金)/金仓_存储备份/群晖NAS管理/参考资料/NAS千问小模型API配置.md b/01_卡资(金)/金仓_存储备份/群晖NAS管理/参考资料/NAS千问小模型API配置.md index 83f53d66..18a70fae 100644 --- a/01_卡资(金)/金仓_存储备份/群晖NAS管理/参考资料/NAS千问小模型API配置.md +++ b/01_卡资(金)/金仓_存储备份/群晖NAS管理/参考资料/NAS千问小模型API配置.md @@ -1,11 +1,56 @@ # 公司 NAS 千问小模型 API 配置说明 > 部署位置:公司 NAS Docker(ollama-nas 容器) -> 模型:qwen2.5:1.5b > 内网/外网均可调用,无需 API Key --- +## 公司 NAS 配置与推荐模型 + +| 项目 | 说明 | +|------|------| +| **型号** | Synology DS1825+ | +| **CPU** | AMD Ryzen Embedded V1500B(4 核 8 线程) | +| **内存** | 8GB;Ollama 容器限制 5GB | +| **推荐模型** | **qwen2.5:3b**(效果更好,约 2GB,适合 5GB 内存) | +| **备选模型** | qwen2.5:1.5b(更省内存,约 1GB) | + +已在 NAS 上安装 **qwen2.5:3b** 作为默认推荐,其他终端/应用直接选用该模型即可。 + +--- + +## 零、配置到其他地方的速查(复制即用) + +| 配置项 | 外网(推荐) | 内网(与 NAS 同网时) | +|--------|--------------|------------------------| +| **BASE URL** | `http://open.quwanzhi.com:11401` | `http://192.168.1.201:11434` | +| **OpenAI 兼容 Base URL** | `http://open.quwanzhi.com:11401/v1` | `http://192.168.1.201:11434/v1` | +| **API Key** | 无需,可填 `ollama` 占位 | 同上 | +| **推荐模型** | `qwen2.5:3b` | 同上 | +| **备选模型** | `qwen2.5:1.5b` | 同上 | + +- **进程**:Docker 容器名 `ollama-nas`,镜像 `ollama/ollama:latest`,端口 11434。 +- **编排路径**:`/volume1/docker/ollama/docker-compose.yml`。 +- **启动/重启**:NAS 上 `sudo docker compose -f /volume1/docker/ollama/docker-compose.yml up -d` 或 `sudo docker start ollama-nas`。 + +### 在 OpenAI 兼容客户端中填写示例 + +- **Base URL**:`http://open.quwanzhi.com:11401/v1` +- **API Key**:`ollama`(或不填,Ollama 不校验) +- **Model**:`qwen2.5:3b`(推荐)或 `qwen2.5:1.5b` + +### 环境变量(脚本/应用) + +```bash +# 外网 +export OLLAMA_BASE_URL="http://open.quwanzhi.com:11401" + +# 内网 +export OLLAMA_BASE_URL="http://192.168.1.201:11434" +``` + +--- + ## 一、接口地址 | 环境 | 基础 URL | 说明 | @@ -138,5 +183,6 @@ print(r.choices[0].message.content) |------|-----| | 外网 Base URL | `http://open.quwanzhi.com:11401` | | 内网 Base URL | `http://192.168.1.201:11434` | -| 默认模型 | `qwen2.5:1.5b` | +| 推荐模型 | `qwen2.5:3b` | +| 备选模型 | `qwen2.5:1.5b` | | 认证 | 无(内网服务,外网经 frp 暴露,按需在 frp 或上层加鉴权) | diff --git a/03_卡木(木)/木叶_视频内容/视频切片/脚本/soul_enhance.py b/03_卡木(木)/木叶_视频内容/视频切片/脚本/soul_enhance.py index 0a995923..d7f05143 100644 --- a/03_卡木(木)/木叶_视频内容/视频切片/脚本/soul_enhance.py +++ b/03_卡木(木)/木叶_视频内容/视频切片/脚本/soul_enhance.py @@ -78,6 +78,40 @@ CORRECTIONS = { '私余': '私域', '统安': '同安', '信一下': '线上', '头里': '投入', '幅画': '负责', '施育': '私域', '经历论': '净利润', '成于': '乘以', '马的': '码的', '猜济': '拆解', '巨圣': '矩阵', '货客': '获客', + '甲为师': '(AI助手)', '小龙俠': '小龙虾', '小龍俠': '小龙虾', + '小龍蝦': '小龙虾', '龍蝦': '龙虾', '小龙虾': '深度AI', + '基因交狼': '技能包', '基因交流': '技能传授', '颗色': 'Cursor', + '蝌蚁': '科技AI', '千万': '千问', '吹': 'Claude', '豆包': 'AI工具', + '受伤命': '搜索引擎', '货客': '获客', '受上': 'Soul上', + '搜上': 'Soul上', '售上': 'Soul上', '寿上': 'Soul上', + '瘦上': 'Soul上', '亭上': 'Soul上', '这受': '这Soul', + '龙虾': '深度AI', '克劳德': 'Claude', +} + +# 各平台违禁词 → 谐音/替代词(用于字幕、封面、文件名) +# 原则:意思不变,表达更安全,避免平台限流/封号 +PLATFORM_VIOLATIONS = { + # 网络访问 + '科学上网': '特殊网络访问', + '翻墙': '访问海外工具', + '梯子': '访问工具', + 'VPN': '网络工具', + # 资金/收益(部分平台敏感) + '引流': '涌流', + '拉人': '邀请', + '加微信': '加联系方式', + '私聊': '后台联系', + # 内容规范 + '炸房': '被限流', + '封号': '账号受限', + '洗稿': '参考改写', + # 灰色表述 + '灰色': '特殊', + '黑产': '地下产业', + '套利': '差价空间', + # 平台专属敏感 + 'API': 'A接口', + 'token消耗': '算力成本', } # 语助词列表(需清理,含常见口头禅) @@ -235,6 +269,54 @@ def clean_filler_words(text): result = re.sub(r'[,,]+', ',', result).strip(' ,,') return result + +def apply_platform_safety(text: str) -> str: + """将各平台违禁词/敏感词替换为安全谐音词,适用于字幕、封面、文件名。 + + 按词长降序替换,避免短词截断长词。 + """ + if not text: + return text + result = str(text) + # 先做 CORRECTIONS(转录错误修正),再做 VIOLATIONS(平台安全替换) + for w, c in sorted(CORRECTIONS.items(), key=lambda x: len(x[0]), reverse=True): + result = result.replace(w, c) + for w, c in sorted(PLATFORM_VIOLATIONS.items(), key=lambda x: len(x[0]), reverse=True): + result = result.replace(w, c) + return result + + +def improve_subtitle_punctuation(text: str) -> str: + """为字幕句子补充标点,让意思更清晰。 + + 规则: + 1. 疑问句(含疑问词)加问号 + 2. 感叹、强调语气加感叹号 + 3. 普通陈述句末加句号(如果长度 >= 5) + 4. 修正多余标点 + """ + t = text.strip() + if not t: + return t + # 末尾已有标点则不重复加 + if t and t[-1] in ',。?!,.:!?;': + return apply_platform_safety(t) + # 疑问词检测 + question_words = ('吗', '吧', '呢', '么', '嘛', '什么', '怎么', '为什么', + '哪', '哪里', '谁', '几', '多少', '是否', '可以吗', '对吗') + is_question = any(t.endswith(w) for w in question_words) or '?' in t or '?' in t + # 感叹语气 + exclaim_patterns = ('太', '好', '真', '完全', '绝对', '必须', '一定', '非常', '超级') + is_exclaim = any(t.startswith(p) for p in exclaim_patterns) and len(t) >= 6 + # 加标点 + if is_question: + t = t + '?' + elif is_exclaim: + t = t + '!' + elif len(t) >= 5: + t = t + '。' + return apply_platform_safety(t) + def parse_srt_for_clip(srt_path, start_sec, end_sec): """解析SRT,提取指定时间段的字幕""" with open(srt_path, 'r', encoding='utf-8') as f: @@ -802,6 +884,8 @@ def enhance_clip(clip_path, output_path, highlight_info, temp_dir, transcript_pa if m: raw_title = m.group(1).strip() hook_text = _normalize_title_for_display(raw_title) or raw_title or '精彩切片' + # 封面文字同样做安全处理 + hook_text = apply_platform_safety(hook_text) cover_duration = STYLE['cover']['duration'] # 竖屏成片:封面/字幕按 498x1080 做,叠在裁切区域,文字与字幕在竖屏上完整且居中 @@ -847,7 +931,9 @@ def enhance_clip(clip_path, output_path, highlight_info, temp_dir, transcript_pa print(f" ✓ 字幕解析 ({len(subtitles)}条),将烧录为随语音走动的字幕", flush=True) for i, sub in enumerate(subtitles): img_path = os.path.join(temp_dir, f'sub_{i:04d}.png') - create_subtitle_image(sub['text'], out_w, out_h, img_path) + # 应用违禁词替换 + 标点优化(让字幕更清晰、安全) + safe_text = improve_subtitle_punctuation(sub['text']) + create_subtitle_image(safe_text, out_w, out_h, img_path) sub_images.append({'path': img_path, 'start': sub['start'], 'end': sub['end']}) if sub_images: print(f" ✓ 字幕图片 ({len(sub_images)}张)", flush=True) diff --git a/运营中枢/工作台/gitea_push_log.md b/运营中枢/工作台/gitea_push_log.md index 152c084d..06226dd2 100644 --- a/运营中枢/工作台/gitea_push_log.md +++ b/运营中枢/工作台/gitea_push_log.md @@ -275,3 +275,4 @@ | 2026-03-10 20:05:38 | 🔄 卡若AI 同步 2026-03-10 20:05 | 更新:运营中枢工作台 | 排除 >20MB: 11 个 | | 2026-03-10 20:26:50 | 🔄 卡若AI 同步 2026-03-10 20:26 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 11 个 | | 2026-03-10 20:45:03 | 🔄 卡若AI 同步 2026-03-10 20:45 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 11 个 | +| 2026-03-10 20:55:38 | 🔄 卡若AI 同步 2026-03-10 20:55 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 11 个 | diff --git a/运营中枢/工作台/代码管理.md b/运营中枢/工作台/代码管理.md index e5f423d0..64e2512d 100644 --- a/运营中枢/工作台/代码管理.md +++ b/运营中枢/工作台/代码管理.md @@ -278,3 +278,4 @@ | 2026-03-10 20:05:38 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-10 20:05 | 更新:运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | | 2026-03-10 20:26:50 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-10 20:26 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | | 2026-03-10 20:45:03 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-10 20:45 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | +| 2026-03-10 20:55:38 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-10 20:55 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |