[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-juanmc2005--diart":3,"tool-juanmc2005--diart":61},[4,18,26,36,44,53],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":17},4358,"openclaw","openclaw\u002Fopenclaw","OpenClaw 是一款专为个人打造的本地化 AI 助手，旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚，能够直接接入你日常使用的各类通讯渠道，包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息，OpenClaw 都能即时响应，甚至支持在 macOS、iOS 和 Android 设备上进行语音交互，并提供实时的画布渲染功能供你操控。\n\n这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地，用户无需依赖云端服务即可享受快速、私密的智能辅助，真正实现了“你的数据，你做主”。其独特的技术亮点在于强大的网关架构，将控制平面与核心助手分离，确保跨平台通信的流畅性与扩展性。\n\nOpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者，以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力（支持 macOS、Linux 及 Windows WSL2），即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你",349277,3,"2026-04-06T06:32:30",[13,14,15,16],"Agent","开发框架","图像","数据工具","ready",{"id":19,"name":20,"github_repo":21,"description_zh":22,"stars":23,"difficulty_score":10,"last_commit_at":24,"category_tags":25,"status":17},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,"2026-04-05T11:01:52",[14,15,13],{"id":27,"name":28,"github_repo":29,"description_zh":30,"stars":31,"difficulty_score":32,"last_commit_at":33,"category_tags":34,"status":17},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",160784,2,"2026-04-19T11:32:54",[14,13,35],"语言模型",{"id":37,"name":38,"github_repo":39,"description_zh":40,"stars":41,"difficulty_score":32,"last_commit_at":42,"category_tags":43,"status":17},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",109154,"2026-04-18T11:18:24",[14,15,13],{"id":45,"name":46,"github_repo":47,"description_zh":48,"stars":49,"difficulty_score":32,"last_commit_at":50,"category_tags":51,"status":17},6121,"gemini-cli","google-gemini\u002Fgemini-cli","gemini-cli 是一款由谷歌推出的开源 AI 命令行工具，它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言，它提供了一条从输入提示词到获取模型响应的最短路径，无需切换窗口即可享受智能辅助。\n\n这款工具主要解决了开发过程中频繁上下文切换的痛点，让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用，还是执行复杂的 Git 操作，gemini-cli 都能通过自然语言指令高效处理。\n\n它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口，具备出色的逻辑推理能力；内置 Google 搜索、文件操作及 Shell 命令执行等实用工具；更独特的是，它支持 MCP（模型上下文协议），允许用户灵活扩展自定义集成，连接如图像生成等外部能力。此外，个人谷歌账号即可享受免费的额度支持，且项目基于 Apache 2.0 协议完全开源，是提升终端工作效率的理想助手。",100752,"2026-04-10T01:20:03",[52,13,15,14],"插件",{"id":54,"name":55,"github_repo":56,"description_zh":57,"stars":58,"difficulty_score":32,"last_commit_at":59,"category_tags":60,"status":17},4721,"markitdown","microsoft\u002Fmarkitdown","MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具，专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片（含 OCR）、音频（含语音转录）、HTML 乃至 YouTube 链接等多种格式的解析，能够精准提取文档中的标题、列表、表格和链接等关键结构信息。\n\n在人工智能应用日益普及的今天，大语言模型（LLM）虽擅长处理文本，却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点，它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式，成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外，它还提供了 MCP（模型上下文协议）服务器，可无缝集成到 Claude Desktop 等 LLM 应用中。\n\n这款工具特别适合开发者、数据科学家及 AI 研究人员使用，尤其是那些需要构建文档检索增强生成（RAG）系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性，但其核心优势在于为机器",93400,"2026-04-06T19:52:38",[52,14],{"id":62,"github_repo":63,"name":64,"description_en":65,"description_zh":66,"ai_summary_zh":66,"readme_en":67,"readme_zh":68,"quickstart_zh":69,"use_case_zh":70,"hero_image_url":71,"owner_login":72,"owner_name":73,"owner_avatar_url":74,"owner_bio":75,"owner_company":76,"owner_location":77,"owner_email":78,"owner_twitter":72,"owner_website":79,"owner_url":80,"languages":81,"stars":86,"forks":87,"last_commit_at":88,"license":89,"difficulty_score":10,"env_os":90,"env_gpu":91,"env_ram":92,"env_deps":93,"category_tags":105,"github_topics":107,"view_count":32,"oss_zip_url":78,"oss_zip_packed_at":78,"status":17,"created_at":115,"updated_at":116,"faqs":117,"releases":152},9616,"juanmc2005\u002Fdiart","diart","A python package to build AI-powered real-time audio applications","diart 是一个专为构建实时音频应用而设计的 Python 框架，其核心能力在于利用人工智能技术，在对话进行的同时精准识别并区分不同的说话人（即“说话人日记”任务）。它有效解决了传统音频分析工具难以低延迟处理流式音频、无法随对话推进动态优化识别结果的痛点。\n\n该工具特别适合音频领域的开发者、研究人员以及需要集成实时语音功能的技术团队使用。无论是开发在线会议系统、实时字幕服务，还是进行语音交互研究，diart 都能提供强大的底层支持。\n\ndiart 的独特亮点在于其先进的增量聚类算法。它巧妙结合了说话人分割模型与嵌入模型，使得识别准确率能随着对话时长的增加而不断提升。此外，diart 不仅提供了开箱即用的预训练流程（涵盖说话人分离、语音活动检测等），还允许用户自定义管道、微调超参数，甚至通过 WebSockets 轻松将模型部署到 Web 端。作为一个由学术研究驱动的项目，它在保持高性能的同时，也兼顾了灵活性与易用性，帮助创作者轻松打造下一代智能音频应用。","\u003Cp align=\"center\">\n\u003Cimg width=\"100%\" src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fjuanmc2005_diart_readme_132ef32b72ff.jpg\" title=\"diart logo\" \u002F>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n\u003Ci>🌿 Build AI-powered real-time audio applications in a breeze 🌿\u003C\u002Fi>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n\u003Cimg alt=\"PyPI Version\" src=\"https:\u002F\u002Fimg.shields.io\u002Fpypi\u002Fv\u002Fdiart?color=g\">\n\u003Cimg alt=\"PyPI Downloads\" src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fjuanmc2005_diart_readme_c90212a7a87e.png\">\n\u003Cimg alt=\"Python Versions\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fpython-3.10%20%7C%203.11%20%7C%203.12-dark_green\">\n\u003Cimg alt=\"Code size in bytes\" src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flanguages\u002Fcode-size\u002Fjuanmc2005\u002FStreamingSpeakerDiarization?color=g\">\n\u003Cimg alt=\"License\" src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002Fjuanmc2005\u002FStreamingSpeakerDiarization?color=g\">\n\u003Ca href=\"https:\u002F\u002Fjoss.theoj.org\u002Fpapers\u002Fcc9807c6de75ea4c29025c7bd0d31996\">\u003Cimg src=\"https:\u002F\u002Fjoss.theoj.org\u002Fpapers\u002Fcc9807c6de75ea4c29025c7bd0d31996\u002Fstatus.svg\">\u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cdiv align=\"center\">\n  \u003Ch4>\n    \u003Ca href=\"#-installation\">\n      💾 Installation\n    \u003C\u002Fa>\n    \u003Cspan> | \u003C\u002Fspan>\n    \u003Ca href=\"#%EF%B8%8F-stream-audio\">\n      🎙️ Stream audio\n    \u003C\u002Fa>\n    \u003Cspan> | \u003C\u002Fspan>\n    \u003Ca href=\"#-models\">\n      🧠 Models\n    \u003C\u002Fa>\n    \u003Cbr \u002F>\n    \u003Ca href=\"#-tune-hyper-parameters\">\n      📈 Tuning\n    \u003C\u002Fa>\n    \u003Cspan> | \u003C\u002Fspan>\n    \u003Ca href=\"#-build-pipelines\">\n      🧠🔗 Pipelines\n    \u003C\u002Fa>\n    \u003Cspan> | \u003C\u002Fspan>\n    \u003Ca href=\"#-websockets\">\n      🌐 WebSockets\n    \u003C\u002Fa>\n    \u003Cspan> | \u003C\u002Fspan>\n    \u003Ca href=\"#-powered-by-research\">\n      🔬 Research\n    \u003C\u002Fa>\n  \u003C\u002Fh4>\n\u003C\u002Fdiv>\n\n\u003Cbr\u002F>\n\n\u003Cp align=\"center\">\n\u003Cimg width=\"100%\" src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fjuanmc2005_diart_readme_eb248f88ad04.gif\" title=\"Real-time diarization example\" \u002F>\n\u003C\u002Fp>\n\n## ⚡ Quick introduction\n\nDiart is a python framework to build AI-powered real-time audio applications.\nIts key feature is the ability to recognize different speakers in real time with state-of-the-art performance,\na task commonly known as \"speaker diarization\".\n\nThe pipeline `diart.SpeakerDiarization` combines a speaker segmentation and a speaker embedding model\nto power an incremental clustering algorithm that gets more accurate as the conversation progresses:\n\n\u003Cp align=\"center\">\n\u003Cimg width=\"100%\" src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fjuanmc2005_diart_readme_f463b82d718a.gif\" title=\"Real-time speaker diarization pipeline\" \u002F>\n\u003C\u002Fp>\n\nWith diart you can also create your own custom AI pipeline, benchmark it,\ntune its hyper-parameters, and even serve it on the web using websockets.\n\n**We provide pre-trained pipelines for:**\n\n- Speaker Diarization\n- Voice Activity Detection\n- Transcription ([coming soon](https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002Fdiart\u002Fpull\u002F144))\n- [Speaker-Aware Transcription](https:\u002F\u002Fbetterprogramming.pub\u002Fcolor-your-captions-streamlining-live-transcriptions-with-diart-and-openais-whisper-6203350234ef) ([coming soon](https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002Fdiart\u002Fpull\u002F147))\n\n## 💾 Installation\n\n**1) Make sure your system has the following dependencies:**\n\n```\nffmpeg \u003C 4.4\nportaudio == 19.6.X\nlibsndfile >= 1.2.2\n```\n\nAlternatively, we provide an `environment.yml` file for a pre-configured conda environment:\n\n```shell\nconda env create -f diart\u002Fenvironment.yml\nconda activate diart\n```\n\n**2) Install the package:**\n```shell\npip install diart\n```\n\n### Get access to 🎹 pyannote models\n\nBy default, diart is based on [pyannote.audio](https:\u002F\u002Fgithub.com\u002Fpyannote\u002Fpyannote-audio) models from the [huggingface](https:\u002F\u002Fhuggingface.co\u002F) hub.\nIn order to use them, please follow these steps:\n\n1) [Accept user conditions](https:\u002F\u002Fhuggingface.co\u002Fpyannote\u002Fsegmentation) for the `pyannote\u002Fsegmentation` model\n2) [Accept user conditions](https:\u002F\u002Fhuggingface.co\u002Fpyannote\u002Fsegmentation-3.0) for the newest `pyannote\u002Fsegmentation-3.0` model\n3) [Accept user conditions](https:\u002F\u002Fhuggingface.co\u002Fpyannote\u002Fembedding) for the `pyannote\u002Fembedding` model\n4) Install [huggingface-cli](https:\u002F\u002Fhuggingface.co\u002Fdocs\u002Fhuggingface_hub\u002Fquick-start#install-the-hub-library) and [log in](https:\u002F\u002Fhuggingface.co\u002Fdocs\u002Fhuggingface_hub\u002Fquick-start#login) with your user access token (or provide it manually in diart CLI or API).\n\n## 🎙️ Stream audio\n\n### From the command line\n\nA recorded conversation:\n\n```shell\ndiart.stream \u002Fpath\u002Fto\u002Faudio.wav\n```\n\nA live conversation:\n\n```shell\n# Use \"microphone:ID\" to select a non-default device\n# See `python -m sounddevice` for available devices\ndiart.stream microphone\n```\n\nBy default, diart runs a speaker diarization pipeline, equivalent to setting `--pipeline SpeakerDiarization`,\nbut you can also set it to `--pipeline VoiceActivityDetection`. See `diart.stream -h` for more options.\n\n### From python\n\nUse `StreamingInference` to run a pipeline on an audio source and write the results to disk:\n\n```python\nfrom diart import SpeakerDiarization\nfrom diart.sources import MicrophoneAudioSource\nfrom diart.inference import StreamingInference\nfrom diart.sinks import RTTMWriter\n\npipeline = SpeakerDiarization()\nmic = MicrophoneAudioSource()\ninference = StreamingInference(pipeline, mic, do_plot=True)\ninference.attach_observers(RTTMWriter(mic.uri, \"\u002Foutput\u002Ffile.rttm\"))\nprediction = inference()\n```\n\nFor inference and evaluation on a dataset we recommend to use `Benchmark` (see notes on [reproducibility](#reproducibility)).\n\n## 🧠 Models\n\nYou can use other models with the `--segmentation` and `--embedding` arguments.\nOr in python:\n\n```python\nimport diart.models as m\n\nsegmentation = m.SegmentationModel.from_pretrained(\"model_name\")\nembedding = m.EmbeddingModel.from_pretrained(\"model_name\")\n```\n\n### Pre-trained models\n\nBelow is a list of all the models currently supported by diart:\n\n| Model Name                                                                                                                | Model Type   | CPU Time* | GPU Time* |\n|---------------------------------------------------------------------------------------------------------------------------|--------------|-----------|-----------|\n| [🤗](https:\u002F\u002Fhuggingface.co\u002Fpyannote\u002Fsegmentation) `pyannote\u002Fsegmentation` (default)                                      | segmentation | 12ms      | 8ms       |\n| [🤗](https:\u002F\u002Fhuggingface.co\u002Fpyannote\u002Fsegmentation-3.0) `pyannote\u002Fsegmentation-3.0`                                        | segmentation | 11ms      | 8ms       |\n| [🤗](https:\u002F\u002Fhuggingface.co\u002Fpyannote\u002Fembedding) `pyannote\u002Fembedding` (default)                                            | embedding | 26ms      | 12ms      |\n| [🤗](https:\u002F\u002Fhuggingface.co\u002Fhbredin\u002Fwespeaker-voxceleb-resnet34-LM) `hbredin\u002Fwespeaker-voxceleb-resnet34-LM` (ONNX)       | embedding | 48ms      | 15ms      |\n| [🤗](https:\u002F\u002Fhuggingface.co\u002Fpyannote\u002Fwespeaker-voxceleb-resnet34-LM) `pyannote\u002Fwespeaker-voxceleb-resnet34-LM` (PyTorch)  | embedding | 150ms     | 29ms      |\n| [🤗](https:\u002F\u002Fhuggingface.co\u002Fspeechbrain\u002Fspkrec-xvect-voxceleb) `speechbrain\u002Fspkrec-xvect-voxceleb`                        | embedding | 41ms      | 15ms      |\n| [🤗](https:\u002F\u002Fhuggingface.co\u002Fspeechbrain\u002Fspkrec-ecapa-voxceleb) `speechbrain\u002Fspkrec-ecapa-voxceleb`                        | embedding | 41ms      | 14ms      |\n| [🤗](https:\u002F\u002Fhuggingface.co\u002Fspeechbrain\u002Fspkrec-ecapa-voxceleb-mel-spec) `speechbrain\u002Fspkrec-ecapa-voxceleb-mel-spec`      | embedding | 42ms      | 14ms      |\n| [🤗](https:\u002F\u002Fhuggingface.co\u002Fspeechbrain\u002Fspkrec-resnet-voxceleb) `speechbrain\u002Fspkrec-resnet-voxceleb`                      | embedding | 41ms      | 16ms      |\n| [🤗](https:\u002F\u002Fhuggingface.co\u002Fnvidia\u002Fspeakerverification_en_titanet_large) `nvidia\u002Fspeakerverification_en_titanet_large`    | embedding | 91ms      | 16ms      |\n\nThe latency of segmentation models is measured in a VAD pipeline (5s chunks).\n\nThe latency of embedding models is measured in a diarization pipeline using `pyannote\u002Fsegmentation` (also 5s chunks).\n\n\\* CPU: AMD Ryzen 9 - GPU: RTX 4060 Max-Q\n\n### Custom models\n\nThird-party models can be integrated by providing a loader function:\n\n```python\nfrom diart import SpeakerDiarization, SpeakerDiarizationConfig\nfrom diart.models import EmbeddingModel, SegmentationModel\n\ndef segmentation_loader():\n    # It should take a waveform and return a segmentation tensor\n    return load_pretrained_model(\"my_model.ckpt\")\n\ndef embedding_loader():\n    # It should take (waveform, weights) and return per-speaker embeddings\n    return load_pretrained_model(\"my_other_model.ckpt\")\n\nsegmentation = SegmentationModel(segmentation_loader)\nembedding = EmbeddingModel(embedding_loader)\nconfig = SpeakerDiarizationConfig(\n    segmentation=segmentation,\n    embedding=embedding,\n)\npipeline = SpeakerDiarization(config)\n```\n\nIf you have an ONNX model, you can use `from_onnx()`:\n\n```python\nfrom diart.models import EmbeddingModel\n\nembedding = EmbeddingModel.from_onnx(\n    model_path=\"my_model.ckpt\",\n    input_names=[\"x\", \"w\"],  # defaults to [\"waveform\", \"weights\"]\n    output_name=\"output\",  # defaults to \"embedding\"\n)\n```\n\n## 📈 Tune hyper-parameters\n\nDiart implements an optimizer based on [optuna](https:\u002F\u002Foptuna.readthedocs.io\u002Fen\u002Fstable\u002Findex.html) that allows you to tune pipeline hyper-parameters to your needs.\n\n### From the command line\n\n```shell\ndiart.tune \u002Fwav\u002Fdir --reference \u002Frttm\u002Fdir --output \u002Foutput\u002Fdir\n```\n\nSee `diart.tune -h` for more options.\n\n### From python\n\n```python\nfrom diart.optim import Optimizer\n\noptimizer = Optimizer(\"\u002Fwav\u002Fdir\", \"\u002Frttm\u002Fdir\", \"\u002Foutput\u002Fdir\")\noptimizer(num_iter=100)\n```\n\nThis will write results to an sqlite database in `\u002Foutput\u002Fdir`.\n\n### Distributed tuning\n\nFor bigger datasets, it is sometimes more convenient to run multiple optimization processes in parallel.\nTo do this, create a study on a [recommended DBMS](https:\u002F\u002Foptuna.readthedocs.io\u002Fen\u002Fstable\u002Ftutorial\u002F10_key_features\u002F004_distributed.html#sphx-glr-tutorial-10-key-features-004-distributed-py) (e.g. MySQL or PostgreSQL) making sure that the study and database names match:\n\n```shell\nmysql -u root -e \"CREATE DATABASE IF NOT EXISTS example\"\noptuna create-study --study-name \"example\" --storage \"mysql:\u002F\u002Froot@localhost\u002Fexample\"\n```\n\nYou can now run multiple identical optimizers pointing to this database:\n\n```shell\ndiart.tune \u002Fwav\u002Fdir --reference \u002Frttm\u002Fdir --storage mysql:\u002F\u002Froot@localhost\u002Fexample\n```\n\nor in python:\n\n```python\nfrom diart.optim import Optimizer\nfrom optuna.samplers import TPESampler\nimport optuna\n\ndb = \"mysql:\u002F\u002Froot@localhost\u002Fexample\"\nstudy = optuna.load_study(\"example\", db, TPESampler())\noptimizer = Optimizer(\"\u002Fwav\u002Fdir\", \"\u002Frttm\u002Fdir\", study)\noptimizer(num_iter=100)\n```\n\n## 🧠🔗 Build pipelines\n\nFor a more advanced usage, diart also provides building blocks that can be combined to create your own pipeline.\nStreaming is powered by [RxPY](https:\u002F\u002Fgithub.com\u002FReactiveX\u002FRxPY), but the `blocks` module is completely independent and can be used separately.\n\n### Example\n\nObtain overlap-aware speaker embeddings from a microphone stream:\n\n```python\nimport rx.operators as ops\nimport diart.operators as dops\nfrom diart.sources import MicrophoneAudioSource, FileAudioSource\nfrom diart.blocks import SpeakerSegmentation, OverlapAwareSpeakerEmbedding\n\nsegmentation = SpeakerSegmentation.from_pretrained(\"pyannote\u002Fsegmentation\")\nembedding = OverlapAwareSpeakerEmbedding.from_pretrained(\"pyannote\u002Fembedding\")\n\nsource = MicrophoneAudioSource()\n# To take input from file:\n# source = FileAudioSource(\"\u003Cfilename>\", sample_rate=16000)\n\n# Make sure the models have been trained with this sample rate\nprint(source.sample_rate)\n\nstream = mic.stream.pipe(\n    # Reformat stream to 5s duration and 500ms shift\n    dops.rearrange_audio_stream(sample_rate=source.sample_rate),\n    ops.map(lambda wav: (wav, segmentation(wav))),\n    ops.starmap(embedding)\n).subscribe(on_next=lambda emb: print(emb.shape))\n\nsource.read()\n```\n\nOutput:\n\n```\n# Shape is (batch_size, num_speakers, embedding_dim)\ntorch.Size([1, 3, 512])\ntorch.Size([1, 3, 512])\ntorch.Size([1, 3, 512])\n...\n```\n\n## 🌐 WebSockets\n\nDiart is also compatible with the WebSocket protocol to serve pipelines on the web.\n\n### From the command line\n\n```shell\ndiart.serve --host 0.0.0.0 --port 7007\ndiart.client microphone --host \u003Cserver-address> --port 7007\n```\n\n**Note:** make sure that the client uses the same `step` and `sample_rate` than the server with `--step` and `-sr`.\n\nSee `-h` for more options.\n\n### From python\n\nFor customized solutions, a server can also be created in python using the `WebSocketAudioSource`:\n\n```python\nfrom diart import SpeakerDiarization\nfrom diart.sources import WebSocketAudioSource\nfrom diart.inference import StreamingInference\n\npipeline = SpeakerDiarization()\nsource = WebSocketAudioSource(pipeline.config.sample_rate, \"localhost\", 7007)\ninference = StreamingInference(pipeline, source)\ninference.attach_hooks(lambda ann_wav: source.send(ann_wav[0].to_rttm()))\nprediction = inference()\n```\n\n## 🔬 Powered by research\n\nDiart is the official implementation of the paper\n[Overlap-aware low-latency online speaker diarization based on end-to-end local segmentation](https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002Fdiart\u002Fblob\u002Fmain\u002Fpaper.pdf)\nby [Juan Manuel Coria](https:\u002F\u002Fjuanmc2005.github.io\u002F),\n[Hervé Bredin](https:\u002F\u002Fherve.niderb.fr),\n[Sahar Ghannay](https:\u002F\u002Fsaharghannay.github.io\u002F)\nand [Sophie Rosset](https:\u002F\u002Fperso.limsi.fr\u002Frosset\u002F).\n\n\n> We propose to address online speaker diarization as a combination of incremental clustering and local diarization applied to a rolling buffer updated every 500ms. Every single step of the proposed pipeline is designed to take full advantage of the strong ability of a recently proposed end-to-end overlap-aware segmentation to detect and separate overlapping speakers. In particular, we propose a modified version of the statistics pooling layer (initially introduced in the x-vector architecture) to give less weight to frames where the segmentation model predicts simultaneous speakers. Furthermore, we derive cannot-link constraints from the initial segmentation step to prevent two local speakers from being wrongfully merged during the incremental clustering step. Finally, we show how the latency of the proposed approach can be adjusted between 500ms and 5s to match the requirements of a particular use case, and we provide a systematic analysis of the influence of latency on the overall performance (on AMI, DIHARD and VoxConverse).\n\n\u003Cp align=\"center\">\n\u003Cimg height=\"400\" src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fjuanmc2005_diart_readme_fac4969e2d4e.png\" title=\"Visual explanation of the system\" width=\"325\" \u002F>\n\u003C\u002Fp>\n\n### Citation\n\nIf you found diart useful, please make sure to cite our paper:\n\n```bibtex\n@inproceedings{diart,  \n  author={Coria, Juan M. and Bredin, Hervé and Ghannay, Sahar and Rosset, Sophie},  \n  booktitle={2021 IEEE Automatic Speech Recognition and Understanding Workshop (ASRU)},   \n  title={Overlap-Aware Low-Latency Online Speaker Diarization Based on End-to-End Local Segmentation}, \n  year={2021},\n  pages={1139-1146},\n  doi={10.1109\u002FASRU51503.2021.9688044},\n}\n```\n\n### Reproducibility\n\n![Results table](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fjuanmc2005_diart_readme_e30520f55f4c.png)\n\n**Important:** We highly recommend installing `pyannote.audio\u003C3.1` to reproduce these results.\nFor more information, see [this issue](https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002Fdiart\u002Fissues\u002F214).\n\nDiart aims to be lightweight and capable of real-time streaming in practical scenarios.\nIts performance is very close to what is reported in the paper (and sometimes even a bit better).\n\nTo obtain the best results, make sure to use the following hyper-parameters:\n\n| Dataset     | latency | tau    | rho    | delta |\n|-------------|---------|--------|--------|-------|\n| DIHARD III  | any     | 0.555  | 0.422  | 1.517 |\n| AMI         | any     | 0.507  | 0.006  | 1.057 |\n| VoxConverse | any     | 0.576  | 0.915  | 0.648 |\n| DIHARD II   | 1s      | 0.619  | 0.326  | 0.997 |\n| DIHARD II   | 5s      | 0.555  | 0.422  | 1.517 |\n\n`diart.benchmark` and `diart.inference.Benchmark` can run, evaluate and measure the real-time latency of the pipeline. For instance, for a DIHARD III configuration:\n\n```shell\ndiart.benchmark \u002Fwav\u002Fdir --reference \u002Frttm\u002Fdir --tau-active=0.555 --rho-update=0.422 --delta-new=1.517 --segmentation pyannote\u002Fsegmentation@Interspeech2021\n```\n\nor using the inference API:\n\n```python\nfrom diart.inference import Benchmark, Parallelize\nfrom diart import SpeakerDiarization, SpeakerDiarizationConfig\nfrom diart.models import SegmentationModel\n\nbenchmark = Benchmark(\"\u002Fwav\u002Fdir\", \"\u002Frttm\u002Fdir\")\n\nmodel_name = \"pyannote\u002Fsegmentation@Interspeech2021\"\nmodel = SegmentationModel.from_pretrained(model_name)\nconfig = SpeakerDiarizationConfig(\n    # Set the segmentation model used in the paper\n    segmentation=model,\n    step=0.5,\n    latency=0.5,\n    tau_active=0.555,\n    rho_update=0.422,\n    delta_new=1.517\n)\nbenchmark(SpeakerDiarization, config)\n\n# Run the same benchmark in parallel\np_benchmark = Parallelize(benchmark, num_workers=4)\nif __name__ == \"__main__\":  # Needed for multiprocessing\n    p_benchmark(SpeakerDiarization, config)\n```\n\nThis pre-calculates model outputs in batches, so it runs a lot faster.\nSee `diart.benchmark -h` for more options.\n\nFor convenience and to facilitate future comparisons, we also provide the\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002Fdiart\u002Ftree\u002Fmain\u002Fexpected_outputs\">expected outputs\u003C\u002Fa>\nof the paper implementation in RTTM format for every entry of Table 1 and Figure 5.\nThis includes the VBx offline topline as well as our proposed online approach with\nlatencies 500ms, 1s, 2s, 3s, 4s, and 5s.\n\n![Figure 5](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fjuanmc2005_diart_readme_1c383c22fc46.png)\n\n## 📑 License\n\n```\nMIT License\n\nCopyright (c) 2021 Université Paris-Saclay\nCopyright (c) 2021 CNRS\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and\u002For sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n```\n\n\u003Cp style=\"color:grey;font-size:14px;\">Logo generated by \u003Ca href=\"https:\u002F\u002Fwww.designevo.com\u002F\" title=\"Free Online Logo Maker\">DesignEvo free logo designer\u003C\u002Fa>\u003C\u002Fp>\n","\u003Cp align=\"center\">\n\u003Cimg width=\"100%\" src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fjuanmc2005_diart_readme_132ef32b72ff.jpg\" title=\"diart logo\" \u002F>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n\u003Ci>🌿 轻松构建基于 AI 的实时音频应用 🌿\u003C\u002Fi>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n\u003Cimg alt=\"PyPI 版本\" src=\"https:\u002F\u002Fimg.shields.io\u002Fpypi\u002Fv\u002Fdiart?color=g\">\n\u003Cimg alt=\"PyPI 下载量\" src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fjuanmc2005_diart_readme_c90212a7a87e.png\">\n\u003Cimg alt=\"Python 版本\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fpython-3.10%20%7C%203.11%20%7C%203.12-dark_green\">\n\u003Cimg alt=\"代码大小（字节）\" src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flanguages\u002Fcode-size\u002Fjuanmc2005\u002FStreamingSpeakerDiarization?color=g\">\n\u003Cimg alt=\"许可证\" src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002Fjuanmc2005\u002FStreamingSpeakerDiarization?color=g\">\n\u003Ca href=\"https:\u002F\u002Fjoss.theoj.org\u002Fpapers\u002Fcc9807c6de75ea4c29025c7bd0d31996\">\u003Cimg src=\"https:\u002F\u002Fjoss.theoj.org\u002Fpapers\u002Fcc9807c6de75ea4c29025c7bd0d31996\u002Fstatus.svg\">\u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cdiv align=\"center\">\n  \u003Ch4>\n    \u003Ca href=\"#-installation\">\n      💾 安装\n    \u003C\u002Fa>\n    \u003Cspan> | \u003C\u002Fspan>\n    \u003Ca href=\"#%EF%B8%8F-stream-audio\">\n      🎙️ 流式传输音频\n    \u003C\u002Fa>\n    \u003Cspan> | \u003C\u002Fspan>\n    \u003Ca href=\"#-models\">\n      🧠 模型\n    \u003C\u002Fa>\n    \u003Cbr \u002F>\n    \u003Ca href=\"#-tune-hyper-parameters\">\n      📈 调参\n    \u003C\u002Fa>\n    \u003Cspan> | \u003C\u002Fspan>\n    \u003Ca href=\"#-build-pipelines\">\n      🧠🔗 管道\n    \u003C\u002Fa>\n    \u003Cspan> | \u003C\u002Fspan>\n    \u003Ca href=\"#-websockets\">\n      🌐 WebSockets\n    \u003C\u002Fa>\n    \u003Cspan> | \u003C\u002Fspan>\n    \u003Ca href=\"#-powered-by-research\">\n      🔬 研究\n    \u003C\u002Fa>\n  \u003C\u002Fh4>\n\u003C\u002Fdiv>\n\n\u003Cbr\u002F>\n\n\u003Cp align=\"center\">\n\u003Cimg width=\"100%\" src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fjuanmc2005_diart_readme_eb248f88ad04.gif\" title=\"实时语音分离示例\" \u002F>\n\u003C\u002Fp>\n\n## ⚡ 快速简介\n\nDiart 是一个用于构建基于 AI 的实时音频应用的 Python 框架。其核心功能是以最先进的性能实时识别不同的说话人，这一任务通常被称为“说话人分离”。\n\n管道 `diart.SpeakerDiarization` 结合了说话人分割模型和说话人嵌入模型，驱动增量聚类算法，随着对话的进行，准确性会不断提高：\n\n\u003Cp align=\"center\">\n\u003Cimg width=\"100%\" src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fjuanmc2005_diart_readme_f463b82d718a.gif\" title=\"实时说话人分离管道\" \u002F>\n\u003C\u002Fp>\n\n借助 Diart，你还可以创建自己的自定义 AI 管道、对其进行基准测试、调整超参数，甚至通过 WebSockets 将其部署到网络上。\n\n**我们提供以下预训练管道：**\n\n- 说话人分离\n- 语音活动检测\n- 转录（即将推出）([coming soon](https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002Fdiart\u002Fpull\u002F144))\n- [说话人感知转录](https:\u002F\u002Fbetterprogramming.pub\u002Fcolor-your-captions-streamlining-live-transcriptions-with-diart-and-openais-whisper-6203350234ef)（即将推出）([coming soon](https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002Fdiart\u002Fpull\u002F147))\n\n## 💾 安装\n\n**1) 确保你的系统满足以下依赖项：**\n\n```\nffmpeg \u003C 4.4\nportaudio == 19.6.X\nlibsndfile >= 1.2.2\n```\n\n或者，我们提供了一个用于预配置 Conda 环境的 `environment.yml` 文件：\n\n```shell\nconda env create -f diart\u002Fenvironment.yml\nconda activate diart\n```\n\n**2) 安装软件包：**\n```shell\npip install diart\n```\n\n### 获取 🎹 pyannote 模型的访问权限\n\n默认情况下，Diart 基于来自 [huggingface](https:\u002F\u002Fhuggingface.co\u002F) 中心的 [pyannote.audio](https:\u002F\u002Fgithub.com\u002Fpyannote\u002Fpyannote-audio) 模型。要使用这些模型，请按照以下步骤操作：\n\n1) 接受 [pyannote\u002Fsegmentation](https:\u002F\u002Fhuggingface.co\u002Fpyannote\u002Fsegmentation) 模型的用户条款\n2) 接受 [pyannote\u002Fsegmentation-3.0](https:\u002F\u002Fhuggingface.co\u002Fpyannote\u002Fsegmentation-3.0) 最新模型的用户条款\n3) 接受 [pyannote\u002Fembedding](https:\u002F\u002Fhuggingface.co\u002Fpyannote\u002Fembedding) 模型的用户条款\n4) 安装 [huggingface-cli](https:\u002F\u002Fhuggingface.co\u002Fdocs\u002Fhuggingface_hub\u002Fquick-start#install-the-hub-library) 并使用你的用户访问令牌登录（或在 Diart CLI 或 API 中手动提供）。\n\n## 🎙️ 流式传输音频\n\n### 从命令行\n\n录制的对话：\n\n```shell\ndiart.stream \u002Fpath\u002Fto\u002Faudio.wav\n```\n\n实时对话：\n\n```shell\n# 使用 \"microphone:ID\" 来选择非默认设备\n# 可通过 `python -m sounddevice` 查看可用设备\ndiart.stream microphone\n```\n\n默认情况下，Diart 运行的是说话人分离管道，相当于设置了 `--pipeline SpeakerDiarization`，但你也可以将其设置为 `--pipeline VoiceActivityDetection`。更多选项请参阅 `diart.stream -h`。\n\n### 从 Python\n\n使用 `StreamingInference` 在音频源上运行管道，并将结果写入磁盘：\n\n```python\nfrom diart import SpeakerDiarization\nfrom diart.sources import MicrophoneAudioSource\nfrom diart.inference import StreamingInference\nfrom diart.sinks import RTTMWriter\n\npipeline = SpeakerDiarization()\nmic = MicrophoneAudioSource()\ninference = StreamingInference(pipeline, mic, do_plot=True)\ninference.attach_observers(RTTMWriter(mic.uri, \"\u002Foutput\u002Ffile.rttm\"))\nprediction = inference()\n```\n\n对于数据集上的推理和评估，我们建议使用 `Benchmark`（请参阅关于 [可重复性](#reproducibility) 的说明）。\n\n## 🧠 模型\n\n你可以使用 `--segmentation` 和 `--embedding` 参数来指定其他模型。或者在 Python 中：\n\n```python\nimport diart.models as m\n\nsegmentation = m.SegmentationModel.from_pretrained(\"model_name\")\nembedding = m.EmbeddingModel.from_pretrained(\"model_name\")\n```\n\n### 预训练模型\n\n以下是 diart 当前支持的所有模型列表：\n\n| 模型名称                                                                                                                | 模型类型   | CPU 时间* | GPU 时间* |\n|---------------------------------------------------------------------------------------------------------------------------|--------------|-----------|-----------|\n| [🤗](https:\u002F\u002Fhuggingface.co\u002Fpyannote\u002Fsegmentation) `pyannote\u002Fsegmentation`（默认）                                      | 分割         | 12ms      | 8ms       |\n| [🤗](https:\u002F\u002Fhuggingface.co\u002Fpyannote\u002Fsegmentation-3.0) `pyannote\u002Fsegmentation-3.0`                                        | 分割         | 11ms      | 8ms       |\n| [🤗](https:\u002F\u002Fhuggingface.co\u002Fpyannote\u002Fembedding) `pyannote\u002Fembedding`（默认）                                            | 嵌入         | 26ms      | 12ms      |\n| [🤗](https:\u002F\u002Fhuggingface.co\u002Fhbredin\u002Fwespeaker-voxceleb-resnet34-LM) `hbredin\u002Fwespeaker-voxceleb-resnet34-LM`（ONNX）       | 嵌入         | 48ms      | 15ms      |\n| [🤗](https:\u002F\u002Fhuggingface.co\u002Fpyannote\u002Fwespeaker-voxceleb-resnet34-LM) `pyannote\u002Fwespeaker-voxceleb-resnet34-LM`（PyTorch）  | 嵌入         | 150ms     | 29ms      |\n| [🤗](https:\u002F\u002Fhuggingface.co\u002Fspeechbrain\u002Fspkrec-xvect-voxceleb) `speechbrain\u002Fspkrec-xvect-voxceleb`                        | 嵌入         | 41ms      | 15ms      |\n| [🤗](https:\u002F\u002Fhuggingface.co\u002Fspeechbrain\u002Fspkrec-ecapa-voxceleb) `speechbrain\u002Fspkrec-ecapa-voxceleb`                        | 嵌入         | 41ms      | 14ms      |\n| [🤗](https:\u002F\u002Fhuggingface.co\u002Fspeechbrain\u002Fspkrec-ecapa-voxceleb-mel-spec) `speechbrain\u002Fspkrec-ecapa-voxceleb-mel-spec`      | 嵌入         | 42ms      | 14ms      |\n| [🤗](https:\u002F\u002Fhuggingface.co\u002Fspeechbrain\u002Fspkrec-resnet-voxceleb) `speechbrain\u002Fspkrec-resnet-voxceleb`                      | 嵌入         | 41ms      | 16ms      |\n| [🤗](https:\u002F\u002Fhuggingface.co\u002Fnvidia\u002Fspeakerverification_en_titanet_large) `nvidia\u002Fspeakerverification_en_titanet_large`    | 嵌入         | 91ms      | 16ms      |\n\n分割模型的延迟是在 VAD 流水线中测量的（5 秒分块）。\n\n嵌入模型的延迟是在使用 `pyannote\u002Fsegmentation` 的日耳曼化流水线中测量的（同样为 5 秒分块）。\n\n\\* CPU：AMD Ryzen 9 - GPU：RTX 4060 Max-Q\n\n### 自定义模型\n\n可以通过提供加载函数来集成第三方模型：\n\n```python\nfrom diart import SpeakerDiarization, SpeakerDiarizationConfig\nfrom diart.models import EmbeddingModel、SegmentationModel\n\ndef segmentation_loader():\n    # 应该接收波形并返回分割张量\n    return load_pretrained_model(\"my_model.ckpt\")\n\ndef embedding_loader():\n    # 应该接收（波形，权重）并返回每位说话人的嵌入向量\n    return load_pretrained_model(\"my_other_model.ckpt\")\n\nsegmentation = SegmentationModel(segmentation_loader)\nembedding = EmbeddingModel(embedding_loader)\nconfig = SpeakerDiarizationConfig(\n    segmentation=segmentation,\n    embedding=embedding,\n)\npipeline = SpeakerDiarization(config)\n```\n\n如果你有一个 ONNX 模型，可以使用 `from_onnx()`：\n\n```python\nfrom diart.models import EmbeddingModel\n\nembedding = EmbeddingModel.from_onnx(\n    model_path=\"my_model.ckpt\",\n    input_names=[\"x\", \"w\"],  # 默认为 [\"waveform\", \"weights\"]\n    output_name=\"output\",  # 默认为 \"embedding\"\n)\n```\n\n## 📈 调整超参数\n\nDiart 实现了一个基于 [optuna](https:\u002F\u002Foptuna.readthedocs.io\u002Fen\u002Fstable\u002Findex.html) 的优化器，允许你根据自己的需求调整流水线的超参数。\n\n### 通过命令行\n\n```shell\ndiart.tune \u002Fwav\u002Fdir --reference \u002Frttm\u002Fdir --output \u002Foutput\u002Fdir\n```\n\n更多选项请参阅 `diart.tune -h`。\n\n### 通过 Python\n\n```python\nfrom diart.optim import Optimizer\n\noptimizer = Optimizer(\"\u002Fwav\u002Fdir\", \"\u002Frttm\u002Fdir\", \"\u002Foutput\u002Fdir\")\noptimizer(num_iter=100)\n```\n\n这会将结果写入 `\u002Foutput\u002Fdir` 中的一个 sqlite 数据库。\n\n### 分布式调优\n\n对于更大的数据集，有时并行运行多个优化进程更为方便。为此，可以在一个 [推荐的 DBMS](https:\u002F\u002Foptuna.readthedocs.io\u002Fen\u002Fstable\u002Ftutorial\u002F10_key_features\u002F004_distributed.html#sphx-glr-tutorial-10-key-features-004-distributed-py) 上创建一个研究（例如 MySQL 或 PostgreSQL），确保研究和数据库名称一致：\n\n```shell\nmysql -u root -e \"CREATE DATABASE IF NOT EXISTS example\"\noptuna create-study --study-name \"example\" --storage \"mysql:\u002F\u002Froot@localhost\u002Fexample\"\n```\n\n现在你可以运行多个指向该数据库的相同优化器：\n\n```shell\ndiart.tune \u002Fwav\u002Fdir --reference \u002Frttm\u002Fdir --storage mysql:\u002F\u002Froot@localhost\u002Fexample\n```\n\n或者在 Python 中：\n\n```python\nfrom diart.optim import Optimizer\nfrom optuna.samplers import TPESampler\nimport optuna\n\ndb = \"mysql:\u002F\u002Froot@localhost\u002Fexample\"\nstudy = optuna.load_study(\"example\", db, TPESampler())\noptimizer = Optimizer(\"\u002Fwav\u002Fdir\", \"\u002Frttm\u002Fdir\", study)\noptimizer(num_iter=100)\n```\n\n## 🧠🔗 构建流水线\n\n为了更高级的用法，diart 还提供了可组合以创建自定义流水线的构建模块。流媒体由 [RxPY](https:\u002F\u002Fgithub.com\u002FReactiveX\u002FRxPY) 提供支持，但 `blocks` 模块完全独立，可以单独使用。\n\n### 示例\n\n从麦克风流中获取重叠感知的说话人嵌入：\n\n```python\nimport rx.operators as ops\nimport diart.operators as dops\nfrom diart.sources import MicrophoneAudioSource、FileAudioSource\nfrom diart.blocks import SpeakerSegmentation、OverlapAwareSpeakerEmbedding\n\nsegmentation = SpeakerSegmentation.from_pretrained(\"pyannote\u002Fsegmentation\")\nembedding = OverlapAwareSpeakerEmbedding.from_pretrained(\"pyannote\u002Fembedding\")\n\nsource = MicrophoneAudioSource()\n# 如果要从文件输入：\n# source = FileAudioSource(\"\u003Cfilename>\", sample_rate=16000)\n\n# 确保模型已使用此采样率进行训练\nprint(source.sample_rate)\n\nstream = mic.stream.pipe(\n    # 将流重新格式化为 5 秒时长、500 毫秒步长\n    dops.rearrange_audio_stream(sample_rate=source.sample_rate),\n    ops.map(lambda wav: (wav, segmentation(wav))),\n    ops.starmap(embedding)\n).subscribe(on_next=lambda emb: print(emb.shape))\n\nsource.read()\n```\n\n输出：\n\n```\n# 形状为 (batch_size, num_speakers, embedding_dim)\ntorch.Size([1, 3, 512])\ntorch.Size([1, 3, 512])\ntorch.Size([1, 3, 512])\n...\n```\n\n## 🌐 WebSockets\n\nDiart 还兼容 WebSocket 协议，可在 Web 上提供流水线服务。\n\n### 通过命令行\n\n```shell\ndiart.serve --host 0.0.0.0 --port 7007\ndiart.client microphone --host \u003Cserver-address> --port 7007\n```\n\n**注意：** 确保客户端使用的 `step` 和 `sample_rate` 与服务器一致，可通过 `--step` 和 `-sr` 设置。\n\n更多选项请参阅 `-h`。\n\n### 从 Python 中\n\n对于自定义解决方案，也可以使用 `WebSocketAudioSource` 在 Python 中创建一个服务器：\n\n```python\nfrom diart import SpeakerDiarization\nfrom diart.sources import WebSocketAudioSource\nfrom diart.inference import StreamingInference\n\npipeline = SpeakerDiarization()\nsource = WebSocketAudioSource(pipeline.config.sample_rate, \"localhost\", 7007)\ninference = StreamingInference(pipeline, source)\ninference.attach_hooks(lambda ann_wav: source.send(ann_wav[0].to_rttm()))\nprediction = inference()\n```\n\n## 🔬 由研究驱动\n\nDiart 是论文\n[基于端到端局部分割的重叠感知低延迟在线说话人日志](https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002Fdiart\u002Fblob\u002Fmain\u002Fpaper.pdf)\n的官方实现，该论文由 [Juan Manuel Coria](https:\u002F\u002Fjuanmc2005.github.io\u002F)、\n[Hervé Bredin](https:\u002F\u002Fherve.niderb.fr)、\n[Sahar Ghannay](https:\u002F\u002Fsaharghannay.github.io\u002F) 和\n[Sophie Rosset](https:\u002F\u002Fperso.limsi.fr\u002Frosset\u002F) 共同撰写。\n\n> 我们提出将在线说话人日志问题视为增量聚类与局部日志相结合的方法，应用于每 500 毫秒更新一次的滚动缓冲区。所提出的流水线中的每一步都旨在充分利用最近提出的一种端到端重叠感知分割模型的强大能力，以检测并分离重叠的说话人。特别是，我们提出了一种修改后的统计池化层（最初在 x-vector 架构中引入），以降低分割模型预测为同时说话的帧的权重。此外，我们从初始分割步骤中推导出“不可链接”约束，以防止在增量聚类步骤中错误地合并两个局部说话人。最后，我们展示了如何将所提方法的延迟调整至 500 毫秒到 5 秒之间，以满足特定用例的需求，并系统地分析了延迟对整体性能的影响（在 AMI、DIHARD 和 VoxConverse 数据集上）。\n\n\u003Cp align=\"center\">\n\u003Cimg height=\"400\" src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fjuanmc2005_diart_readme_fac4969e2d4e.png\" title=\"系统可视化说明\" width=\"325\" \u002F>\n\u003C\u002Fp>\n\n### 引用\n\n如果您觉得 Diart 很有用，请务必引用我们的论文：\n\n```bibtex\n@inproceedings{diart,  \n  author={Coria, Juan M. and Bredin, Hervé and Ghannay, Sahar and Rosset, Sophie},  \n  booktitle={2021 IEEE Automatic Speech Recognition and Understanding Workshop (ASRU)},   \n  title={Overlap-Aware Low-Latency Online Speaker Diarization Based on End-to-End Local Segmentation}, \n  year={2021},\n  pages={1139-1146},\n  doi={10.1109\u002FASRU51503.2021.9688044},\n}\n```\n\n### 可重复性\n\n![结果表格](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fjuanmc2005_diart_readme_e30520f55f4c.png)\n\n**重要提示：** 为了重现这些结果，我们强烈建议安装 `pyannote.audio\u003C3.1`。\n更多信息请参阅 [此议题](https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002Fdiart\u002Fissues\u002F214)。\n\nDiart 的目标是轻量级，并且能够在实际场景中进行实时流处理。其性能非常接近论文中报告的结果（有时甚至略好一些）。\n\n为了获得最佳效果，请确保使用以下超参数：\n\n| 数据集     | 延迟   | tau    | rho    | delta |\n|-------------|---------|--------|--------|-------|\n| DIHARD III  | 任意   | 0.555  | 0.422  | 1.517 |\n| AMI         | 任意   | 0.507  | 0.006  | 1.057 |\n| VoxConverse | 任意   | 0.576  | 0.915  | 0.648 |\n| DIHARD II   | 1s      | 0.619  | 0.326  | 0.997 |\n| DIHARD II   | 5s      | 0.555  | 0.422  | 1.517 |\n\n`diart.benchmark` 和 `diart.inference.Benchmark` 可以运行、评估并测量流水线的实时延迟。例如，对于 DIHARD III 配置：\n\n```shell\ndiart.benchmark \u002Fwav\u002Fdir --reference \u002Frttm\u002Fdir --tau-active=0.555 --rho-update=0.422 --delta-new=1.517 --segmentation pyannote\u002Fsegmentation@Interspeech2021\n```\n\n或者使用推理 API：\n\n```python\nfrom diart.inference import Benchmark, Parallelize\nfrom diart import SpeakerDiarization, SpeakerDiarizationConfig\nfrom diart.models import SegmentationModel\n\nbenchmark = Benchmark(\"\u002Fwav\u002Fdir\", \"\u002Frttm\u002Fdir\")\n\nmodel_name = \"pyannote\u002Fsegmentation@Interspeech2021\"\nmodel = SegmentationModel.from_pretrained(model_name)\nconfig = SpeakerDiarizationConfig(\n    # 设置论文中使用的分割模型\n    segmentation=model,\n    step=0.5,\n    latency=0.5,\n    tau_active=0.555,\n    rho_update=0.422,\n    delta_new=1.517\n)\nbenchmark(SpeakerDiarization, config)\n\n# 并行运行相同的基准测试\np_benchmark = Parallelize(benchmark, num_workers=4)\nif __name__ == \"__main__\":  # 多进程需要\n    p_benchmark(SpeakerDiarization, config)\n```\n\n这会预先以批处理方式计算模型输出，因此运行速度会快很多。更多选项请参阅 `diart.benchmark -h`。\n\n为方便起见并便于未来比较，我们还提供了论文实现的\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002Fdiart\u002Ftree\u002Fmain\u002Fexpected_outputs\">预期输出\u003C\u002Fa>，\n格式为 RTTM，涵盖表 1 和图 5 中的每一项。其中包括 VBx 离线最优结果以及我们提出的在线方法，延迟分别为 500 毫秒、1 秒、2 秒、3 秒、4 秒和 5 秒。\n\n![图 5](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fjuanmc2005_diart_readme_1c383c22fc46.png)\n\n## 📑 许可证\n\n```\nMIT 许可证\n\n版权所有 © 2021 巴黎-萨克雷大学\n版权所有 © 2021 法国国家科学研究中心\n\n特此授予任何人免费获取本软件及其相关文档文件（以下简称“软件”）副本的权利，允许其在不受限制的情况下处理软件，包括但不限于使用、复制、修改、合并、发布、分发、再许可和\u002F或销售软件副本的权利，以及允许向任何接收者提供软件以供其执行的权利，但须遵守以下条件：\n\n上述版权声明和本许可声明应包含在软件的所有副本或实质性部分中。\n\n软件按“原样”提供，不提供任何形式的担保，无论是明示的还是暗示的，包括但不限于适销性、特定用途适用性和非侵权性的担保。在任何情况下，作者或版权所有者均不对任何索赔、损害或其他责任负责，无论这些责任是因合同行为、侵权行为或其他原因引起的，也无论这些责任是否与软件或其使用有关。\n```\n\n\u003Cp style=\"color:grey;font-size:14px;\">标志由 \u003Ca href=\"https:\u002F\u002Fwww.designevo.com\u002F\" title=\"免费在线标志制作工具\">DesignEvo 免费标志设计工具\u003C\u002Fa> 生成\u003C\u002Fp>","# Diart 快速上手指南\n\nDiart 是一个用于构建 AI 驱动实时音频应用的 Python 框架，核心功能是**实时说话人日记（Speaker Diarization）**，即实时区分对话中的不同说话人。\n\n## 1. 环境准备\n\n在开始之前，请确保您的系统满足以下依赖要求：\n\n*   **Python 版本**: 3.10, 3.11 或 3.12\n*   **系统依赖**:\n    *   `ffmpeg` \u003C 4.4\n    *   `portaudio` == 19.6.X\n    *   `libsndfile` >= 1.2.2\n\n> **推荐方式**：使用项目提供的 Conda 环境配置文件自动安装所有依赖。\n\n## 2. 安装步骤\n\n### 方法 A：使用 Conda（推荐）\n一键创建并激活预配置的环境：\n\n```shell\nconda env create -f diart\u002Fenvironment.yml\nconda activate diart\n```\n\n### 方法 B：手动安装\n如果已具备上述系统依赖，可直接通过 pip 安装：\n\n```shell\npip install diart\n```\n\n### 获取 Pyannote 模型权限\nDiart 默认使用 Hugging Face 上的 `pyannote.audio` 模型。使用前需完成以下步骤：\n\n1.  访问以下链接并接受用户协议（需登录 Hugging Face 账号）：\n    *   [pyannote\u002Fsegmentation](https:\u002F\u002Fhuggingface.co\u002Fpyannote\u002Fsegmentation)\n    *   [pyannote\u002Fsegmentation-3.0](https:\u002F\u002Fhuggingface.co\u002Fpyannote\u002Fsegmentation-3.0)\n    *   [pyannote\u002Fembedding](https:\u002F\u002Fhuggingface.co\u002Fpyannote\u002Fembedding)\n2.  安装 huggingface-cli 并登录：\n    ```shell\n    pip install huggingface-cli\n    huggingface-cli login\n    ```\n    *(按提示输入您的 Access Token)*\n\n## 3. 基本使用\n\n### 命令行模式\n\n**处理录音文件：**\n```shell\ndiart.stream \u002Fpath\u002Fto\u002Faudio.wav\n```\n\n**实时麦克风输入：**\n```shell\n# 使用默认麦克风\ndiart.stream microphone\n\n# 指定特定设备 ID (查看可用设备：python -m sounddevice)\ndiart.stream microphone:ID\n```\n*默认运行说话人日记管道，可通过 `--pipeline VoiceActivityDetection` 切换为语音活动检测。*\n\n### Python 代码模式\n\n以下示例展示如何从麦克风采集音频，实时进行说话人区分，并将结果保存为 RTTM 文件：\n\n```python\nfrom diart import SpeakerDiarization\nfrom diart.sources import MicrophoneAudioSource\nfrom diart.inference import StreamingInference\nfrom diart.sinks import RTTMWriter\n\n# 初始化管道和音源\npipeline = SpeakerDiarization()\nmic = MicrophoneAudioSource()\n\n# 创建流式推理实例 (do_plot=True 可开启实时可视化)\ninference = StreamingInference(pipeline, mic, do_plot=True)\n\n# 绑定输出写入器\ninference.attach_observers(RTTMWriter(mic.uri, \"\u002Foutput\u002Ffile.rttm\"))\n\n# 开始推理\nprediction = inference()\n```","某在线心理咨询平台需要为多人团体治疗会话开发实时字幕系统，要求不仅能将语音转文字，还必须准确区分并标记每一位参与者的发言身份。\n\n### 没有 diart 时\n- **身份混淆严重**：传统方案只能生成纯文本流，无法区分是谁在说话，咨询师难以回溯特定成员的观点。\n- **延迟过高**：需等待整段录音结束后才能进行离线分析，完全无法满足“实时”辅助的需求。\n- **开发门槛高**：工程师需手动拼接语音活动检测、声纹提取和聚类算法，代码复杂且难以维护。\n- **资源消耗大**：自建实时流水线往往缺乏优化，导致服务器 GPU 负载过高，难以支撑多并发会话。\n\n### 使用 diart 后\n- **精准角色分离**：diart 内置的增量聚类算法能实时识别不同说话人，自动为字幕打上“参与者 A\u002FB\u002FC\"标签。\n- **真正的低延迟**：依托其流式音频处理能力，发言开始后毫秒级即可输出带说话人身份的文本。\n- **开箱即用**：直接调用 `diart.SpeakerDiarization` 管道，几行代码即可整合分割与嵌入模型，大幅缩短开发周期。\n- **性能卓越**：基于业界领先的 pyannote 模型优化，在保证高精度的同时有效降低计算开销，轻松部署于生产环境。\n\ndiart 将复杂的实时说话人日志技术转化为简单的 Python 调用，让开发者能轻松构建具备“听声辨人”能力的智能音频应用。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fjuanmc2005_diart_1c383c22.png","juanmc2005","Juan Coria","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fjuanmc2005_1262d2a0.jpg","Pre-trained for Computer Science 🇦🇷 🇫🇷\r\nFine-tuned for AI 🇫🇷","Université Paris-Saclay","Paris, France",null,"medium.com\u002F@juanmc2005","https:\u002F\u002Fgithub.com\u002Fjuanmc2005",[82],{"name":83,"color":84,"percentage":85},"Python","#3572A5",100,1966,159,"2026-04-14T07:46:02","MIT","未说明 (基于 Python 跨平台特性及 portaudio\u002Fffmpeg 依赖，通常支持 Linux, macOS, Windows)","非必需。支持 CPU 和 GPU 运行。测试环境使用 NVIDIA RTX 4060 Max-Q，未明确最低显存要求，但 GPU 可显著降低延迟（如分割模型从 12ms 降至 8ms）。","未说明",{"notes":94,"python":95,"dependencies":96},"1. 默认使用 Hugging Face 上的 pyannote 模型，需接受用户协议并登录获取访问令牌。\n2. 提供 conda 环境配置文件 (environment.yml) 以便快速搭建依赖环境。\n3. 支持通过 ONNX 格式加载第三方模型。\n4. 实时性能测试数据基于 AMD Ryzen 9 CPU 和 RTX 4060 Max-Q GPU。","3.10 | 3.11 | 3.12",[97,98,99,100,101,102,103,104],"ffmpeg \u003C 4.4","portaudio == 19.6.X","libsndfile >= 1.2.2","pyannote.audio","huggingface_hub","RxPY","optuna","sounddevice",[14,106],"音频",[108,109,110,111,112,113,114],"speaker-diarization","streaming-audio","real-time","speaker-embedding","deep-learning","transcription","voice-activity-detection","2026-03-27T02:49:30.150509","2026-04-20T04:06:10.203487",[118,123,128,133,138,143,147],{"id":119,"question_zh":120,"answer_zh":121,"source_url":122},43164,"是否可以将原始字节数据（如来自 TCP 套接字）传入管道进行处理？","目前版本已通过 WebSocket 支持流式输入。TCP\u002FUDP 兼容性已在计划中（v0.6 版本）。如果您使用 WebSocketAudioSource，需要注意 URI 格式：如果直接使用 `ws:\u002F\u002F{name}:{port}` 导致 RTTMWriter 出现路径错误（因为双斜杠 `\u002F\u002F`），请手动修改 URI 格式。维护者建议提交 Pull Request 来修复此问题。","https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002Fdiart\u002Fissues\u002F68",{"id":124,"question_zh":125,"answer_zh":126,"source_url":127},43165,"如何在实时推理中获取实时的标注结果，而不是仅在音频结束时返回最终结果？","实时标注发生在 `DiarizationPredictionAccumulator` 类的 `on_next()` 方法中。虽然 `Inference` 类的 `__call__()` 默认只返回最终结果，但您可以通过自定义逻辑在 `on_next()` 中提取并返回实时数据。此外，模型本身是无状态的（stateless），可以在不同线程间复用；如果有 GPU 且客户端较多，可以构建一个服务将音频缓冲批次化处理后再分发给各个管道，以进一步优化性能。","https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002Fdiart\u002Fissues\u002F119",{"id":129,"question_zh":130,"answer_zh":131,"source_url":132},43166,"传入音频文件时遇到 \"ValueError: Segments must not be empty\" 错误怎么办？","该问题已在版本 0.2.1 中修复（参考 Issue #25）。请升级您的 diart 库到最新版本即可解决。如果遇到相关警告，通常是因为依赖的 pyannote.audio 2.0 仍处于开发阶段，属于正常现象。","https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002Fdiart\u002Fissues\u002F23",{"id":134,"question_zh":135,"answer_zh":136,"source_url":137},43167,"在 Conda 环境中使用 \"diart.stream microphone\" 无法检测到麦克风或摄像头麦克风怎么办？","这通常是由于 Conda 环境缺少底层音频驱动支持（如 portaudio）。如果在原生环境中 sounddevice 能检测到设备但在 Conda 中不行，建议检查 Conda 环境中的音频后端配置。切换麦克风设备的功能已在后续版本（v0.7，参考 PR #136）中实现。如果是嵌入式设备（如 Raspberry Pi 或 Jetson Nano），实时延迟可能会增加，建议对代码进行性能分析（profiling），确认是分割还是嵌入推理耗时过长，必要时可尝试蒸馏损失训练缩小模型规模。","https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002Fdiart\u002Fissues\u002F99",{"id":139,"question_zh":140,"answer_zh":141,"source_url":142},43168,"如何加载并使用自己微调过的分割模型（.ckpt 文件）替换默认模型？","您可以使用 `Model.from_pretrained('path\u002Fto\u002Fyour\u002Fmodel.ckpt', strict=False)` 加载自定义模型。如果在运行 `python -m diart.stream` 时系统仍使用默认的 `pyannote\u002Fsegmentation`，请确保在初始化 PipelineConfig 时正确传入了您加载的模型实例，而不是仅修改了部分源码而未生效。注意检查配置文件或命令行参数是否覆盖了您的设置。","https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002Fdiart\u002Fissues\u002F58",{"id":144,"question_zh":145,"answer_zh":146,"source_url":142},43169,"系统默认使用 GPU 还是 CPU？如何强制使用 CPU 运行？","从版本 0.3 开始，无论是 Python API 还是命令行工具（`diart.stream` \u002F `diart.inference`），默认都会使用 GPU。如果您希望强制使用 CPU，请在运行脚本时添加 `--cpu` 参数，例如：`python -m diart.stream --cpu`。",{"id":148,"question_zh":149,"answer_zh":150,"source_url":151},43170,"如何引用该项目或在论文中致谢？","该项目已发表在 The Journal of Open Source Software (JOSS)。您可以在论文中引用以下链接：https:\u002F\u002Fjoss.theoj.org\u002Fpapers\u002F10.21105\u002Fjoss.05266。所有贡献者均可列为作者，具体信息可在 JOSS 评审页面查看。","https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002Fdiart\u002Fissues\u002F98",[153,158,163,168,173,178,183,188,193,198,203,208,213],{"id":154,"version":155,"summary_zh":156,"released_at":157},342851,"v0.9.2","## 变更内容\n- 由 @hmehdi515 在 #241 中修复了 README 中的嵌入提取示例\n- 由 @juanmc2005 在 #243 中修复了与 NumPy 2.0.0 兼容时的崩溃问题\n- 由 @JakobHavtorn 在 #269 中将 Python 支持版本从 3.8-3.10 升级至 3.10-3.12\n\n## 新贡献者\n感谢 @hmehdi515 和 @JakobHavtorn 对文档和 Python 支持所做的宝贵贡献！\n\n**完整变更日志**: https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002Fdiart\u002Fcompare\u002Fv0.9.1...v0.9.2","2025-02-12T13:20:56",{"id":159,"version":160,"summary_zh":161,"released_at":162},342852,"v0.9.1","## Bug 修复\n此版本修复了由于 matplotlib API 变更导致的崩溃问题（问题 #234）。\n此外，还引入了测试套件和 CI 改进，以优化开发流程。\n在 `assets\u002Fmodels` 目录下新增了 `pyannote\u002Fsegmentation` 和 `pyannote\u002Fembedding` 的量化 ONNX 版本，以便在不依赖 HuggingFace 空间的情况下独立运行测试。\n\n## 变更内容\n* 由 @juanmc2005 在 #237 中添加测试套件  \n\n\n**完整变更日志**: https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002Fdiart\u002Fcompare\u002Fv0.9...v0.9.1","2024-05-25T18:50:57",{"id":164,"version":165,"summary_zh":166,"released_at":167},342853,"v0.9","## 新功能！\n\n此新版本带来了重大更新！新增对 pyannote 3.*、SpeechBrain、WeSpeaker 和 NeMo 嵌入模型的支持，共计 8 款新模型可用于构建说话人日志流水线，以及 1 款用于语音活动检测的新模型。\n\n此外，本版本还增加了对 ONNX 模型的支持，并在 [diart.readthedocs.io](https:\u002F\u002Fdiart.readthedocs.io\u002F) 上新增了文档页面。\n\n## 变更内容\n\n* 在 #188 中由 @sorgfresser 添加对 pyannote 3.0 嵌入封装器的兼容性\n* 在 #198 中由 @hbredin 添加对幂集分割模型的支持\n* 在 #204 中由 @juanmc2005 添加 ONNX 兼容性\n* 在 #207 中由 @juanmc2005 改进 README 文档\n* 在 #209 中由 @juanmc2005 添加文档页面\n* 在 #215 中由 @juanmc2005 将 ONNX Runtime 设置为可选依赖\n* 在 #216 中由 @juanmc2005 在 README 中添加可复现性警告\n\n## 新贡献者\n\n感谢 @sorgfresser 在 #188 中作出的巨大贡献！\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002Fdiart\u002Fcompare\u002Fv0.8...v0.9","2023-11-19T11:14:50",{"id":169,"version":170,"summary_zh":171,"released_at":172},342854,"v0.8","## 变更内容\n* 由 @juanmc2005 在 #143 中实现的语音活动检测\n* 由 @juanmc2005 在 #153 中修复的采样率问题\n* [joss] 由 @sneakers-the-rat 在 #172 中添加的 Conda 环境\n* [joss] 由 @sneakers-the-rat 和 @juanmc2005 在 #173 和 #179 中将 NotImplementedError 替换为 ABC 和 abstractmethod\n* 由 @juanmc2005 在 #181 中修复的 torchaudio 版本不兼容问题\n* 由 @juanmc2005 在 #182 中添加的适用于 Apple 设备的特殊音频源\n* 由 @juanmc2005 在 #183 中捕获 `diart.stream` 中的键盘中断\n* 由 @juanmc2005 在 #189 中移除 `PipelineConfig.from_dict()`\n* 由 @hbredin 在 #191 中修复的可复现性章节链接\n\n## 新贡献者\n\n感谢 @sneakers-the-rat 作为 JOSS 评审的一部分，提供了极其宝贵的反馈和帮助！\n\n**完整变更日志**: https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002Fdiart\u002Fcompare\u002Fv0.7...v0.8","2023-10-28T13:42:32",{"id":174,"version":175,"summary_zh":176,"released_at":177},342855,"v0.7","## 变更内容\n* @juanmc2005 在 https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F101 中实现了即插即用的说话人日志化流水线\n* @juanmc2005 在 https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F124 中实现了基准测试的并行执行\n* @juanmc2005 在 https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F130 中提供了更完善的安装说明\n* @juanmc2005 在 https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F131 中重写了 WebSocket 实现\n* @juanmc2005 在 https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F135 中为短音频文件添加了左侧填充\n* @juanmc2005 在 https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F136 中允许用户选择麦克风设备\n* @juanmc2005 在 https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F137 中更新了 logo 和演示 GIF\n* @juanmc2005 在 https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F138 中对流水线时间戳进行了偏移\n\n**完整变更日志**: https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fcompare\u002Fv0.6...v0.7","2023-04-06T13:10:55",{"id":179,"version":180,"summary_zh":181,"released_at":182},342856,"v0.6","## 变更内容\n* @juanmc2005 在 https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F91 中实现了与 torchaudio 流的兼容性\n* @juanmc2005 在 https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F92 中将在线说话人日志化功能作为模块集成\n* 修复 bug：关闭绘图窗口时 RTTM 输出未被更新，由 @juanmc2005 在 https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F100 中完成\n* @bhigy 在 https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F105 中为 `DelayedAggregation` 添加了 `cropping_mode` 参数\n* @juanmc2005 在 https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F108 中使项目兼容 pyannote.audio 2.1.1 的依赖要求\n\n\n## 新贡献者\n* 感谢 @bhigy 在 https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F105 中进行的漏洞排查！\n\n**完整变更日志**: https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fcompare\u002Fv0.5.1...v0.6","2022-10-31T10:55:04",{"id":184,"version":185,"summary_zh":186,"released_at":187},342857,"v0.5.1","## 变更内容\n* 修复了配置引用错误及未打补丁的注释，由 @juanmc2005 在 https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F89 中完成。\n\n\n**完整变更日志**: https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fcompare\u002Fv0.5...v0.5.1","2022-08-31T15:30:06",{"id":189,"version":190,"summary_zh":191,"released_at":192},342858,"v0.5","## 变更内容\n* 添加 `study_or_path` 作为路径参数，用于由字符串转换而来，由 @AMITKESARI2000 在 https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F74 中实现\n* 更新 WebSocketAudioSource，由 @ckliao-nccu 在 https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F78 中实现\n* 修复 RTTM 文件为空时的 bug，由 @zaouk 在 https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F81 中修复\n* 增加 WebSocket 兼容性及其他改进，由 @juanmc2005 在 https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F77 中实现\n* 在 `diart.benchmark` 中导出 CSV 报表，当提供输出时生效，由 @juanmc2005 在 https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F86 中实现\n\n## 新贡献者\n* @AMITKESARI2000 在 https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F74 中完成了首次贡献\n* @ckliao-nccu 在 https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F78 中完成了首次贡献\n\n## 致谢\n\n感谢 @AMITKESARI2000、@ckliao-nccu 和 @zaouk 所有的 bug 修复！\n\n**完整变更日志**: https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fcompare\u002Fv0.4...v0.5","2022-08-31T12:22:34",{"id":194,"version":195,"summary_zh":196,"released_at":197},342859,"v0.4","## 变更内容\n* 由 @juanmc2005 在 https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F59 中将 `resolve_features` 替换为 `TemporalFeatureFormatter`\n* 由 @juanmc2005 在 https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F61 中使 `pyannote.audio` 成为可选依赖（运行默认流水线时仍为必选）\n* 由 @juanmc2005 在 https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F64 中进行的少量功能添加和改进\n* 由 @zaouk 在 https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F31 中为部分类和方法添加文档\n* 由 @juanmc2005 在 https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F65 中添加使用 Optuna 进行超参数调优的功能\n\n## 新贡献者\n* 感谢 @zaouk 在 https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F31 中的贡献！\n\n**完整变更日志**: https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fcompare\u002Fv0.3...v0.4","2022-07-13T13:55:28",{"id":199,"version":200,"summary_zh":201,"released_at":202},342860,"v0.3","## 变更内容\n* @Yagna24 在 #29 中实现了 Python 3.7 兼容性，并修复了 PortAudio 错误。\n* @hbredin 在 #38 中添加了引用说明。\n* @juanmc2005 在 #46 中新增了基准测试脚本，并进行了改进和错误修复。\n* @juanmc2005 在 #47 中优化了 API 名称。\n* @juanmc2005 在 #51 中新增了 `OverlapAwareSpeakerEmbedding` 类。\n* @juanmc2005 在 #55 中新增了包含 `RealTimeInference` 和 `Benchmark` 的推理 API。\n\n## 新贡献者\n* 感谢 @Yagna24 对 Python 3.7 兼容性的贡献！\n\n**完整变更日志**: https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fcompare\u002Fv0.2.1...v0.3","2022-05-20T20:32:36",{"id":204,"version":205,"summary_zh":206,"released_at":207},342861,"v0.2.1","## What's Changed\r\n* Fix empty segment in `buffer_output` causing a crash by @juanmc2005 in https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F24\r\n\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fcompare\u002Fv0.2...v0.2.1","2022-01-26T07:23:37",{"id":209,"version":210,"summary_zh":211,"released_at":212},342862,"v0.2","## What's Changed\r\n* Replace `operators.aggregate()` with `functional.DelayedAggregation` by @juanmc2005 in https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F16\r\n* Add Hamming-weighted average to `DelayedAggregation` by @juanmc2005 in https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F18\r\n* Asynchronous microphone reading by @juanmc2005 in https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F19\r\n* Modular `OutputBuilder` + better demo performance by @juanmc2005 in https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F20\r\n* Improve README by @juanmc2005 in https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fpull\u002F21\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fjuanmc2005\u002FStreamingSpeakerDiarization\u002Fcompare\u002Fv0.1...v0.2","2022-01-07T19:39:07",{"id":214,"version":215,"summary_zh":216,"released_at":217},342863,"v0.1","## Changelog\r\n\r\nInitial release!\r\n\r\nThanks to @igordertigor for the package building configuration.","2021-12-15T09:43:15"]