2022-06-20 11:05:10 +08:00
|
|
|
|
<!DOCTYPE html>
|
|
|
|
|
<html lang="en">
|
|
|
|
|
|
|
|
|
|
<head>
|
|
|
|
|
<meta charset="UTF-8">
|
|
|
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
|
|
|
|
|
|
|
|
<!-- index.css -->
|
2023-05-12 18:56:36 +08:00
|
|
|
|
<link rel="stylesheet" href="{{ url_for('static',filename='css/index.css') }}">
|
|
|
|
|
</link>
|
2023-01-31 12:40:36 +08:00
|
|
|
|
<!-- <link rel="stylesheet" href="./css/index.css"> -->
|
2022-06-20 11:05:10 +08:00
|
|
|
|
<!-- 引入element-ui样式 -->
|
2023-01-31 12:40:36 +08:00
|
|
|
|
<!-- <link rel="stylesheet" href="./css/element.css"> -->
|
2023-05-12 18:56:36 +08:00
|
|
|
|
<link rel="stylesheet" href="{{ url_for('static',filename='css/element.css') }}">
|
|
|
|
|
</link>
|
2022-06-20 11:05:10 +08:00
|
|
|
|
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
|
2023-02-03 18:46:12 +08:00
|
|
|
|
<script src="/static/live2d/autoload.js"></script>
|
2022-06-20 11:05:10 +08:00
|
|
|
|
|
2023-05-12 18:56:36 +08:00
|
|
|
|
<title>Fay</title>
|
|
|
|
|
<style>
|
|
|
|
|
.container {
|
|
|
|
|
max-height: calc(100vh - 55px);
|
|
|
|
|
min-height: 953px;
|
|
|
|
|
width: 913px;
|
|
|
|
|
border-radius: 4px;
|
|
|
|
|
border: 0.5px solid #e0e0e0;
|
|
|
|
|
background-color: #f5f5f5;
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-flow: column;
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.content {
|
|
|
|
|
width: calc(100% - 20px);
|
|
|
|
|
padding: 20px;
|
|
|
|
|
overflow-y: scroll;
|
|
|
|
|
flex: 1;
|
2023-05-27 17:03:43 +08:00
|
|
|
|
white-space: pre-wrap;
|
2023-05-12 18:56:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.content:hover::-webkit-scrollbar-thumb {
|
|
|
|
|
background: rgba(0, 0, 0, 0.1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.bubble {
|
|
|
|
|
/* max-width: 400px; */
|
|
|
|
|
max-width: 60%;
|
|
|
|
|
padding: 10px;
|
|
|
|
|
border-radius: 5px;
|
|
|
|
|
position: relative;
|
|
|
|
|
color: #000;
|
|
|
|
|
word-wrap: break-word;
|
|
|
|
|
word-break: normal;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.item-left .bubble {
|
|
|
|
|
margin-left: 15px;
|
|
|
|
|
background-color: #fff;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.item-left .bubble:before {
|
|
|
|
|
content: "";
|
|
|
|
|
position: absolute;
|
|
|
|
|
width: 0;
|
|
|
|
|
height: 0;
|
|
|
|
|
border-left: 10px solid transparent;
|
|
|
|
|
border-top: 10px solid transparent;
|
|
|
|
|
border-right: 10px solid #fff;
|
|
|
|
|
border-bottom: 10px solid transparent;
|
|
|
|
|
left: -20px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.item-right .bubble {
|
|
|
|
|
margin-right: 15px;
|
|
|
|
|
background-color: #63f5a1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.item-right .bubble:before {
|
|
|
|
|
content: "";
|
|
|
|
|
position: absolute;
|
|
|
|
|
width: 0;
|
|
|
|
|
height: 0;
|
|
|
|
|
border-left: 10px solid #63f5a1;
|
|
|
|
|
border-top: 10px solid transparent;
|
|
|
|
|
border-right: 10px solid transparent;
|
|
|
|
|
border-bottom: 10px solid transparent;
|
|
|
|
|
right: -20px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.item {
|
|
|
|
|
margin-top: 15px;
|
|
|
|
|
display: flex;
|
|
|
|
|
width: 100%;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.item.item-right {
|
|
|
|
|
justify-content: flex-end;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.item.item-center {
|
|
|
|
|
justify-content: center;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.item.item-center span {
|
|
|
|
|
font-size: 12px;
|
|
|
|
|
padding: 2px 4px;
|
|
|
|
|
color: #fff;
|
|
|
|
|
background-color: #dadada;
|
|
|
|
|
border-radius: 3px;
|
|
|
|
|
-moz-user-select: none;
|
|
|
|
|
/*火狐*/
|
|
|
|
|
-webkit-user-select: none;
|
|
|
|
|
/*webkit浏览器*/
|
|
|
|
|
-ms-user-select: none;
|
|
|
|
|
/*IE10*/
|
|
|
|
|
-khtml-user-select: none;
|
|
|
|
|
/*早期浏览器*/
|
|
|
|
|
user-select: none;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.avatar img {
|
|
|
|
|
width: 42px;
|
|
|
|
|
height: 42px;
|
|
|
|
|
border-radius: 50%;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.input-area {
|
|
|
|
|
border-top: 0.5px solid #e0e0e0;
|
|
|
|
|
height: 150px;
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-flow: column;
|
|
|
|
|
background-color: #fff;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
textarea {
|
|
|
|
|
flex: 1;
|
|
|
|
|
padding: 5px;
|
|
|
|
|
font-size: 14px;
|
|
|
|
|
border: none;
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
overflow-y: auto;
|
|
|
|
|
overflow-x: hidden;
|
|
|
|
|
outline: none;
|
|
|
|
|
resize: none;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.button-area {
|
|
|
|
|
display: flex;
|
|
|
|
|
height: 40px;
|
|
|
|
|
margin-right: 10px;
|
|
|
|
|
line-height: 40px;
|
|
|
|
|
padding: 5px;
|
|
|
|
|
justify-content: flex-end;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.button-area button {
|
|
|
|
|
width: 80px;
|
|
|
|
|
border: none;
|
|
|
|
|
outline: none;
|
|
|
|
|
border-radius: 4px;
|
|
|
|
|
float: right;
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* 设置滚动条的样式 */
|
|
|
|
|
::-webkit-scrollbar {
|
|
|
|
|
width: 10px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* 滚动槽 */
|
|
|
|
|
::-webkit-scrollbar-track {
|
|
|
|
|
-webkit-box-shadow: inset006pxrgba(0, 0, 0, 0.3);
|
|
|
|
|
border-radius: 8px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* 滚动条滑块 */
|
|
|
|
|
::-webkit-scrollbar-thumb {
|
|
|
|
|
border-radius: 10px;
|
|
|
|
|
background: rgba(0, 0, 0, 0);
|
|
|
|
|
-webkit-box-shadow: inset006pxrgba(0, 0, 0, 0.5);
|
|
|
|
|
}
|
|
|
|
|
</style>
|
2022-06-20 11:05:10 +08:00
|
|
|
|
|
|
|
|
|
</head>
|
|
|
|
|
|
|
|
|
|
<body>
|
2023-05-12 18:56:36 +08:00
|
|
|
|
<div id="app">
|
|
|
|
|
<div class="main">
|
|
|
|
|
<div class="title">
|
|
|
|
|
<h2>Fay数字人助理版</h2>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="main_box">
|
|
|
|
|
<div class="left">
|
|
|
|
|
<div class="left_top">
|
|
|
|
|
<p class="left_top_p">人设:</p>
|
|
|
|
|
<div class="character">
|
|
|
|
|
<div class="character_top">
|
|
|
|
|
<div class="character_left">
|
|
|
|
|
<ul>
|
|
|
|
|
<li>
|
|
|
|
|
<p>姓名:</p>
|
|
|
|
|
<el-input v-model="attribute_name" placeholder="请输入内容"></el-input>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<p>性别:</p>
|
|
|
|
|
<el-input v-model="attribute_gender" placeholder="请输入内容"></el-input>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<p>年龄:</p>
|
|
|
|
|
<el-input v-model="attribute_age" placeholder="请输入内容"></el-input>
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
<li>
|
|
|
|
|
<p>出生地:</p>
|
|
|
|
|
<el-input v-model="attribute_birth" placeholder="请输入内容"></el-input>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<p>生肖:</p>
|
|
|
|
|
<el-input v-model="attribute_zodiac" placeholder="请输入内容"></el-input>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<p>星座:</p>
|
|
|
|
|
<el-input v-model="attribute_constellation" placeholder="请输入内容"></el-input>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<p>职业:</p>
|
|
|
|
|
<el-input v-model="attribute_job" placeholder="请输入内容"></el-input>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<p>喜好:</p>
|
|
|
|
|
<el-input v-model="attribute_hobby" placeholder="请输入内容"></el-input>
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
<li>
|
|
|
|
|
<p>联系方式:</p>
|
|
|
|
|
<el-input v-model="attribute_contact" placeholder="请输入内容"></el-input>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="character_right">
|
|
|
|
|
<ul>
|
|
|
|
|
|
|
|
|
|
<li>
|
|
|
|
|
<p>敏感度:</p>
|
|
|
|
|
<el-slider v-model="interact_perception_follow"></el-slider>
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
<br>
|
|
|
|
|
<li>
|
|
|
|
|
<p>使用面板播放:</p>
|
|
|
|
|
<el-switch v-model="play_sound_enabled" active-color="#13ce66"
|
|
|
|
|
inactive-color="#ff4949">
|
|
|
|
|
</el-switch>
|
|
|
|
|
</li>
|
2023-05-27 17:03:43 +08:00
|
|
|
|
<li>
|
|
|
|
|
<el-button type="delete" class="btn_open"
|
|
|
|
|
@click=postControlEyes()>Fay Eyes</el-button>
|
|
|
|
|
</li>
|
2023-05-12 18:56:36 +08:00
|
|
|
|
</ul>
|
|
|
|
|
</div>
|
2022-06-20 11:05:10 +08:00
|
|
|
|
</div>
|
2023-05-12 18:56:36 +08:00
|
|
|
|
<div class="character_box">
|
|
|
|
|
<p>Q&A文件:</p>
|
|
|
|
|
<el-input v-model="interact_QnA" placeholder="请输入内容"></el-input>
|
|
|
|
|
<!-- <el-upload class="upload-demo" action="http://127.0.0.1:5000/"-->
|
|
|
|
|
<!-- :on-success="handlePreview">-->
|
|
|
|
|
<!-- <el-input v-model="interact_QnA" placeholder="请输入内容"></el-input>-->
|
|
|
|
|
<!-- </el-upload>-->
|
2022-06-20 11:05:10 +08:00
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2023-05-12 18:56:36 +08:00
|
|
|
|
<div class="left_box">
|
|
|
|
|
<p> </p>
|
|
|
|
|
<div class="source">
|
2022-06-20 11:05:10 +08:00
|
|
|
|
<ul>
|
2023-05-12 18:56:36 +08:00
|
|
|
|
|
|
|
|
|
<li class="url">
|
|
|
|
|
<el-switch v-model="source_record_enabled" active-color="#13ce66"
|
|
|
|
|
inactive-color="#ff4949">
|
|
|
|
|
</el-switch>
|
|
|
|
|
<p>麦克风</p>
|
|
|
|
|
<el-select v-model="source_record_device" placeholder="请选择">
|
|
|
|
|
<el-option v-for="item in device_list" :key="item.value" :label="item.label"
|
|
|
|
|
:value="item.value">
|
|
|
|
|
</el-option>
|
|
|
|
|
</el-select>
|
2022-06-20 11:05:10 +08:00
|
|
|
|
</li>
|
2023-05-12 18:56:36 +08:00
|
|
|
|
<li class="url">
|
|
|
|
|
|
|
|
|
|
<p style="margin-left: 40px">消 息</p>
|
|
|
|
|
<el-input v-model="panel_msg" :disabled="true"></el-input>
|
2022-06-20 11:05:10 +08:00
|
|
|
|
</li>
|
2023-05-12 18:56:36 +08:00
|
|
|
|
<li class="but">
|
|
|
|
|
<el-button v-if="live_state == 1" type="success" class="btn_close"
|
|
|
|
|
style="width:200px" @click=postStopLive()>关闭(运行中)</el-button>
|
|
|
|
|
<el-button v-else-if="live_state == 2" type="primary" plain disabled
|
|
|
|
|
style="width:200px">正在开启...</el-button>
|
|
|
|
|
<el-button v-else-if="live_state == 3" type="success" plain disabled
|
|
|
|
|
style="width:200px">正在关闭...</el-button>
|
|
|
|
|
<el-button v-else type="primary" style="width:200px" class="btn_open"
|
|
|
|
|
@click=postStartLive()>开启</el-button>
|
|
|
|
|
<el-button type="button" style="width:200px" @click=postData()>保存配置</el-button>
|
2022-06-20 11:05:10 +08:00
|
|
|
|
</li>
|
2023-05-12 18:56:36 +08:00
|
|
|
|
<li class="p_red">
|
|
|
|
|
<p>注:启动后请选中场景客户端,让其前端运行,否则可能会卡顿,或者无声音。</p>
|
2022-06-20 11:05:10 +08:00
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
2023-05-12 18:56:36 +08:00
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="right">
|
|
|
|
|
<div class="right_main">
|
|
|
|
|
<div class="container">
|
|
|
|
|
<div class="content">
|
|
|
|
|
|
|
|
|
|
<div v-for="item in msg_list">
|
|
|
|
|
<div class="item item-center"><span>[[item.timetext]]</span></div>
|
|
|
|
|
|
|
|
|
|
<div class="item item-left" v-if="item.type == 'fay'">
|
|
|
|
|
<div class="avatar"><img src="{{ url_for('static',filename='to.jpg') }}" />
|
|
|
|
|
</div>
|
|
|
|
|
<div class="bubble bubble-left">[[item.content]]
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="item item-right" v-else>
|
|
|
|
|
<div class="bubble bubble-right">[[item.content]]</div>
|
|
|
|
|
<div class="avatar"><img src="{{ url_for('static',filename='from.jpg') }}" />
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
<div class="input-area">
|
|
|
|
|
<textarea v-model="send_msg" name="text" id="textarea" placeholder="发送些内容给Fay..."></textarea>
|
|
|
|
|
<div class="button-area">
|
2023-05-27 17:03:43 +08:00
|
|
|
|
<button id="send-btn" @click="send(1)">Fay</button>
|
|
|
|
|
|
|
|
|
|
<button id="send-btn" @click="send(2)" style="margin-left: 25px;">ChatGPT</button>
|
|
|
|
|
|
2023-05-12 18:56:36 +08:00
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2022-06-20 11:05:10 +08:00
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2023-05-12 18:56:36 +08:00
|
|
|
|
<script>
|
|
|
|
|
// function send() {
|
|
|
|
|
// let text = document.querySelector('#textarea').value;
|
|
|
|
|
// if (!text) {
|
|
|
|
|
// alert('请输入内容');
|
|
|
|
|
// return;
|
|
|
|
|
// }
|
|
|
|
|
// // text = text.replace(/\s/g, "<br/>");
|
|
|
|
|
// text = text.replace(/\n/g, "<br/>");
|
|
|
|
|
// text = text.replace(/\r\n/g, "<br/>");
|
|
|
|
|
// let item = document.createElement('div');
|
|
|
|
|
// item.className = 'item item-right';
|
|
|
|
|
// item.innerHTML = `<div class="bubble bubble-right">${text}</div><div class="avatar"><img src="{{ url_for('static',filename='from.jpg') }}" /></div>`;
|
|
|
|
|
// document.querySelector('.content').appendChild(item);
|
|
|
|
|
// document.querySelector('#textarea').value = '';
|
|
|
|
|
// document.querySelector('#textarea').focus();
|
|
|
|
|
// //滚动条置底
|
|
|
|
|
// let height = document.querySelector('.content').scrollHeight;
|
|
|
|
|
// document.querySelector(".content").scrollTop = height;
|
|
|
|
|
// }
|
|
|
|
|
</script>
|
2022-06-20 11:05:10 +08:00
|
|
|
|
</body>
|
|
|
|
|
<!-- 开发环境vue.js -->
|
2023-01-31 12:40:36 +08:00
|
|
|
|
<script src="{{ url_for('static',filename='js/vue.js') }}"></script>
|
|
|
|
|
<!--<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>-->
|
2022-06-20 11:05:10 +08:00
|
|
|
|
<!-- 发行环境vue.js -->
|
|
|
|
|
<!-- <script src="https://cdn.jsdelivr.net/npm/vue@2"></script> -->
|
|
|
|
|
<!-- 引入element-ui组件库 -->
|
2023-01-31 12:40:36 +08:00
|
|
|
|
<!-- <script src="./js/element.js"></script> -->
|
|
|
|
|
<script src="{{ url_for('static',filename='js/element.js') }}"></script>
|
2022-06-20 11:05:10 +08:00
|
|
|
|
<!-- index.js -->
|
2023-01-31 12:40:36 +08:00
|
|
|
|
<!-- <script src="./js/index.js"></script> -->
|
|
|
|
|
<!-- <script src="./js/self-adaption.js"></script> -->
|
2022-06-20 11:05:10 +08:00
|
|
|
|
|
|
|
|
|
<script src="{{ url_for('static',filename='js/index.js') }}"></script>
|
|
|
|
|
<script src="{{ url_for('static',filename='js/self-adaption.js') }}"></script>
|
|
|
|
|
|
|
|
|
|
</html>
|