Skip to content

xiaozhi esp32的C#服务端,帮助你搭建属于自己的小智服务。Helps you build your own xiaozhi esp32 back-end service.

License

Notifications You must be signed in to change notification settings

mm7h/XiaoZhi.Net

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SVG Banners

GitHub Contributors Issues GitHub pull requests

项目简介

(中文 | English

XiaoZhi.Net.Server 是参照 xiaozhi-esp32-server 项目使用基于C#开发。 你可以将它集成到任何支持 .Net Standard 2.1的应用程序中。

快速开始 👋

自定义插件 👇️

插件需遵循 SemanticKernel 规范。 以下是一个获取当前时间的例子:

using Microsoft.SemanticKernel;
using System.ComponentModel;

[Description("获取关于当前日期和时间插件")]
internal class GetTime
{
    [KernelFunction, Description("获取当前的日期和时间")]
    public DateTime GetNowTime()
    {
        return DateTime.Now;
    }
}

启动 Xiao Zhi 服务 👇️

static async Task StartXiaoZhiServer()
{
    // 获取服务引擎
    IServerEngine serverEngine = EngineFactory.GetServerEngine();
    try
    {
        Console.WriteLine("Hello, Xiao Zhi!");

        string configJson = File.ReadAllText(Path.Combine(Environment.CurrentDirectory, "configs", "config.json"));

        // 快速从json文件中获取配置信息
        XiaoZhiConfig? config = Newtonsoft.Json.JsonConvert.DeserializeObject<XiaoZhiConfig>(configJson);
        if (config != null)
        {
            // 开始初始化服务
            await serverEngine.Initialize(config)
                // 添加插件
                .WithPlugin<PlayMusic>(nameof(PlayMusic))
                .WithPlugin<GetTime>(nameof(GetTime))
                .WithPlugin<ConversationSummary>(nameof(ConversationSummary))
                .StartAsync();

            Console.WriteLine("Type \"exit\" to stop the service.");

            while (true)
            {
                // 输入exit退出
                string? resKey = Console.ReadLine();
                if (!string.IsNullOrEmpty(resKey) && resKey.ToLower() == "exit")
                {
                    break;
                }
            }
        }
        else
        {
            Console.WriteLine("Cannot read the config settings.");
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Got an error: {ex.Message}");
    }
    finally
    {
        if (serverEngine.Started)
        {
            await serverEngine.StopAsync();
        }
        Console.WriteLine("The server stopped.");
    }
}

目前已测试通过的小智客户端 🖥️

功能清单 ✨

已实现 ✅

  • 通信协议 基于 xiaozhi-esp32 协议,通过 WebSocket 实现数据交互。
  • 对话交互 支持唤醒对话、手动对话及实时打断。长时间无对话时自动休眠
  • 多语言识别 默认使用本地模型 Sense Voice,可支持国语、粤语、英语等。
  • LLM 模块 支持灵活切换 LLM 模块,目前只实现了 ChatGLMLLM,理论上支持Open AI Api规范的LLM都可以快速接入。
  • TTS 模块 默认使用本地模型 Kokoro
  • 记忆功能 以设备和当前连接为单位的记忆缓存。
  • 自定义发送文字内容 可以向指定的设备发送文字内容,并让设备朗读出来。

后续开发 🚧

  • 更多的本地模型支持
  • 意图识别
  • 音乐播放
  • 对接更多第三方 LLM、TTS 服务
  • IOT功能
  • 智控台管理( Abp

本项目已接入的平台/组件列表 📋

LLM 语言模型

类型 平台名称 使用方式 收费模式 备注
LLM 智谱(ChatGLMLLM) openai 接口调用 免费 需要申请密钥

TTS 语音合成

类型 平台 / 模型 名称 使用方式 收费模式 备注
TTS Kokoro (multi-lang-v1_1) 本地调用 免费

VAD 语音活动检测

类型 模型名称 使用方式 收费模式 备注
VAD SileroVAD (v5) 本地调用 免费

ASR 语音识别

类型 平台 / 模型 名称 使用方式 收费模式 备注
ASR Sense Voice (2024-07-17) 本地调用 免费

Punctuation 标点符号添加

类型 平台 / 模型 名称 使用方式 收费模式 备注
PUN CT Transformer (2024-04-12) 本地调用 免费 对ASR识别出的文字添加标点,便于LLM理解

Memory 记忆存储

类型 平台名称 使用方式 收费模式 备注
Memory 本地缓存 本地调用 免费 服务端停止后所有记忆将会丢失

注意事项⚠️

一、文件目录

.
├── configs
│   └── config.json 主配置文件
├── data
│   └── tts-cache # 当开启保存tts生成的文件后,生成的语音将会保存在这里
├── logs # 系统日志文件
├── models  # 所有模型存放的目录
│   ├── asr  # 模型类型
│   │   └── sense-voice  # 模型名称文件夹
│   │       ├── model.onnx  # 模型文件
│   │       └── tokens.txt  # 模型所需tokens文件
│   ├── punctuation
│   │   └── ct-transformer
│   │       └── model.onnx  # 模型文件
│   ├── tts
│   │   └── kokoro
│   │       ├── dict
│   │       ├── espeak-ng-data
│   │       ├── lexicon
│   │       │   └── lexicon-xxxx.txt  # 余下的3个txt文件
│   │       ├── model.onnx  # 模型文件
│   │       ├── tokens.txt  # 模型所需tokens文件
│   │       └── voices.bin  # 模型音色文件
│   └── vad
│       └── silero
│           └── model.onnx  # 模型文件
└── XiaoZhi.Net.Test.exe # 测试主程序

二、模型下载

从上面的模型列表中下载好本地模型后,在models文件夹中,根据文件目录结构将模型放在对应的文件夹中。

*注意模型文件.onnx需要统一命名为model.onnx

三、程序运行

点击XiaoZhi.Net.Test.exe运行后,将会在控制台中显示当前监听的websocket地址,将其复制到你的小智客户端中即可。 如果需要完整打印服务端日志,可以在config.json中将LogSetting项的LogLevel改为DEBUG

贡献🙌

本项目初衷是为 .Net 生态贡献一份力,抛砖引玉。

由于目前只实现了基础功能,在项目使用中如果遇到任何问题,欢迎提交 Issues 和 Pull Requests!

特别鸣谢

项目名称
xiaozhi esp32
xiaozhi-esp32-server (python)
sherpa-onnx
Yi.Abp

许可证📝

MIT License

About

xiaozhi esp32的C#服务端,帮助你搭建属于自己的小智服务。Helps you build your own xiaozhi esp32 back-end service.

Topics

Resources

License

Stars

Watchers

Forks

Languages