不对口型,添加调试人设对话
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m34s

This commit is contained in:
Song367 2025-08-04 10:52:55 +08:00
parent 424b9f3c12
commit 9926ee0e68
7 changed files with 70 additions and 42 deletions

View File

@ -3,7 +3,7 @@ run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀
on: on:
push: push:
branches: branches:
- 'dev' - 'demo-t*'
env: env:
BUILD: staging BUILD: staging

View File

@ -88,7 +88,7 @@ const connectedClients = new Map();
// 视频映射配置 // 视频映射配置
const videoMapping = { const videoMapping = {
// 'say-6s-m-e': '1-m.mp4', // 'say-6s-m-e': '1-m.mp4',
'default': 'chane.mp4', 'default': 'chang.mp4',
// 'say-5s-amplitude': '2.mp4', // 'say-5s-amplitude': '2.mp4',
// 'say-5s-m-e': '4.mp4', // 'say-5s-m-e': '4.mp4',
// 'say-5s-m-sw': 'd-0.mp4', // 'say-5s-m-sw': 'd-0.mp4',

View File

@ -362,8 +362,23 @@ class AudioProcessor {
// 停止录音 // 停止录音
stopRecording() { stopRecording() {
console.log('开始停止录音...');
// 停止所有音频轨道
if (this.stream) {
this.stream.getTracks().forEach(track => {
track.stop();
console.log(`停止音频轨道: ${track.label}`);
});
this.stream = null;
}
if (this.audioContext) { if (this.audioContext) {
this.audioContext.close(); this.audioContext.close().then(() => {
console.log('AudioContext已关闭');
}).catch(err => {
console.error('关闭AudioContext时出错:', err);
});
this.audioContext = null; this.audioContext = null;
} }
@ -377,12 +392,16 @@ class AudioProcessor {
this.handleSpeechEnd(); this.handleSpeechEnd();
} }
// 重置所有状态
this.isRecording = false; this.isRecording = false;
this.isSpeaking = false; this.isSpeaking = false;
this.audioBuffer = []; this.audioBuffer = [];
this.audioChunks = [];
this.consecutiveFramesCount = 0;
this.frameBuffer = [];
this.onStatusUpdate('录音已停止', 'stopped'); this.onStatusUpdate('录音已完全停止', 'stopped');
console.log('录音已停止'); console.log('录音已完全停止,所有资源已释放');
} }
// 获取录音状态 // 获取录音状态

View File

@ -3,7 +3,7 @@ export const config = {
// LLM API配置 // LLM API配置
llm: { llm: {
apiKey: 'd012651b-a65b-4b13-8ff3-cc4ff3a29783', // 请替换为实际的API密钥 apiKey: 'd012651b-a65b-4b13-8ff3-cc4ff3a29783', // 请替换为实际的API密钥
model: 'bot-20250720193048-84fkp', model: 'bot-20250724150616-xqpz8',
}, },
// Minimaxi API配置 // Minimaxi API配置

View File

@ -194,37 +194,40 @@
} }
#startButton { #startButton {
width: 60px;
height: 60px;
border-radius: 50%;
background: rgba(34, 197, 94, 0.9);
backdrop-filter: blur(10px);
border: none;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s ease;
box-shadow: 0 4px 15px rgba(34, 197, 94, 0.3);
min-width: auto;
padding: 15px 30px; padding: 15px 30px;
font-size: 1.1rem; font-size: 1.1rem;
border-radius: 25px; border-radius: 25px;
min-width: 200px; min-width: 200px;
background: rgba(0, 123, 255, 0.9);
backdrop-filter: blur(10px);
} }
#stopButton { #startButton:hover:not(:disabled) {
width: 60px; background: rgba(22, 163, 74, 0.95);
height: 60px;
border-radius: 50%;
background: rgba(220, 53, 69, 0.9);
backdrop-filter: blur(10px);
border: none;
cursor: pointer;
display: none;
align-items: center;
justify-content: center;
transition: all 0.3s ease;
box-shadow: 0 4px 15px rgba(220, 53, 69, 0.3);
}
#stopButton.show {
display: flex;
}
#stopButton:hover:not(:disabled) {
background: rgba(200, 35, 51, 0.95);
transform: scale(1.1); transform: scale(1.1);
box-shadow: 0 6px 20px rgba(220, 53, 69, 0.5); box-shadow: 0 6px 20px rgba(34, 197, 94, 0.5);
}
#startButton svg {
width: 24px;
height: 24px;
fill: white;
}
#startButton:disabled {
opacity: 0.5;
cursor: not-allowed;
} }
#stopButton svg { #stopButton svg {
@ -284,12 +287,14 @@
<!-- 控制按钮 - 悬浮在视频上方 --> <!-- 控制按钮 - 悬浮在视频上方 -->
<div class="controls"> <div class="controls">
<button id="startButton" class="btn btn-primary">开始音频通话</button> <button id="startButton" class="btn btn-primary" title="开始通话">
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1V20c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z" fill="white"/>
</svg>
</button>
<button id="stopButton" class="btn btn-danger" disabled title="结束通话"> <button id="stopButton" class="btn btn-danger" disabled title="结束通话">
<svg viewBox="0 0 24 24"> <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1V20c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z"/> <path d="M19.23 15.26l-2.54-.29c-.61-.07-1.21.14-1.64.57l-1.84 1.84c-2.83-1.44-5.15-3.75-6.59-6.59l1.85-1.85c.43-.43.64-1.03.57-1.64l-.29-2.52c-.12-1.01-.97-1.77-1.99-1.77H5.03c-1.13 0-2.07.94-2 2.07.53 8.54 7.36 15.36 15.89 15.89 1.13.07 2.07-.87 2.07-2v-1.73c.01-1.01-.75-1.86-1.76-1.98z" fill="white"/>
<path d="M19 12h2c0-4.97-4.03-9-9-9v2c3.87 0 7 3.13 7 7z"/>
<path d="M15 12h2c0-2.76-2.24-5-5-5v2c1.66 0 3 1.34 3 3z"/>
<line x1="18" y1="6" x2="6" y2="18" stroke="white" stroke-width="2"/> <line x1="18" y1="6" x2="6" y2="18" stroke="white" stroke-width="2"/>
</svg> </svg>
</button> </button>

View File

@ -837,8 +837,16 @@ class WebRTCChat {
} }
stopCall() { stopCall() {
// 停止音频处理器
if (this.audioProcessor) {
this.audioProcessor.stopRecording();
}
if (this.localStream) { if (this.localStream) {
this.localStream.getTracks().forEach(track => track.stop()); this.localStream.getTracks().forEach(track => {
track.stop();
console.log(`停止轨道: ${track.kind}`);
});
this.localStream = null; this.localStream = null;
} }
@ -855,7 +863,6 @@ class WebRTCChat {
this.recordedVideo.srcObject = null; this.recordedVideo.srcObject = null;
this.currentVideo = null; this.currentVideo = null;
this.currentVideoName.textContent = '未选择视频';
this.startButton.disabled = false; this.startButton.disabled = false;
this.stopButton.disabled = true; this.stopButton.disabled = true;
@ -863,11 +870,8 @@ class WebRTCChat {
// 隐藏结束通话按钮 // 隐藏结束通话按钮
this.stopButton.classList.remove('show'); this.stopButton.classList.remove('show');
this.stopVoiceRecording()
this.updateAudioStatus('未连接', 'disconnected'); this.updateAudioStatus('未连接', 'disconnected');
this.logMessage('音频通话已结束', 'info'); this.logMessage('音频通话已结束,所有资源已释放', 'info');
} }
async createPeerConnection() { async createPeerConnection() {

View File

@ -29,7 +29,7 @@ async function requestLLMStream({ apiKey, model, messages, onSegment }) {
let pendingText = ''; // 待处理的文本片段 let pendingText = ''; // 待处理的文本片段
// 分段分隔符 // 分段分隔符
const segmentDelimiters = /[,。:;!?,.:;!?]/; const segmentDelimiters = /[,。:;!?,.:;!?]|\.{3,}/;
while (!done) { while (!done) {
const { value, done: doneReading } = await reader.read(); const { value, done: doneReading } = await reader.read();