这是一个本地 Ollama + Node.js + PostgreSQL 的简单 demo 仓库。
目前仓库里有两块主要能力:
- 文字聊天 demo:基于 Ollama、本地记忆和 PostgreSQL
- 语音识别 demo:基于
sherpa-onnx,支持离线wav和浏览器实时麦克风
commands/: 启动和辅助命令src/: 文字聊天主逻辑services/speech-demo/: 语音识别 demo 服务SOUL.md: 默认系统提示词.session.json: 当前会话的持久化状态
commands/start.cmd: 启动聊天程序commands/start-qwen.cmd: 直接用 Ollama 启动qwen3.5:9bcommands/history.cmd: 查看最近 20 条聊天记录commands/clear-history.cmd: 清空聊天记录src/start.js: 事件驱动的聊天程序入口src/ollamaClient.js: 对 Ollama 请求的封装src/chatMemory.js: PostgreSQL 存储封装src/history.js: 读取并打印聊天记录src/clear-history.js: 清空聊天记录表src/sessionStore.js: 保存当前session_idservices/speech-demo/src/server.js: 语音 demo 的 HTTP + WebSocket 入口
先把 commands/start.cmd 里的数据库配置改成你自己的,然后运行:
.\commands\start.cmd默认会复用上一次的 session_id。
如果你想创建一个新的会话,可以这样启动:
.\commands\start.cmd new-session输入 debug 可以打开或关闭调试模式。打开后,每次请求都会在控制台打印发给模型的完整 payload。
如果你想直接通过 Ollama 启动 qwen3.5:9b,可以运行:
.\commands\start-qwen.cmd它等价于:
ollama run qwen3.5:9bsrc/ollamaClient.js 当前提供三种可复用方法:
chatWithOllama(message, options): 默认请求chatWithThinking(message, options): 显式要求模型启用 thinkingchatWithoutThinking(message, options): 显式要求模型返回不 think 的回答
先把 commands/history.cmd 里的数据库配置改成你自己的,然后运行:
.\commands\history.cmd先把 commands/clear-history.cmd 里的数据库配置改成你自己的,然后运行:
.\commands\clear-history.cmd仓库里新增了一个独立的 sherpa-onnx 语音识别服务,位于:
services/speech-demo/
它目前支持两种模式:
- 离线模式:上传
wav文件后做 VAD + ASR - 实时模式:浏览器麦克风 -> WebSocket ->
20ms PCM分帧 -> Node 侧VAD + ASR
当前只做到“终端打印识别结果”,还没有接 LLM 和 TTS。
在仓库根目录执行:
npm run speech-demo:modelschcp 65001
npm run speech-demo默认地址:
http://127.0.0.1:3301
启动服务后,直接打开:
http://127.0.0.1:3301
页面会请求麦克风权限,然后把音频按下面格式实时发送给 Node:
16kHzmonoint16 PCM20ms一帧- WebSocket 路径为
/ws
Node 端会持续接收音频帧,并用 silero_vad + SenseVoice 做分段识别,结果会打印到终端,同时显示在网页上。
可以直接调用内置样例:
Invoke-RestMethod -Method Post http://127.0.0.1:3301/recognize/sample当前离线接口要求:
wav单声道16kHz
示例:
$form = @{
audio = Get-Item "D:\path\to\your.wav"
}
Invoke-RestMethod `
-Method Post `
-Uri http://127.0.0.1:3301/recognize `
-Form $form更完整的语音 demo 说明见: services/speech-demo/README.md