187 lines
8.7 KiB
HTML
187 lines
8.7 KiB
HTML
{% extends "base.html" %}
|
||
|
||
{% block title %}我的专属声音 - 儿童语言学习系统{% endblock %}
|
||
|
||
{% block content %}
|
||
<div class="container py-4">
|
||
<!-- 页面标题 -->
|
||
<div class="row mb-4">
|
||
<div class="col-12">
|
||
<div class="d-flex align-items-center">
|
||
<a href="{{ url_for('main.dashboard') }}" class="btn btn-outline-secondary me-3">
|
||
<i class="fas fa-arrow-left me-2"></i>返回主页
|
||
</a>
|
||
<div>
|
||
<h2 class="fw-bold mb-1 text-kid-primary">
|
||
🎤 我的专属声音
|
||
</h2>
|
||
<p class="text-muted mb-0">让AI学会你的声音,创造专属于你的语音助手</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 状态卡片 -->
|
||
<div class="row mb-4">
|
||
<div class="col-12">
|
||
<div class="card border-0 shadow-sm" id="status-card">
|
||
<div class="card-body p-4">
|
||
<div id="voice-status-content">
|
||
<!-- 动态加载状态内容 -->
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 录制区域 -->
|
||
<div class="row mb-4">
|
||
<div class="col-lg-6">
|
||
<div class="card border-0 shadow-sm kid-feature-card">
|
||
<div class="card-body p-4">
|
||
<h5 class="fw-bold text-kid-accent mb-3">
|
||
<i class="fas fa-microphone me-2"></i>录制你的声音
|
||
</h5>
|
||
|
||
<form id="voice-upload-form" enctype="multipart/form-data">
|
||
<div class="mb-3">
|
||
<label class="form-label">选择音频文件:</label>
|
||
<input type="file" class="form-control" id="voice-file"
|
||
accept=".wav,.mp3,.m4a" style="border-radius: 15px;">
|
||
<div class="form-text">建议:清晰朗读3-10秒,说一句完整的话</div>
|
||
</div>
|
||
|
||
<div class="text-center mb-3">
|
||
<span class="text-muted">或者</span>
|
||
</div>
|
||
|
||
<div class="text-center mb-3">
|
||
<button type="button" id="start-record" class="btn btn-kid-primary me-2">
|
||
<i class="fas fa-record-vinyl me-2"></i>开始录音
|
||
</button>
|
||
<button type="button" id="stop-record" class="btn btn-secondary" disabled>
|
||
<i class="fas fa-stop me-2"></i>停止录音
|
||
</button>
|
||
<div class="mt-2">
|
||
<small id="record-status" class="text-muted">点击开始录音按钮</small>
|
||
</div>
|
||
</div>
|
||
|
||
<button type="submit" class="btn btn-kid-accent w-100" disabled id="upload-btn">
|
||
<i class="fas fa-upload me-2"></i>上传并训练我的声音
|
||
</button>
|
||
</form>
|
||
|
||
<!-- 音频预览 -->
|
||
<div id="audio-preview" class="mt-3" style="display: none;">
|
||
<div class="alert alert-info">
|
||
<h6><i class="fas fa-headphones me-2"></i>预览录音:</h6>
|
||
<audio controls class="w-100 mt-2" id="preview-audio">
|
||
<source id="preview-source" type="audio/wav">
|
||
</audio>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="col-lg-6">
|
||
<div class="card border-0 shadow-sm kid-feature-card">
|
||
<div class="card-body p-4">
|
||
<h5 class="fw-bold text-kid-secondary mb-3">
|
||
<i class="fas fa-magic me-2"></i>用我的声音说话
|
||
</h5>
|
||
|
||
<form id="speech-generate-form">
|
||
<div class="mb-3">
|
||
<label class="form-label">想说什么?</label>
|
||
<textarea class="form-control" id="speech-text" rows="4"
|
||
placeholder="输入你想让AI用你的声音说的话..."
|
||
style="border-radius: 15px;">你好,这是我的专属声音!听起来是不是很像我呢?</textarea>
|
||
</div>
|
||
|
||
<button type="submit" class="btn btn-kid-secondary w-100" disabled id="generate-btn">
|
||
<i class="fas fa-magic me-2"></i>生成我的声音
|
||
</button>
|
||
</form>
|
||
|
||
<!-- 生成结果 -->
|
||
<div id="speech-result" class="mt-3" style="display: none;">
|
||
<div class="alert alert-success">
|
||
<h6><i class="fas fa-volume-up me-2"></i>生成的语音:</h6>
|
||
<audio controls class="w-100 mt-2" id="generated-audio">
|
||
<source id="generated-source" type="audio/wav">
|
||
</audio>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 使用说明 -->
|
||
<div class="row">
|
||
<div class="col-12">
|
||
<div class="card border-0 shadow-sm">
|
||
<div class="card-body p-4">
|
||
<h5 class="fw-bold text-center mb-4">
|
||
<i class="fas fa-lightbulb text-warning me-2"></i>使用小贴士
|
||
</h5>
|
||
|
||
<div class="row">
|
||
<div class="col-md-3 text-center mb-3">
|
||
<div class="icon-bubble mx-auto mb-2" style="background: linear-gradient(45deg, #FF6B6B, #FF8E53);">
|
||
<i class="fas fa-microphone text-white"></i>
|
||
</div>
|
||
<h6 class="fw-bold">清晰发音</h6>
|
||
<p class="small text-muted">说话要清楚,声音要洪亮</p>
|
||
</div>
|
||
|
||
<div class="col-md-3 text-center mb-3">
|
||
<div class="icon-bubble mx-auto mb-2" style="background: linear-gradient(45deg, #4ECDC4, #44A08D);">
|
||
<i class="fas fa-clock text-white"></i>
|
||
</div>
|
||
<h6 class="fw-bold">合适时长</h6>
|
||
<p class="small text-muted">录音3-10秒,一句话就够了</p>
|
||
</div>
|
||
|
||
<div class="col-md-3 text-center mb-3">
|
||
<div class="icon-bubble mx-auto mb-2" style="background: linear-gradient(45deg, #A8E6CF, #DCEDC8);">
|
||
<i class="fas fa-volume-up text-white"></i>
|
||
</div>
|
||
<h6 class="fw-bold">安静环境</h6>
|
||
<p class="small text-muted">在安静的地方录音效果更好</p>
|
||
</div>
|
||
|
||
<div class="col-md-3 text-center mb-3">
|
||
<div class="icon-bubble mx-auto mb-2" style="background: linear-gradient(45deg, #FFB347, #FFCC02);">
|
||
<i class="fas fa-smile text-white"></i>
|
||
</div>
|
||
<h6 class="fw-bold">自然语调</h6>
|
||
<p class="small text-muted">用你平时说话的语调</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Loading Modal -->
|
||
<div class="modal fade" id="loadingModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1">
|
||
<div class="modal-dialog modal-dialog-centered">
|
||
<div class="modal-content">
|
||
<div class="modal-body text-center py-4">
|
||
<div class="spinner-border text-primary mb-3" role="status"></div>
|
||
<h5 id="loading-message">正在处理中...</h5>
|
||
<p id="loading-detail" class="text-muted">请稍候...</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
{% endblock %}
|
||
|
||
{% block scripts %}
|
||
<script src="{{ url_for('static', filename='js/voice_clone.js') }}"></script>
|
||
{% endblock %}
|