文档初始化
This commit is contained in:
commit
604325a5fc
30
README.md
Normal file
30
README.md
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
# 关于
|
||||||
|
|
||||||
|
> 微果AI无人直播场控 专业简洁的无人直播场控系统
|
||||||
|
|
||||||
|
# 支持功能
|
||||||
|
|
||||||
|
- 支持自定义接入常见本地和服务商LLM大模型
|
||||||
|
- 支持自定义本地知识库和提示词
|
||||||
|
- 支持接入Dify工作流和聊天助手
|
||||||
|
- 支持利用大模型+知识库、Dify回复弹幕问题
|
||||||
|
- 支持大模型或Dify进行文案优化少量话术文案即可长时播放不重复
|
||||||
|
- 支持自定义接入本地或服务商TTS模型(兼容openai生成接口、兼容类硅基流动的语音克隆接口)
|
||||||
|
- 话术支持变量、随机多选一、助理音色、强制优化
|
||||||
|
- 支持开播中手工插入优先话术
|
||||||
|
- 支持背景音乐
|
||||||
|
- 支持助理回复弹幕、助理实时插入(助理和主播同时说话)
|
||||||
|
- 支持接入抖音弹幕助手、油猴弹幕抓取脚本
|
||||||
|
- 支持独立实时调整主音量、背景音乐、主播、助理音量
|
||||||
|
- 支持选择音频输出接口不影响系统默认音频输出接口
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# 截图
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
8
_navbar.md
Normal file
8
_navbar.md
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<!-- _navbar.md -->
|
||||||
|
|
||||||
|
* 关于我们
|
||||||
|
|
||||||
|
* [主页](quickstart.md)
|
||||||
|
* [帮助](more-pages.md)
|
||||||
|
* [FAQ](custom-navbar.md)
|
||||||
|
* [联系我们](cover.md)
|
10
_sidebar.md
Normal file
10
_sidebar.md
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<!-- docs/_sidebar.md -->
|
||||||
|
|
||||||
|
* [关于微果AI场控](/)
|
||||||
|
* [场控操作](controls.md)
|
||||||
|
* [快速上手](quickstart.md)
|
||||||
|
* [话术文案](moderator.md)
|
||||||
|
* [AI模型接入](llm.md)
|
||||||
|
* [话术优化](optimize.md)
|
||||||
|
* [TTS引擎](tts.md)
|
||||||
|
* [弹幕处理](barrage.md)
|
12
barrage.md
Normal file
12
barrage.md
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# 弹幕处理
|
||||||
|
弹幕处理方法介绍
|
||||||
|
|
||||||
|
# 基础配置
|
||||||
|
|
||||||
|
# 平台对接
|
||||||
|
|
||||||
|
## 接入抖音弹幕助手
|
||||||
|
|
||||||
|
## 接入油猴弹幕脚本(快手、B站)
|
||||||
|
|
||||||
|
|
5
controls.md
Normal file
5
controls.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# 工作流程
|
||||||
|
|
||||||
|
# 基础操作
|
||||||
|
|
||||||
|
# 功能介绍
|
BIN
images/cangkong1.png
Normal file
BIN
images/cangkong1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 42 KiB |
BIN
images/daoruhuasu.png
Normal file
BIN
images/daoruhuasu.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 113 KiB |
BIN
images/jieya1.png
Normal file
BIN
images/jieya1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 27 KiB |
BIN
images/llmsetpic.png
Normal file
BIN
images/llmsetpic.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 83 KiB |
BIN
images/logo.png
Normal file
BIN
images/logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.6 KiB |
37
index.html
Normal file
37
index.html
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Document</title>
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
|
||||||
|
<meta name="description" content="Description">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
|
||||||
|
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/docsify@4/lib/themes/vue.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="app"></div>
|
||||||
|
<script>
|
||||||
|
window.$docsify = {
|
||||||
|
name: '微果AI无人直播场控',
|
||||||
|
repo: '',
|
||||||
|
loadSidebar: true,
|
||||||
|
loadNavbar: true,
|
||||||
|
subMaxLevel: 2,
|
||||||
|
formatUpdated: '{MM}/{DD} {HH}:{mm}',
|
||||||
|
formatUpdated: function (time) {
|
||||||
|
return time;
|
||||||
|
},
|
||||||
|
logo: '/images/logo.png',
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
if (typeof navigator.serviceWorker !== 'undefined') {
|
||||||
|
navigator.serviceWorker.register('sw.js')
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<!-- Docsify v4 -->
|
||||||
|
<script src="//cdn.jsdelivr.net/npm/docsify@4"></script>
|
||||||
|
<script src="//cdn.jsdelivr.net/npm/docsify/lib/plugins/emoji.min.js"></script>
|
||||||
|
<script src="//cdn.jsdelivr.net/npm/docsify-copy-code/dist/docsify-copy-code.min.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
19
llm.md
Normal file
19
llm.md
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# AI模型介绍
|
||||||
|
|
||||||
|
# 基础配置
|
||||||
|
|
||||||
|
# 提示词和知识库
|
||||||
|
|
||||||
|
# 平台对接
|
||||||
|
|
||||||
|
## 接入自定义LLM(兼容openai)
|
||||||
|
|
||||||
|
## 接入Dify(聊天助手)
|
||||||
|
|
||||||
|
## 接入Dify(工作流)
|
||||||
|
|
||||||
|
## 接入硅基流动(deepseek v3)
|
||||||
|
|
||||||
|
## 接入火山方舟(豆包)
|
||||||
|
|
||||||
|
## 接入阿里百炼(通义千问)
|
7
moderator.md
Normal file
7
moderator.md
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# 话术文案
|
||||||
|
|
||||||
|
# 操作
|
||||||
|
|
||||||
|
# 话术撰写指南
|
||||||
|
|
||||||
|
# 话术变量表
|
7
optimize.md
Normal file
7
optimize.md
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# 话术优化介绍
|
||||||
|
|
||||||
|
# 配置
|
||||||
|
|
||||||
|
# 平台对接
|
||||||
|
|
||||||
|
# 提示词
|
22
quickstart.md
Normal file
22
quickstart.md
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
# 下载
|
||||||
|
|
||||||
|
1. 程序主体:
|
||||||
|
微果AI无人直播场控:[点击下载](http://localhost)
|
||||||
|
|
||||||
|
2. 可选功能插件:
|
||||||
|
抖音弹幕助手:[点击下载](http://localhost)
|
||||||
|
油猴浏览器扩展:[点击下载](http://localhost)
|
||||||
|
弹幕油猴脚本:[点击下载](http://localhost)
|
||||||
|
专用indexTTS一键包:[点击下载](http://localhost)
|
||||||
|
|
||||||
|
# 安装
|
||||||
|
下载主体压缩包,直接解压到D盘即可。获得目录如下:
|
||||||
|

|
||||||
|
|
||||||
|
# 快速开始
|
||||||
|
1. 运行`微果AI直播场控.exe`
|
||||||
|
2. 点击`导入话术`跳转到导入话术页面
|
||||||
|
3. 点击`导入`在打开的对话框里选择`示例话术.txt`
|
||||||
|
4. 点击导入话术页面的保存按钮
|
||||||
|
5. 点击`场控`跳转到场控页面,选择输入设备
|
||||||
|
6. 点击`场控`页面下方的开始
|
83
sw.js
Normal file
83
sw.js
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
/* ===========================================================
|
||||||
|
* docsify sw.js
|
||||||
|
* ===========================================================
|
||||||
|
* Copyright 2016 @huxpro
|
||||||
|
* Licensed under Apache 2.0
|
||||||
|
* Register service worker.
|
||||||
|
* ========================================================== */
|
||||||
|
|
||||||
|
const RUNTIME = 'docsify'
|
||||||
|
const HOSTNAME_WHITELIST = [
|
||||||
|
self.location.hostname,
|
||||||
|
'fonts.gstatic.com',
|
||||||
|
'fonts.googleapis.com',
|
||||||
|
'cdn.jsdelivr.net'
|
||||||
|
]
|
||||||
|
|
||||||
|
// The Util Function to hack URLs of intercepted requests
|
||||||
|
const getFixedUrl = (req) => {
|
||||||
|
var now = Date.now()
|
||||||
|
var url = new URL(req.url)
|
||||||
|
|
||||||
|
// 1. fixed http URL
|
||||||
|
// Just keep syncing with location.protocol
|
||||||
|
// fetch(httpURL) belongs to active mixed content.
|
||||||
|
// And fetch(httpRequest) is not supported yet.
|
||||||
|
url.protocol = self.location.protocol
|
||||||
|
|
||||||
|
// 2. add query for caching-busting.
|
||||||
|
// Github Pages served with Cache-Control: max-age=600
|
||||||
|
// max-age on mutable content is error-prone, with SW life of bugs can even extend.
|
||||||
|
// Until cache mode of Fetch API landed, we have to workaround cache-busting with query string.
|
||||||
|
// Cache-Control-Bug: https://bugs.chromium.org/p/chromium/issues/detail?id=453190
|
||||||
|
if (url.hostname === self.location.hostname) {
|
||||||
|
url.search += (url.search ? '&' : '?') + 'cache-bust=' + now
|
||||||
|
}
|
||||||
|
return url.href
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Lifecycle Activate
|
||||||
|
* New one activated when old isnt being used.
|
||||||
|
*
|
||||||
|
* waitUntil(): activating ====> activated
|
||||||
|
*/
|
||||||
|
self.addEventListener('activate', event => {
|
||||||
|
event.waitUntil(self.clients.claim())
|
||||||
|
})
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Functional Fetch
|
||||||
|
* All network requests are being intercepted here.
|
||||||
|
*
|
||||||
|
* void respondWith(Promise<Response> r)
|
||||||
|
*/
|
||||||
|
self.addEventListener('fetch', event => {
|
||||||
|
// Skip some of cross-origin requests, like those for Google Analytics.
|
||||||
|
if (HOSTNAME_WHITELIST.indexOf(new URL(event.request.url).hostname) > -1) {
|
||||||
|
// Stale-while-revalidate
|
||||||
|
// similar to HTTP's stale-while-revalidate: https://www.mnot.net/blog/2007/12/12/stale
|
||||||
|
// Upgrade from Jake's to Surma's: https://gist.github.com/surma/eb441223daaedf880801ad80006389f1
|
||||||
|
const cached = caches.match(event.request)
|
||||||
|
const fixedUrl = getFixedUrl(event.request)
|
||||||
|
const fetched = fetch(fixedUrl, { cache: 'no-store' })
|
||||||
|
const fetchedCopy = fetched.then(resp => resp.clone())
|
||||||
|
|
||||||
|
// Call respondWith() with whatever we get first.
|
||||||
|
// If the fetch fails (e.g disconnected), wait for the cache.
|
||||||
|
// If there’s nothing in cache, wait for the fetch.
|
||||||
|
// If neither yields a response, return offline pages.
|
||||||
|
event.respondWith(
|
||||||
|
Promise.race([fetched.catch(_ => cached), cached])
|
||||||
|
.then(resp => resp || fetched)
|
||||||
|
.catch(_ => { /* eat any errors */ })
|
||||||
|
)
|
||||||
|
|
||||||
|
// Update the cache with the version we fetched (only for ok status)
|
||||||
|
event.waitUntil(
|
||||||
|
Promise.all([fetchedCopy, caches.open(RUNTIME)])
|
||||||
|
.then(([response, cache]) => response.ok && cache.put(event.request, response))
|
||||||
|
.catch(_ => { /* eat any errors */ })
|
||||||
|
)
|
||||||
|
}
|
||||||
|
})
|
Loading…
Reference in New Issue
Block a user