import os import ssl import time import logging import socket import queue import base64 from threading import Thread from config import Global from utils.other import terminate_thread from src.asr import speech_recognition from flask import Flask, send_from_directory from flask_socketio import SocketIO, emit port = Global.weblive2d["port"] cert_file = 'assets\cert.pem' key_file = 'assets\key.pem' app = Flask(__name__, static_folder='.') app.config['SECRET_KEY'] = 'live2dchat' socketio = SocketIO(app, cors_allowed_origins="*") logging.getLogger('werkzeug').setLevel(logging.ERROR) class AudioStream: def __init__(self): self.buffer = queue.Queue(10) def write(self, data): self.buffer.put(data) def read(self, chunk_size=None): chunk_size *= 2 data = b'' while len(data) != chunk_size: data += self.buffer.get() if len(data) > chunk_size: remaining = data[chunk_size:] self.buffer.put(remaining) data = data[:chunk_size] return data def generate_html(): """动态生成HTML内容""" # 嘴型同步参数配置 mouth_sync_config = { 'smoothing_factor': 0.3, # 平滑系数 (0-1) 'silence_threshold': 0, # 静音阈值 'max_rms_scale': Global.character["max_rms_scale"]*Global.weblive2d["max_rms_scale"], # 最大RMS缩放 'mouth_scale': 1.0, # 整体嘴巴开合缩放 'power_exponent': 2.0, # 非线性变换指数 'update_interval': 16, # 更新间隔(ms),16约等于60fps 'close_speed': 0.85 # 嘴巴关闭速度 } return f"""