不对口型,添加调试人设对话
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m34s
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m34s
This commit is contained in:
parent
424b9f3c12
commit
9926ee0e68
@ -3,7 +3,7 @@ run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'dev'
|
||||
- 'demo-t*'
|
||||
|
||||
env:
|
||||
BUILD: staging
|
||||
|
||||
@ -88,7 +88,7 @@ const connectedClients = new Map();
|
||||
// 视频映射配置
|
||||
const videoMapping = {
|
||||
// 'say-6s-m-e': '1-m.mp4',
|
||||
'default': 'chane.mp4',
|
||||
'default': 'chang.mp4',
|
||||
// 'say-5s-amplitude': '2.mp4',
|
||||
// 'say-5s-m-e': '4.mp4',
|
||||
// 'say-5s-m-sw': 'd-0.mp4',
|
||||
|
||||
@ -362,8 +362,23 @@ class AudioProcessor {
|
||||
|
||||
// 停止录音
|
||||
stopRecording() {
|
||||
console.log('开始停止录音...');
|
||||
|
||||
// 停止所有音频轨道
|
||||
if (this.stream) {
|
||||
this.stream.getTracks().forEach(track => {
|
||||
track.stop();
|
||||
console.log(`停止音频轨道: ${track.label}`);
|
||||
});
|
||||
this.stream = null;
|
||||
}
|
||||
|
||||
if (this.audioContext) {
|
||||
this.audioContext.close();
|
||||
this.audioContext.close().then(() => {
|
||||
console.log('AudioContext已关闭');
|
||||
}).catch(err => {
|
||||
console.error('关闭AudioContext时出错:', err);
|
||||
});
|
||||
this.audioContext = null;
|
||||
}
|
||||
|
||||
@ -377,12 +392,16 @@ class AudioProcessor {
|
||||
this.handleSpeechEnd();
|
||||
}
|
||||
|
||||
// 重置所有状态
|
||||
this.isRecording = false;
|
||||
this.isSpeaking = false;
|
||||
this.audioBuffer = [];
|
||||
this.audioChunks = [];
|
||||
this.consecutiveFramesCount = 0;
|
||||
this.frameBuffer = [];
|
||||
|
||||
this.onStatusUpdate('录音已停止', 'stopped');
|
||||
console.log('录音已停止');
|
||||
this.onStatusUpdate('录音已完全停止', 'stopped');
|
||||
console.log('录音已完全停止,所有资源已释放');
|
||||
}
|
||||
|
||||
// 获取录音状态
|
||||
|
||||
@ -3,7 +3,7 @@ export const config = {
|
||||
// LLM API配置
|
||||
llm: {
|
||||
apiKey: 'd012651b-a65b-4b13-8ff3-cc4ff3a29783', // 请替换为实际的API密钥
|
||||
model: 'bot-20250720193048-84fkp',
|
||||
model: 'bot-20250724150616-xqpz8',
|
||||
},
|
||||
|
||||
// Minimaxi API配置
|
||||
|
||||
@ -194,37 +194,40 @@
|
||||
}
|
||||
|
||||
#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;
|
||||
font-size: 1.1rem;
|
||||
border-radius: 25px;
|
||||
min-width: 200px;
|
||||
background: rgba(0, 123, 255, 0.9);
|
||||
backdrop-filter: blur(10px);
|
||||
}
|
||||
|
||||
#stopButton {
|
||||
width: 60px;
|
||||
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);
|
||||
#startButton:hover:not(:disabled) {
|
||||
background: rgba(22, 163, 74, 0.95);
|
||||
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 {
|
||||
@ -284,12 +287,14 @@
|
||||
|
||||
<!-- 控制按钮 - 悬浮在视频上方 -->
|
||||
<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="结束通话">
|
||||
<svg viewBox="0 0 24 24">
|
||||
<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 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"/>
|
||||
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<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"/>
|
||||
<line x1="18" y1="6" x2="6" y2="18" stroke="white" stroke-width="2"/>
|
||||
</svg>
|
||||
</button>
|
||||
|
||||
16
src/index.js
16
src/index.js
@ -837,8 +837,16 @@ class WebRTCChat {
|
||||
}
|
||||
|
||||
stopCall() {
|
||||
// 停止音频处理器
|
||||
if (this.audioProcessor) {
|
||||
this.audioProcessor.stopRecording();
|
||||
}
|
||||
|
||||
if (this.localStream) {
|
||||
this.localStream.getTracks().forEach(track => track.stop());
|
||||
this.localStream.getTracks().forEach(track => {
|
||||
track.stop();
|
||||
console.log(`停止轨道: ${track.kind}`);
|
||||
});
|
||||
this.localStream = null;
|
||||
}
|
||||
|
||||
@ -855,7 +863,6 @@ class WebRTCChat {
|
||||
|
||||
this.recordedVideo.srcObject = null;
|
||||
this.currentVideo = null;
|
||||
this.currentVideoName.textContent = '未选择视频';
|
||||
|
||||
this.startButton.disabled = false;
|
||||
this.stopButton.disabled = true;
|
||||
@ -863,11 +870,8 @@ class WebRTCChat {
|
||||
// 隐藏结束通话按钮
|
||||
this.stopButton.classList.remove('show');
|
||||
|
||||
this.stopVoiceRecording()
|
||||
this.updateAudioStatus('未连接', 'disconnected');
|
||||
this.logMessage('音频通话已结束', 'info');
|
||||
|
||||
|
||||
this.logMessage('音频通话已结束,所有资源已释放', 'info');
|
||||
}
|
||||
|
||||
async createPeerConnection() {
|
||||
|
||||
@ -29,7 +29,7 @@ async function requestLLMStream({ apiKey, model, messages, onSegment }) {
|
||||
let pendingText = ''; // 待处理的文本片段
|
||||
|
||||
// 分段分隔符
|
||||
const segmentDelimiters = /[,。:;!?,.:;!?]/;
|
||||
const segmentDelimiters = /[,。:;!?,.:;!?]|\.{3,}/;
|
||||
|
||||
while (!done) {
|
||||
const { value, done: doneReading } = await reader.read();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user