From 4cc7247c3733c9c88f343c7432731e9b296e6a88 Mon Sep 17 00:00:00 2001
From: CGD <3030332422@qq.com>
Date: Wed, 4 Jun 2025 14:35:21 +0800
Subject: [PATCH 1/5] =?UTF-8?q?update:funasr=E5=AE=9E=E4=BE=8B=E4=B9=8B?=
=?UTF-8?q?=E5=89=8D=E6=B7=BB=E5=8A=A0=E5=86=85=E5=AD=98=E6=A3=80=E6=B5=8B?=
=?UTF-8?q?=E5=88=A4=E6=96=AD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
main/xiaozhi-server/core/providers/asr/fun_local.py | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/main/xiaozhi-server/core/providers/asr/fun_local.py b/main/xiaozhi-server/core/providers/asr/fun_local.py
index 8c7305c6..4b25a265 100644
--- a/main/xiaozhi-server/core/providers/asr/fun_local.py
+++ b/main/xiaozhi-server/core/providers/asr/fun_local.py
@@ -2,6 +2,7 @@ import time
import os
import sys
import io
+import psutil
from config.logger import setup_logging
from typing import Optional, Tuple, List
from core.providers.asr.base import ASRProviderBase
@@ -37,6 +38,13 @@ class CaptureOutput:
class ASRProvider(ASRProviderBase):
def __init__(self, config: dict, delete_audio_file: bool):
super().__init__()
+
+ # 内存检测,要求大于2G
+ min_mem_bytes = 2 * 1024 * 1024 * 1024
+ total_mem = psutil.virtual_memory().total
+ if total_mem < min_mem_bytes:
+ logger.bind(tag=TAG).error(f"可用内存不足2G,当前仅有 {total_mem / (1024*1024):.2f} MB")
+
self.interface_type = InterfaceType.LOCAL
self.model_dir = config.get("model_dir")
self.output_dir = config.get("output_dir") # 修正配置键名
From 0268f90e9c69ae0ac9556cdcbebf59946ce76938 Mon Sep 17 00:00:00 2001
From: CGD <3030332422@qq.com>
Date: Wed, 4 Jun 2025 14:46:52 +0800
Subject: [PATCH 2/5] =?UTF-8?q?update=EF=BC=9A=E4=BF=AE=E6=94=B9=E6=97=A5?=
=?UTF-8?q?=E5=BF=97=E6=A8=A1=E5=9D=97=EF=BC=8C=E4=BD=BF=E5=85=B6=E6=8C=89?=
=?UTF-8?q?=E6=97=A5=E6=9C=9F=E5=92=8C=E5=A4=A7=E5=B0=8F=E5=88=86=E5=89=B2?=
=?UTF-8?q?=E7=9A=84=E6=97=A5=E5=BF=97=E6=96=87=E4=BB=B6=E5=90=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
main/xiaozhi-server/config/logger.py | 91 +++++++++++++++++++++++-----
1 file changed, 75 insertions(+), 16 deletions(-)
diff --git a/main/xiaozhi-server/config/logger.py b/main/xiaozhi-server/config/logger.py
index 5f107f5d..e5bf8466 100644
--- a/main/xiaozhi-server/config/logger.py
+++ b/main/xiaozhi-server/config/logger.py
@@ -3,15 +3,16 @@ import sys
from loguru import logger
from config.config_loader import load_config
from config.settings import check_config_file
+from datetime import datetime
SERVER_VERSION = "0.5.2"
_logger_initialized = False
-
+_current_log_file = None
+_current_log_size = 0
+_max_log_size = 10 * 1024 * 1024 # 10MB
def get_module_abbreviation(module_name, module_dict):
- """获取模块名称的缩写,如果为空则返回00
- 如果名称中包含下划线,则返回下划线后面的前两个字符
- """
+ """获取模块名称的缩写,如果为空则返回00"""
module_value = module_dict.get(module_name, "")
if not module_value:
return "00"
@@ -20,7 +21,6 @@ def get_module_abbreviation(module_name, module_dict):
return parts[-1][:2] if parts[-1] else "00"
return module_value[:2]
-
def build_module_string(selected_module):
"""构建模块字符串"""
return (
@@ -32,12 +32,59 @@ def build_module_string(selected_module):
+ get_module_abbreviation("Intent", selected_module)
)
-
def formatter(record):
"""为没有 tag 的日志添加默认值"""
record["extra"].setdefault("tag", record["name"])
return record["message"]
+def get_log_filename(log_dir, base_name):
+ """生成按日期和大小分割的日志文件名"""
+ global _current_log_file, _current_log_size
+
+ now = datetime.now()
+ date_part = f"{now.month}.{now.day}"
+
+ # 检查是否需要创建新文件
+ if _current_log_file is None or not os.path.exists(_current_log_file):
+ file_index = 1
+ while True:
+ new_filename = os.path.join(log_dir, f"{base_name}.{date_part}.{file_index}")
+ if not os.path.exists(new_filename):
+ _current_log_file = new_filename
+ _current_log_size = 0
+ return new_filename
+ # 如果文件已存在,增加索引
+ file_index += 1
+ else:
+ # 检查文件大小
+ if _current_log_size > _max_log_size:
+ # 文件过大,创建新文件
+ base_path = os.path.splitext(_current_log_file)[0]
+ parts = base_path.split('.')
+ if len(parts) >= 3:
+ try:
+ file_index = int(parts[-1]) + 1
+ except ValueError:
+ file_index = 1
+ else:
+ file_index = 1
+
+ new_filename = f"{base_path.rsplit('.', 1)[0]}.{file_index}"
+ _current_log_file = new_filename
+ _current_log_size = 0
+ return new_filename
+ else:
+ return _current_log_file
+
+def update_log_size(message):
+ """更新当前日志文件大小"""
+ global _current_log_size
+ # 如果当前日志文件存在,获取其大小
+ if _current_log_file and os.path.exists(_current_log_file):
+ _current_log_size = os.path.getsize(_current_log_file)
+ else:
+ # 如果当前日志文件不存在,重置大小
+ _current_log_size = len(message.encode('utf-8'))
def setup_logging():
check_config_file()
@@ -52,7 +99,7 @@ def setup_logging():
extra={
"selected_module": log_config.get("selected_module", "00000000000000")
}
- ) # 新增配置
+ )
log_format = log_config.get(
"log_format",
"{time:YYMMDD HH:mm:ss}[{version}_{extra[selected_module]}][{extra[tag]}]-{level}-{message}",
@@ -72,7 +119,7 @@ def setup_logging():
log_level = log_config.get("log_level", "INFO")
log_dir = log_config.get("log_dir", "tmp")
- log_file = log_config.get("log_file", "server.log")
+ log_file = log_config.get("log_file", "server")
data_dir = log_config.get("data_dir", "data")
os.makedirs(log_dir, exist_ok=True)
@@ -84,18 +131,23 @@ def setup_logging():
# 输出到控制台
logger.add(sys.stdout, format=log_format, level=log_level, filter=formatter)
- # 输出到文件
+ # 输出到文件,使用自定义的日志文件名生成器
+ def sink(message):
+ filename = get_log_filename(log_dir, log_file)
+ with open(filename, "a", encoding="utf-8") as f:
+ f.write(message + "\n")
+ update_log_size(message)
+
logger.add(
- os.path.join(log_dir, log_file),
+ sink,
format=log_format_file,
level=log_level,
filter=formatter,
)
- _logger_initialized = True # 标记为已初始化
+ _logger_initialized = True
return logger
-
def update_module_string(selected_module_str):
"""更新模块字符串并重新配置日志处理器"""
logger.debug(f"更新日志配置组件")
@@ -126,6 +178,9 @@ def update_module_string(selected_module_str):
"{selected_module}", selected_module_str
)
+ log_dir = log_config.get("log_dir", "tmp")
+ log_file = log_config.get("log_file", "server")
+
logger.remove()
logger.add(
sys.stdout,
@@ -133,11 +188,15 @@ def update_module_string(selected_module_str):
level=log_config.get("log_level", "INFO"),
filter=formatter,
)
+
+ def sink(message):
+ filename = get_log_filename(log_dir, log_file)
+ with open(filename, "a", encoding="utf-8") as f:
+ f.write(message + "\n")
+ update_log_size(message)
+
logger.add(
- os.path.join(
- log_config.get("log_dir", "tmp"),
- log_config.get("log_file", "server.log"),
- ),
+ sink,
format=log_format_file,
level=log_config.get("log_level", "INFO"),
filter=formatter,
From fba758ea36024629236e80359fc9d8f8dbc9f68f Mon Sep 17 00:00:00 2001
From: CGD <3030332422@qq.com>
Date: Wed, 4 Jun 2025 15:42:52 +0800
Subject: [PATCH 3/5] =?UTF-8?q?update:=E6=81=A2=E5=A4=8D=E6=9C=80=E5=88=9D?=
=?UTF-8?q?=E7=9A=84=E6=97=A5=E5=BF=97=E6=A8=A1=E5=9D=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
main/xiaozhi-server/config/logger.py | 93 +++++-----------------------
1 file changed, 17 insertions(+), 76 deletions(-)
diff --git a/main/xiaozhi-server/config/logger.py b/main/xiaozhi-server/config/logger.py
index e5bf8466..643952dd 100644
--- a/main/xiaozhi-server/config/logger.py
+++ b/main/xiaozhi-server/config/logger.py
@@ -3,16 +3,15 @@ import sys
from loguru import logger
from config.config_loader import load_config
from config.settings import check_config_file
-from datetime import datetime
-SERVER_VERSION = "0.5.2"
+SERVER_VERSION = "0.5.4"
_logger_initialized = False
-_current_log_file = None
-_current_log_size = 0
-_max_log_size = 10 * 1024 * 1024 # 10MB
+
def get_module_abbreviation(module_name, module_dict):
- """获取模块名称的缩写,如果为空则返回00"""
+ """获取模块名称的缩写,如果为空则返回00
+ 如果名称中包含下划线,则返回下划线后面的前两个字符
+ """
module_value = module_dict.get(module_name, "")
if not module_value:
return "00"
@@ -21,6 +20,7 @@ def get_module_abbreviation(module_name, module_dict):
return parts[-1][:2] if parts[-1] else "00"
return module_value[:2]
+
def build_module_string(selected_module):
"""构建模块字符串"""
return (
@@ -32,59 +32,12 @@ def build_module_string(selected_module):
+ get_module_abbreviation("Intent", selected_module)
)
+
def formatter(record):
"""为没有 tag 的日志添加默认值"""
record["extra"].setdefault("tag", record["name"])
return record["message"]
-def get_log_filename(log_dir, base_name):
- """生成按日期和大小分割的日志文件名"""
- global _current_log_file, _current_log_size
-
- now = datetime.now()
- date_part = f"{now.month}.{now.day}"
-
- # 检查是否需要创建新文件
- if _current_log_file is None or not os.path.exists(_current_log_file):
- file_index = 1
- while True:
- new_filename = os.path.join(log_dir, f"{base_name}.{date_part}.{file_index}")
- if not os.path.exists(new_filename):
- _current_log_file = new_filename
- _current_log_size = 0
- return new_filename
- # 如果文件已存在,增加索引
- file_index += 1
- else:
- # 检查文件大小
- if _current_log_size > _max_log_size:
- # 文件过大,创建新文件
- base_path = os.path.splitext(_current_log_file)[0]
- parts = base_path.split('.')
- if len(parts) >= 3:
- try:
- file_index = int(parts[-1]) + 1
- except ValueError:
- file_index = 1
- else:
- file_index = 1
-
- new_filename = f"{base_path.rsplit('.', 1)[0]}.{file_index}"
- _current_log_file = new_filename
- _current_log_size = 0
- return new_filename
- else:
- return _current_log_file
-
-def update_log_size(message):
- """更新当前日志文件大小"""
- global _current_log_size
- # 如果当前日志文件存在,获取其大小
- if _current_log_file and os.path.exists(_current_log_file):
- _current_log_size = os.path.getsize(_current_log_file)
- else:
- # 如果当前日志文件不存在,重置大小
- _current_log_size = len(message.encode('utf-8'))
def setup_logging():
check_config_file()
@@ -99,7 +52,7 @@ def setup_logging():
extra={
"selected_module": log_config.get("selected_module", "00000000000000")
}
- )
+ ) # 新增配置
log_format = log_config.get(
"log_format",
"{time:YYMMDD HH:mm:ss}[{version}_{extra[selected_module]}][{extra[tag]}]-{level}-{message}",
@@ -119,7 +72,7 @@ def setup_logging():
log_level = log_config.get("log_level", "INFO")
log_dir = log_config.get("log_dir", "tmp")
- log_file = log_config.get("log_file", "server")
+ log_file = log_config.get("log_file", "server.log")
data_dir = log_config.get("data_dir", "data")
os.makedirs(log_dir, exist_ok=True)
@@ -131,23 +84,18 @@ def setup_logging():
# 输出到控制台
logger.add(sys.stdout, format=log_format, level=log_level, filter=formatter)
- # 输出到文件,使用自定义的日志文件名生成器
- def sink(message):
- filename = get_log_filename(log_dir, log_file)
- with open(filename, "a", encoding="utf-8") as f:
- f.write(message + "\n")
- update_log_size(message)
-
+ # 输出到文件
logger.add(
- sink,
+ os.path.join(log_dir, log_file),
format=log_format_file,
level=log_level,
filter=formatter,
)
- _logger_initialized = True
+ _logger_initialized = True # 标记为已初始化
return logger
+
def update_module_string(selected_module_str):
"""更新模块字符串并重新配置日志处理器"""
logger.debug(f"更新日志配置组件")
@@ -178,9 +126,6 @@ def update_module_string(selected_module_str):
"{selected_module}", selected_module_str
)
- log_dir = log_config.get("log_dir", "tmp")
- log_file = log_config.get("log_file", "server")
-
logger.remove()
logger.add(
sys.stdout,
@@ -188,15 +133,11 @@ def update_module_string(selected_module_str):
level=log_config.get("log_level", "INFO"),
filter=formatter,
)
-
- def sink(message):
- filename = get_log_filename(log_dir, log_file)
- with open(filename, "a", encoding="utf-8") as f:
- f.write(message + "\n")
- update_log_size(message)
-
logger.add(
- sink,
+ os.path.join(
+ log_config.get("log_dir", "tmp"),
+ log_config.get("log_file", "server.log"),
+ ),
format=log_format_file,
level=log_config.get("log_level", "INFO"),
filter=formatter,
From 8df9846ad7b89c4d91528599d3bbe5b9c4922e84 Mon Sep 17 00:00:00 2001
From: CGD <3030332422@qq.com>
Date: Thu, 5 Jun 2025 09:46:54 +0800
Subject: [PATCH 4/5] =?UTF-8?q?update:=E6=94=B9=E4=B8=BA=E9=87=87=E7=94=A8?=
=?UTF-8?q?=E6=97=A5=E5=BF=97=E8=BD=AE=E8=BD=AC=E6=9C=BA=E5=88=B6=EF=BC=8C?=
=?UTF-8?q?=E5=90=8C=E6=97=B6=E6=B7=BB=E5=8A=A0=E8=87=AA=E5=8A=A8=E6=B8=85?=
=?UTF-8?q?=E7=90=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
main/xiaozhi-server/config/logger.py | 40 ++++++++++++++++++++++------
1 file changed, 32 insertions(+), 8 deletions(-)
diff --git a/main/xiaozhi-server/config/logger.py b/main/xiaozhi-server/config/logger.py
index 643952dd..7bd22c43 100644
--- a/main/xiaozhi-server/config/logger.py
+++ b/main/xiaozhi-server/config/logger.py
@@ -3,6 +3,7 @@ import sys
from loguru import logger
from config.config_loader import load_config
from config.settings import check_config_file
+from datetime import datetime
SERVER_VERSION = "0.5.4"
_logger_initialized = False
@@ -59,7 +60,7 @@ def setup_logging():
)
log_format_file = log_config.get(
"log_format_file",
- "{time:YYYY-MM-DD HH:mm:ss} - {version_{extra[selected_module]}} - {name} - {level} - {extra[tag]} - {message}",
+ "{time:YYYY-MM-DD HH:mm:ss} - {version}_{extra[selected_module]} - {name} - {level} - {extra[tag]} - {message}",
)
selected_module_str = logger._core.extra["selected_module"]
@@ -84,12 +85,23 @@ def setup_logging():
# 输出到控制台
logger.add(sys.stdout, format=log_format, level=log_level, filter=formatter)
- # 输出到文件
+ # 输出到文件 - 统一目录,按大小轮转
+ # 日志文件完整路径
+ log_file_path = os.path.join(log_dir, log_file)
+
+ # 添加日志处理器
logger.add(
- os.path.join(log_dir, log_file),
+ log_file_path,
format=log_format_file,
level=log_level,
filter=formatter,
+ rotation="10 MB", # 每个文件最大10MB
+ retention="30 days", # 保留30天
+ compression=None,
+ encoding="utf-8",
+ enqueue=True, # 异步安全
+ backtrace=True,
+ diagnose=True,
)
_logger_initialized = True # 标记为已初始化
@@ -116,7 +128,7 @@ def update_module_string(selected_module_str):
)
log_format_file = log_config.get(
"log_format_file",
- "{time:YYYY-MM-DD HH:mm:ss} - {version_{extra[selected_module]}} - {name} - {level} - {extra[tag]} - {message}",
+ "{time:YYYY-MM-DD HH:mm:ss} - {version}_{extra[selected_module]} - {name} - {level} - {extra[tag]} - {message}",
)
log_format = log_format.replace("{version}", SERVER_VERSION)
@@ -133,14 +145,26 @@ def update_module_string(selected_module_str):
level=log_config.get("log_level", "INFO"),
filter=formatter,
)
+
+ # 更新文件日志配置 - 统一目录,按大小轮转
+ log_dir = log_config.get("log_dir", "tmp")
+ log_file = log_config.get("log_file", "server.log")
+
+ # 日志文件完整路径
+ log_file_path = os.path.join(log_dir, log_file)
+
logger.add(
- os.path.join(
- log_config.get("log_dir", "tmp"),
- log_config.get("log_file", "server.log"),
- ),
+ log_file_path,
format=log_format_file,
level=log_config.get("log_level", "INFO"),
filter=formatter,
+ rotation="10 MB", # 每个文件最大10MB
+ retention="30 days", # 保留30天
+ compression=None,
+ encoding="utf-8",
+ enqueue=True, # 异步安全
+ backtrace=True,
+ diagnose=True,
)
except Exception as e:
From 3eb3a4502f7b651b460576feb552c15670dd4b2a Mon Sep 17 00:00:00 2001
From: hrz <1710360675@qq.com>
Date: Fri, 6 Jun 2025 14:08:38 +0800
Subject: [PATCH 5/5] Update fun_local.py
---
main/xiaozhi-server/core/providers/asr/fun_local.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/main/xiaozhi-server/core/providers/asr/fun_local.py b/main/xiaozhi-server/core/providers/asr/fun_local.py
index 4b25a265..e907bdce 100644
--- a/main/xiaozhi-server/core/providers/asr/fun_local.py
+++ b/main/xiaozhi-server/core/providers/asr/fun_local.py
@@ -43,7 +43,7 @@ class ASRProvider(ASRProviderBase):
min_mem_bytes = 2 * 1024 * 1024 * 1024
total_mem = psutil.virtual_memory().total
if total_mem < min_mem_bytes:
- logger.bind(tag=TAG).error(f"可用内存不足2G,当前仅有 {total_mem / (1024*1024):.2f} MB")
+ logger.bind(tag=TAG).error(f"可用内存不足2G,当前仅有 {total_mem / (1024*1024):.2f} MB,可能无法启动FunASR")
self.interface_type = InterfaceType.LOCAL
self.model_dir = config.get("model_dir")