[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-schibsted--WAAS":3,"tool-schibsted--WAAS":65},[4,23,32,40,48,56],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":22},2268,"ML-For-Beginners","microsoft\u002FML-For-Beginners","ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程，旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周，包含 26 节精炼课程和 52 道配套测验，内容涵盖从基础概念到实际应用的完整流程，有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。\n\n无论是希望转型的开发者、需要补充算法背景的研究人员，还是对人工智能充满好奇的普通爱好者，都能从中受益。课程不仅提供了清晰的理论讲解，还强调动手实践，让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持，通过自动化机制提供了包括简体中文在内的 50 多种语言版本，极大地降低了全球不同背景用户的学习门槛。此外，项目采用开源协作模式，社区活跃且内容持续更新，确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路，ML-For-Beginners 将是理想的起点。",85013,2,"2026-04-06T11:09:19",[13,14,15,16,17,18,19,20,21],"图像","数据工具","视频","插件","Agent","其他","语言模型","开发框架","音频","ready",{"id":24,"name":25,"github_repo":26,"description_zh":27,"stars":28,"difficulty_score":29,"last_commit_at":30,"category_tags":31,"status":22},4128,"GPT-SoVITS","RVC-Boss\u002FGPT-SoVITS","GPT-SoVITS 是一款强大的开源语音合成与声音克隆工具，旨在让用户仅需极少量的音频数据即可训练出高质量的个性化语音模型。它核心解决了传统语音合成技术依赖海量录音数据、门槛高且成本大的痛点，实现了“零样本”和“少样本”的快速建模：用户只需提供 5 秒参考音频即可即时生成语音，或使用 1 分钟数据进行微调，从而获得高度逼真且相似度极佳的声音效果。\n\n该工具特别适合内容创作者、独立开发者、研究人员以及希望为角色配音的普通用户使用。其内置的友好 WebUI 界面集成了人声伴奏分离、自动数据集切片、中文语音识别及文本标注等辅助功能，极大地降低了数据准备和模型训练的技术门槛，让非专业人士也能轻松上手。\n\n在技术亮点方面，GPT-SoVITS 不仅支持中、英、日、韩、粤语等多语言跨语种合成，还具备卓越的推理速度，在主流显卡上可实现实时甚至超实时的生成效率。无论是需要快速制作视频配音，还是进行多语言语音交互研究，GPT-SoVITS 都能以极低的数据成本提供专业级的语音合成体验。",56375,3,"2026-04-05T22:15:46",[21],{"id":33,"name":34,"github_repo":35,"description_zh":36,"stars":37,"difficulty_score":29,"last_commit_at":38,"category_tags":39,"status":22},2863,"TTS","coqui-ai\u002FTTS","🐸TTS 是一款功能强大的深度学习文本转语音（Text-to-Speech）开源库，旨在将文字自然流畅地转化为逼真的人声。它解决了传统语音合成技术中声音机械生硬、多语言支持不足以及定制门槛高等痛点，让高质量的语音生成变得触手可及。\n\n无论是希望快速集成语音功能的开发者，还是致力于探索前沿算法的研究人员，亦或是需要定制专属声音的数据科学家，🐸TTS 都能提供得力支持。它不仅预置了覆盖全球 1100 多种语言的训练模型，让用户能够即刻上手，还提供了完善的工具链，支持用户利用自有数据训练新模型或对现有模型进行微调，轻松实现特定风格的声音克隆。\n\n在技术亮点方面，🐸TTS 表现卓越。其最新的 ⓍTTSv2 模型支持 16 种语言，并在整体性能上大幅提升，实现了低于 200 毫秒的超低延迟流式输出，极大提升了实时交互体验。此外，它还无缝集成了 🐶Bark、🐢Tortoise 等社区热门模型，并支持调用上千个 Fairseq 模型，展现了极强的兼容性与扩展性。配合丰富的数据集分析与整理工具，🐸TTS 已成为科研与生产环境中备受信赖的语音合成解决方案。",44971,"2026-04-03T14:47:02",[21,20,13],{"id":41,"name":42,"github_repo":43,"description_zh":44,"stars":45,"difficulty_score":29,"last_commit_at":46,"category_tags":47,"status":22},2375,"LocalAI","mudler\u002FLocalAI","LocalAI 是一款开源的本地人工智能引擎，旨在让用户在任意硬件上轻松运行各类 AI 模型，包括大语言模型、图像生成、语音识别及视频处理等。它的核心优势在于彻底打破了高性能计算的门槛，无需昂贵的专用 GPU，仅凭普通 CPU 或常见的消费级显卡（如 NVIDIA、AMD、Intel 及 Apple Silicon）即可部署和运行复杂的 AI 任务。\n\n对于担心数据隐私的用户而言，LocalAI 提供了“隐私优先”的解决方案，确保所有数据处理均在本地基础设施内完成，无需上传至云端。同时，它完美兼容 OpenAI、Anthropic 等主流 API 接口，这意味着开发者可以无缝迁移现有应用，直接利用本地资源替代云服务，既降低了成本又提升了可控性。\n\nLocalAI 内置了超过 35 种后端支持（如 llama.cpp、vLLM、Whisper 等），并集成了自主 AI 代理、工具调用及检索增强生成（RAG）等高级功能，且具备多用户管理与权限控制能力。无论是希望保护敏感数据的企业开发者、进行算法实验的研究人员，还是想要在个人电脑上体验最新 AI 技术的极客玩家，都能通过 LocalAI 获",44782,"2026-04-02T22:14:26",[13,21,19,17,20,14,16],{"id":49,"name":50,"github_repo":51,"description_zh":52,"stars":53,"difficulty_score":29,"last_commit_at":54,"category_tags":55,"status":22},3108,"bark","suno-ai\u002Fbark","Bark 是由 Suno 推出的开源生成式音频模型，能够根据文本提示创造出高度逼真的多语言语音、音乐、背景噪音及简单音效。与传统仅能朗读文字的语音合成工具不同，Bark 基于 Transformer 架构，不仅能模拟说话，还能生成笑声、叹息、哭泣等非语言声音，甚至能处理带有情感色彩和语气停顿的复杂文本，极大地丰富了音频表达的可能性。\n\n它主要解决了传统语音合成声音机械、缺乏情感以及无法生成非语音类音效的痛点，让创作者能通过简单的文字描述获得生动自然的音频素材。无论是需要为视频配音的内容创作者、探索多模态生成的研究人员，还是希望快速原型设计的开发者，都能从中受益。普通用户也可通过集成的演示页面轻松体验其神奇效果。\n\n技术亮点方面，Bark 支持商业使用（MIT 许可），并在近期更新中实现了显著的推理速度提升，同时提供了适配低显存 GPU 的版本，降低了使用门槛。此外，社区还建立了丰富的提示词库，帮助用户更好地驾驭模型生成特定风格的声音。只需几行 Python 代码，即可将创意文本转化为高质量音频，是连接文字与声音世界的强大桥梁。",39067,"2026-04-04T03:33:35",[21],{"id":57,"name":58,"github_repo":59,"description_zh":60,"stars":61,"difficulty_score":62,"last_commit_at":63,"category_tags":64,"status":22},3788,"airi","moeru-ai\u002Fairi","airi 是一款开源的本地化 AI 伴侣项目，旨在将虚拟角色（如“二次元老婆”或赛博生命）带入用户的现实世界。它的核心目标是复刻并超越知名 AI 主播 Neuro-sama 的能力，让用户能够拥有完全自主掌控、可私有化部署的智能伙伴。\n\nairi 主要解决了用户对高度定制化、具备情感交互能力且数据隐私安全的 AI 角色的需求。不同于依赖云端服务的通用助手，airi 允许用户在本地运行，不仅保护了对话隐私，还赋予了用户定义角色性格与灵魂的自由。它支持实时语音聊天，甚至能直接参与《我的世界》（Minecraft）和《异星工厂》（Factorio）等游戏，实现了从单纯对话到共同娱乐的跨越。\n\n这款工具非常适合喜爱虚拟角色的普通用户、希望搭建个性化 AI 陪伴的技术爱好者，以及研究多模态交互的开发者。其独特的技术亮点在于跨平台支持（涵盖 Web、macOS 和 Windows）以及强大的游戏交互能力，让 AI 不仅能“说”，还能“玩”。通过容器化的灵魂设计，airi 为每个人创造专属数字生命提供了可能，让虚拟陪伴变得更加真实且触手可及。",37086,1,"2026-04-05T10:54:25",[19,21,17],{"id":66,"github_repo":67,"name":68,"description_en":69,"description_zh":70,"ai_summary_zh":71,"readme_en":72,"readme_zh":73,"quickstart_zh":74,"use_case_zh":75,"hero_image_url":76,"owner_login":77,"owner_name":78,"owner_avatar_url":79,"owner_bio":80,"owner_company":81,"owner_location":81,"owner_email":81,"owner_twitter":82,"owner_website":83,"owner_url":84,"languages":85,"stars":106,"forks":107,"last_commit_at":108,"license":109,"difficulty_score":29,"env_os":110,"env_gpu":111,"env_ram":112,"env_deps":113,"category_tags":121,"github_topics":81,"view_count":10,"oss_zip_url":81,"oss_zip_packed_at":81,"status":22,"created_at":122,"updated_at":123,"faqs":124,"releases":155},4393,"schibsted\u002FWAAS","WAAS","Whisper as a Service (GUI and API with queuing for OpenAI Whisper)","WAAS（Whisper as a Service）是一个为 OpenAI Whisper 语音识别模型打造的开源服务化方案，旨在让高质量的语音转文字功能更易于部署和使用。它提供了直观的图形界面（GUI）和灵活的 API 接口，并内置任务队列机制，有效解决了直接运行 Whisper 时面临的环境配置复杂、缺乏并发处理能力以及无法批量处理长音频等痛点。\n\n对于普通用户或非技术人员，WAAS 自带的\"Jojo\"网页界面支持直接上传音视频文件，转录完成后通过邮件发送结果，并提供在线编辑器以便在浏览器本地校对和修正字幕，操作简便流畅。对于开发者而言，WAAS 提供了完整的 RESTful API，支持异步提交转录任务、自动语言检测、多格式输出（如 SRT、VTT、JSON 等）以及 Webhook 回调通知，非常适合集成到现有的媒体处理工作流中。\n\n该项目特别适合需要自建语音识别服务的开发团队、研究人员，以及希望在不依赖云端付费 API 的情况下获得隐私可控、低成本转录能力的媒体工作者。其核心亮点在于将强大的 Whisper 模型封装为开箱即用的服务，兼顾了易用性与可扩展性，同时完全基于开源协","WAAS（Whisper as a Service）是一个为 OpenAI Whisper 语音识别模型打造的开源服务化方案，旨在让高质量的语音转文字功能更易于部署和使用。它提供了直观的图形界面（GUI）和灵活的 API 接口，并内置任务队列机制，有效解决了直接运行 Whisper 时面临的环境配置复杂、缺乏并发处理能力以及无法批量处理长音频等痛点。\n\n对于普通用户或非技术人员，WAAS 自带的\"Jojo\"网页界面支持直接上传音视频文件，转录完成后通过邮件发送结果，并提供在线编辑器以便在浏览器本地校对和修正字幕，操作简便流畅。对于开发者而言，WAAS 提供了完整的 RESTful API，支持异步提交转录任务、自动语言检测、多格式输出（如 SRT、VTT、JSON 等）以及 Webhook 回调通知，非常适合集成到现有的媒体处理工作流中。\n\n该项目特别适合需要自建语音识别服务的开发团队、研究人员，以及希望在不依赖云端付费 API 的情况下获得隐私可控、低成本转录能力的媒体工作者。其核心亮点在于将强大的 Whisper 模型封装为开箱即用的服务，兼顾了易用性与可扩展性，同时完全基于开源协议发布，便于社区协作与二次开发。","# WaaS - Whisper as a Service\n\nGUI and API for [OpenAI Whisper](https:\u002F\u002Fgithub.com\u002Fopenai\u002Fwhisper)\n\n\u003Cdiv align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fschibsted_WAAS_readme_4bc5a01f2095.png\" \u002F>\n  \u003Cvideo src=\"https:\u002F\u002Fuser-images.githubusercontent.com\u002F544388\u002F219612413-5e84183c-4ce0-4033-ae18-4e5dca740909.mov\">No video support\u003C\u002Fvideo>\n\u003C\u002Fdiv>\n\u003Cbr\u002F>\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fschibsted\u002FWAAS\u002Fgraphs\u002Fcontributors\">\n      \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fcontributors\u002Fschibsted\u002FWAAS?style=for-the-badge\"\u002F>\n  \u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fschibsted\u002FWAAS\u002Fstargazers\">\n      \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002Fschibsted\u002FWAAS?style=for-the-badge\"\u002F>\n  \u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fschibsted\u002FWAAS\u002Fnetwork\u002Fmembers\">\n      \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fforks\u002Fschibsted\u002FWAAS?style=for-the-badge\"\u002F>\n  \u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fschibsted\u002FWAAS\u002Fblob\u002Fmain\u002FLICENSE\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002Fschibsted\u002FWAAS?style=for-the-badge\" alt=\"WAAS is released under the Apache-2.0 license\" \u002F>\n  \u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fschibsted\u002FWAAS\u002Fissues?q=is:issue+sort:updated-desc+is:open\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fissues-raw\u002Fschibsted\u002FWAAS?style=for-the-badge\" \u002F>\n  \u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fschibsted\u002FWAAS\u002Fissues?q=is:issue+sort:updated-desc+is:closed\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fissues-closed-raw\u002Fschibsted\u002FWAAS?style=for-the-badge\" \u002F>\n  \u003C\u002Fa>\n\u003C\u002Fp>\n\n## What is Jojo?\n\nJojo is a GUI for upload and transcribe a audio or video file. After the transcription is done you get an email with download links.\nYou can directly download a Jojo-file, SRT, or text from the email. Then you can upload a Jojo file to the frontend to come into an editor (see video).\n\n### Editor\n\nThe editor works 100% local in your browser. Here can you listen to segments and fix transcriptions errors. After you are done just save the Jojo-file to your desktop. An easy way to play the selected segment is by holding down the Control-key on the keyboard.\n\n## This project started out by VG\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fschibsted_WAAS_readme_1e2ea33c5b07.png\" \u002F>\n\n## API Documentation\n\n### POST `\u002Fv1\u002Ftranscribe`\n\nAdd a new transcribe job to the queue. The job will be processed by the worker asynchroniously.\n\nThe response will be a JSON object with `job_id` that can be used to check the status of the job.\n\nQuery parameters:\n\n- REQUIRED: `email_callback`: string or `webhook_id`: string\n- OPTIONAL: `language`: string (default: automatic detection)\n- OPTIONAL: `model`: string (default: `tiny`)\n- OPTIONAL: `task`: string (default: `transcribe`)\n  - `transcribe`: Transcribe audio to text\n  - `translate`: Transcribe then translate audio to text\n- OPTIONAL: `filename`: string (default: `untitled-transcription`)\n\nBody:\n\n- REQUIRED: `binary data`: Raw data with the audio content to transcribe\n\n### OPTIONS `\u002Fv1\u002Ftranscribe`\n\nGet the available options for the transcribe route.\n\n### POST `\u002Fv1\u002Fdetect`\n\nDetect the language of the audio file.\n\nQuery parameters:\n\n- OPTIONAL: `model`: string (default: `tiny`)\n\nBody:\n\n- REQUIRED: `binary data`: Raw data with the audio content to detect the language for\n\n### OPTIONS `\u002Fv1\u002Fdetect`\n\nGet the available options for the detect route.\n\n### GET `\u002Fv1\u002Fdownload\u002F\u003Cjob_id>`\n\nReceive the finished job result as the requested output format.\n\nQuery parameters:\n\n- OPTIONAL: `output`: string (default: `srt`)\n  - `json`: JSON response of the model output\n  - `timecode_txt`: Plain text file with timecodes(srt)\n  - `txt`: Plain text file of the detected text\n  - `vtt`: WebVTT file with the detected text\n  - `srt`: WebVTT file with the detected text\n\n### OPTIONS `\u002Fv1\u002Fdownload\u002F\u003Cjob_id>`\n\nGet the available options for the download route.\n\n### GET `\u002Fv1\u002Fjobs\u002F\u003Cjob_id>`\n\nGet the status and metadata of the provided job.\n\n### GET `\u002Fv1\u002Fqueue`\n\nGet the available length of the queue as JSON object with the key `length`.\n\n### Webhook response\n\nIf using `webhook_id` in the request parameters you will get a `POST` to the webhook url of your choice.\n\nThe request will contain a `X-WAAS-Signature` header with a hash that can be used to verify the content.\nCheck `tests\u002Ftest_webhook.py` for an example on how to verify this signature using Python on the receiving end.\n\nThe post payload will be a json with this content\n\nOn success:\n\n```\n{\n  \"source\": \"waas\",\n  \"job_id\": \"09d2832d-cf3e-4719-aea7-1319000ef372\",\n  \"success\": true,\n  \"url\": \"https:\u002F\u002Fexample.com\u002Fv1\u002Fdownload\u002F09d2832d-cf3e-4719-aea7-1319000ef372\",\n  \"filename\": \"untitled-transcription\"\n}\n```\n\nOn failure:\n\n```\n{\n  \"source\": \"waas\",\n  \"job_id\": \"09d2832d-cf3e-4719-aea7-1319000ef372\",\n  \"success\": false\n}\n```\n\n## Contributing\n\n## Requirements\n\nRequired amount of VRAM depends on the model used. The smallest model is `tiny` which requires about 1GB of VRAM.\n\nYou can see the [full list of models here](https:\u002F\u002Fgithub.com\u002Fopenai\u002Fwhisper#available-models-and-languages) with information about the required VRAM.\n\nThe codebase is expected to be compatible with Python 3.8-3.10. This would be the same as the [OpenAI Whisper](https:\u002F\u002Fgithub.com\u002Fopenai\u002Fwhisper#setup) requirements.\n\n### Installation\n\n```sh\npython3 -mvenv .venv\nsource .venv\u002Fbin\u002Factivate\npip install -r requirements.txt\n```\n\n### Running full setup using docker-compose\n\nFirst create a `.envrc` file with the following content:\n\n```sh\nexport BASE_URL=https:\u002F\u002Fexample.com\nexport EMAIL_SENDER_ADDRESS=example@example.com\nexport EMAIL_SENDER_PASSWORD=example\nexport EMAIL_SENDER_HOST=smtp.example.com\n\nexport DISCLAIMER='This is a \u003Ca href=\"example.com\">disclaimer\u003C\u002Fa>'\n\nexport ALLOWED_WEBHOOKS_FILE='allowed_webhooks.json'\nexport LOG_EMAIL=true \u002F\u002F Optional, log email content to console\n```\n\nAdd a json file named `allowed_webhooks.json` to the root folder of the project. This file is ignored by git.\nThe content should be a list of valid webhooks, urls and your generated tokens like this:\n\n```\n[\n  {\n    \"id\": \"77c500b2-0e0f-4785-afc7-f94ed529c897\",\n    \"url\": \"https:\u002F\u002Fmyniceserver.com\u002Fmywebhook\",\n    \"token\": \"frKPI6p5LxxpJa8tCvVr=u5NvU66EJCQdybPuEmzKNeyCDul2-zrOx05?LwIhL5N\"\n  }\n]\n```\n\nFor testing you could use the https:\u002F\u002Fwebhook.site service (as long as you do not post\u002Ftranscribe private data)\n\nAnd set the env variable `ALLOWED_WEBHOOKS_FILE=allowed_webhooks.json`\n\nThen run the following command\n\n```sh\ndocker-compose --env-file .envrc up\n```\n\nThis will start three docker containers.\n\n- redis\n- api running flask fra src\n- worker running rq from src\n\n### Using NVIDIA CUDA with docker-compose\n\nIf you have a NVIDIA GPU and want to use it with docker-compose,\nyou need to install [nvidia-docker](https:\u002F\u002Fdocs.nvidia.com\u002Fdatacenter\u002Fcloud-native\u002Fcontainer-toolkit\u002Finstall-guide.html#docker).\n\nTo enable CUDA support, you need to edit the `docker-compose.yml` file to use the `nvidia` runtime:\n\n```yaml\nbuild:\n  context: .\n  # use Dockerfile.gpu when using a NVIDIA GPU\n  dockerfile: Dockerfile.gpu\n```\n\nYou also have to uncomment the device reservation in the `docker-compose.yml` file:\n\n```yaml\ndeploy:\n  resources:\n    reservations:\n      devices:\n        - driver: nvidia\n          capabilities: [gpu]\n```\n\nThen run the following command as usual:\n\n```sh\ndocker-compose --env-file .envrc up\n```\n\nThe worker will now use the GPU acceleration.\n\n### Running full setup using devcontainers\n\nInstall remote-development extensions (containers)\nAnd then in vscode do `Devcontainers: open folder in container`\nThen you are inside the api-container and can do stuff\n\n### curl\n\nTo upload a file called audunspodssounds.mp3 in norwegian from your download directory\n\nWith email callback:\n\n```sh\ncurl --location --request POST 'localhost:3000\u002Fv1\u002Ftranscribe?output=vtt&email_callback=test@localhost&language=norwegian&model=large' \\\n  --header 'Content-Type: audio\u002Fmpeg' \\\n  --data-binary '@\u002FUsers\u002F\u003Cuser>\u002FDownloads\u002Faudunspodssounds.mp3'\n```\n\nWith webhook callback:\n\n```sh\ncurl --location --request POST 'localhost:3000\u002Fv1\u002Ftranscribe?output=vtt&language=norwegian&model=large&webhook_callback_url=https:\u002F\u002Fmyniceserver.something\u002Fmywebhookid' \\\n  --header 'Content-Type: audio\u002Fmpeg' \\\n  --data-binary '@\u002FUsers\u002F\u003Cuser>\u002FDownloads\u002Faudunspodssounds.mp3'\n```\n\n### Running tests\n\n```bash\n$ pytest\n```\n\n## 🥳 Contributing\n\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fschibsted\u002FWAAS\u002Fgraphs\u002Fcontributors\">\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fschibsted_WAAS_readme_78ba37e4a96e.png\" \u002F>\n\u003C\u002Fa>\n\n## FAQ\n\n### How to fix `[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate`?\n\n```sh\n$ \u002FApplications\u002FPython\\ 3.7\u002FInstall\\ Certificates.command\n```\n\n### How to run tests outside the docker container?\n\nMake sure you have fired up the Redis using docker-compose and then use:\n\n`ENVIRONMENT=test BASE_URL=http:\u002F\u002Flocalhost REDIS_URL=redis:\u002F\u002Flocalhost:6379 pytest -v `\n","# WaaS - 语音转文字即服务\n\n用于 [OpenAI Whisper](https:\u002F\u002Fgithub.com\u002Fopenai\u002Fwhisper) 的 GUI 和 API\n\n\u003Cdiv align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fschibsted_WAAS_readme_4bc5a01f2095.png\" \u002F>\n  \u003Cvideo src=\"https:\u002F\u002Fuser-images.githubusercontent.com\u002F544388\u002F219612413-5e84183c-4ce0-4033-ae18-4e5dca740909.mov\">不支持视频播放\u003C\u002Fvideo>\n\u003C\u002Fdiv>\n\u003Cbr\u002F>\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fschibsted\u002FWAAS\u002Fgraphs\u002Fcontributors\">\n      \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fcontributors\u002Fschibsted\u002FWAAS?style=for-the-badge\"\u002F>\n  \u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fschibsted\u002FWAAS\u002Fstargazers\">\n      \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002Fschibsted\u002FWAAS?style=for-the-badge\"\u002F>\n  \u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fschibsted\u002FWAAS\u002Fnetwork\u002Fmembers\">\n      \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fforks\u002Fschibsted\u002FWAAS?style=for-the-badge\"\u002F>\n  \u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fschibsted\u002FWAAS\u002Fblob\u002Fmain\u002FLICENSE\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002Fschibsted\u002FWAAS?style=for-the-badge\" alt=\"WAAS 采用 Apache-2.0 许可证发布\" \u002F>\n  \u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fschibsted\u002FWAAS\u002Fissues?q=is:issue+sort:updated-desc+is:open\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fissues-raw\u002Fschibsted\u002FWAAS?style=for-the-badge\" \u002F>\n  \u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fschibsted\u002FWAAS\u002Fissues?q=is:issue+sort:updated-desc+is:closed\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fissues-closed-raw\u002Fschibsted\u002FWAAS?style=for-the-badge\" \u002F>\n  \u003C\u002Fa>\n\u003C\u002Fp>\n\n## 什么是 Jojo？\n\nJojo 是一个用于上传和转录音频或视频文件的图形用户界面。转录完成后，您将收到一封包含下载链接的电子邮件。您可以直接从邮件中下载 Jojo 文件、SRT 文件或纯文本文件。然后，您可以将 Jojo 文件上传到前端，进入编辑器（见视频）。\n\n### 编辑器\n\n编辑器完全在您的浏览器中本地运行。在这里，您可以收听各个片段并修正转录中的错误。完成后，只需将 Jojo 文件保存到您的桌面即可。一种轻松播放选定片段的方式是按住键盘上的 Control 键。\n\n## 该项目最初由 VG 发起\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fschibsted_WAAS_readme_1e2ea33c5b07.png\" \u002F>\n\n## API 文档\n\n### POST `\u002Fv1\u002Ftranscribe`\n\n向队列添加一个新的转录任务。该任务将由工作进程异步处理。\n\n响应将是一个包含 `job_id` 的 JSON 对象，可用于检查任务状态。\n\n查询参数：\n\n- 必需：`email_callback`：字符串 或 `webhook_id`：字符串\n- 可选：`language`：字符串（默认：自动检测）\n- 可选：`model`：字符串（默认：`tiny`）\n- 可选：`task`：字符串（默认：`transcribe`）\n  - `transcribe`：将音频转录为文本\n  - `translate`：先转录再翻译成另一种语言的文本\n- 可选：`filename`：字符串（默认：`untitled-transcription`）\n\n请求体：\n\n- 必需：`binary data`：要转录的音频内容的原始数据\n\n### OPTIONS `\u002Fv1\u002Ftranscribe`\n\n获取转录路由的可用选项。\n\n### POST `\u002Fv1\u002Fdetect`\n\n检测音频文件的语言。\n\n查询参数：\n\n- 可选：`model`：字符串（默认：`tiny`）\n\n请求体：\n\n- 必需：`binary data`：用于检测语言的音频内容的原始数据\n\n### OPTIONS `\u002Fv1\u002Fdetect`\n\n获取检测路由的可用选项。\n\n### GET `\u002Fv1\u002Fdownload\u002F\u003Cjob_id>`\n\n以请求的输出格式接收已完成的任务结果。\n\n查询参数：\n\n- 可选：`output`：字符串（默认：`srt`）\n  - `json`：模型输出的 JSON 响应\n  - `timecode_txt`：带有时间码的纯文本文件（srt 格式）\n  - `txt`：检测到的文本的纯文本文件\n  - `vtt`：带有检测到的文本的 WebVTT 文件\n  - `srt`：带有检测到的文本的 WebVTT 文件\n\n### OPTIONS `\u002Fv1\u002Fdownload\u002F\u003Cjob_id>`\n\n获取下载路由的可用选项。\n\n### GET `\u002Fv1\u002Fjobs\u002F\u003Cjob_id>`\n\n获取所提供任务的状态和元数据。\n\n### GET `\u002Fv1\u002Fqueue`\n\n以 JSON 对象的形式返回队列的当前长度，键为 `length`。\n\n### Webhook 响应\n\n如果在请求参数中使用了 `webhook_id`，您将收到发送到您选择的 webhook URL 的 `POST` 请求。\n\n请求将包含一个 `X-WAAS-Signature` 头部，其中包含可用于验证内容的哈希值。请参阅 `tests\u002Ftest_webhook.py`，了解如何在接收端使用 Python 验证此签名的示例。\n\nPOST 负载将是一个包含以下内容的 JSON：\n\n成功时：\n\n```\n{\n  \"source\": \"waas\",\n  \"job_id\": \"09d2832d-cf3e-4719-aea7-1319000ef372\",\n  \"success\": true,\n  \"url\": \"https:\u002F\u002Fexample.com\u002Fv1\u002Fdownload\u002F09d2832d-cf3e-4719-aea7-1319000ef372\",\n  \"filename\": \"untitled-transcription\"\n}\n```\n\n失败时：\n\n```\n{\n  \"source\": \"waas\",\n  \"job_id\": \"09d2832d-cf3e-4719-aea7-1319000ef372\",\n  \"success\": false\n}\n```\n\n## 贡献\n\n## 要求\n\n所需的显存容量取决于所使用的模型。最小的模型是 `tiny`，大约需要 1GB 显存。\n\n您可以在 [此处查看完整的模型列表](https:\u002F\u002Fgithub.com\u002Fopenai\u002Fwhisper#available-models-and-languages)，其中包含有关所需显存的信息。\n\n代码库预计与 Python 3.8–3.10 兼容。这与 [OpenAI Whisper](https:\u002F\u002Fgithub.com\u002Fopenai\u002Fwhisper#setup) 的要求相同。\n\n### 安装\n\n```sh\npython3 -mvenv .venv\nsource .venv\u002Fbin\u002Factivate\npip install -r requirements.txt\n```\n\n### 使用 docker-compose 运行完整设置\n\n首先创建一个名为 `.envrc` 的文件，内容如下：\n\n```sh\nexport BASE_URL=https:\u002F\u002Fexample.com\nexport EMAIL_SENDER_ADDRESS=example@example.com\nexport EMAIL_SENDER_PASSWORD=example\nexport EMAIL_SENDER_HOST=smtp.example.com\n\nexport DISCLAIMER='这是一个\u003Ca href=\"example.com\">免责声明\u003C\u002Fa>'\n\nexport ALLOWED_WEBHOOKS_FILE='allowed_webhooks.json'\nexport LOG_EMAIL=true \u002F\u002F 可选，将邮件内容记录到控制台\n```\n\n在项目的根目录下添加一个名为 `allowed_webhooks.json` 的 JSON 文件。该文件会被 Git 忽略。其内容应为一个有效的 webhook 列表，包括 URL 和您生成的令牌，如下所示：\n\n```\n[\n  {\n    \"id\": \"77c500b2-0e0f-4785-afc7-f94ed529c897\",\n    \"url\": \"https:\u002F\u002Fmyniceserver.com\u002Fmywebhook\",\n    \"token\": \"frKPI6p5LxxpJa8tCvVr=u5NvU66EJCQdybPuEmzKNeyCDul2-zrOx05?LwIhL5N\"\n  }\n]\n```\n\n为了测试，您可以使用 https:\u002F\u002Fwebhook.site 服务（只要您不发布或转录任何私人数据）。\n\n然后设置环境变量 `ALLOWED_WEBHOOKS_FILE=allowed_webhooks.json`。\n\n最后运行以下命令：\n\n```sh\ndocker-compose --env-file .envrc up\n```\n\n这将启动三个 Docker 容器：\n\n- redis\n- 运行 Flask 的 API 容器\n- 运行 rq 的工作进程容器\n\n### 使用 NVIDIA CUDA 与 docker-compose\n\n如果你有一块 NVIDIA GPU 并希望在 docker-compose 中使用它，你需要安装 [nvidia-docker](https:\u002F\u002Fdocs.nvidia.com\u002Fdatacenter\u002Fcloud-native\u002Fcontainer-toolkit\u002Finstall-guide.html#docker)。\n\n为了启用 CUDA 支持，你需要编辑 `docker-compose.yml` 文件，以使用 `nvidia` 运行时：\n\n```yaml\nbuild:\n  context: .\n  # 使用 NVIDIA GPU 时，请使用 Dockerfile.gpu\n  dockerfile: Dockerfile.gpu\n```\n\n你还需要在 `docker-compose.yml` 文件中取消注释设备预留部分：\n\n```yaml\ndeploy:\n  resources:\n    reservations:\n      devices:\n        - driver: nvidia\n          capabilities: [gpu]\n```\n\n然后像往常一样运行以下命令：\n\n```sh\ndocker-compose --env-file .envrc up\n```\n\n此时，工作进程将使用 GPU 加速。\n\n### 使用 devcontainers 运行完整设置\n\n安装远程开发扩展（容器），然后在 VS Code 中选择“Devcontainers：在容器中打开文件夹”。这样你就会进入 API 容器，并可以开始操作。\n\n### curl\n\n从你的下载目录上传一个名为 audunspodssounds.mp3 的挪威语音频文件：\n\n带电子邮件回调：\n\n```sh\ncurl --location --request POST 'localhost:3000\u002Fv1\u002Ftranscribe?output=vtt&email_callback=test@localhost&language=norwegian&model=large' \\\n  --header 'Content-Type: audio\u002Fmpeg' \\\n  --data-binary '@\u002FUsers\u002F\u003Cuser>\u002FDownloads\u002Faudunspodssounds.mp3'\n```\n\n带 Webhook 回调：\n\n```sh\ncurl --location --request POST 'localhost:3000\u002Fv1\u002Ftranscribe?output=vtt&language=norwegian&model=large&webhook_callback_url=https:\u002F\u002Fmyniceserver.something\u002Fmywebhookid' \\\n  --header 'Content-Type: audio\u002Fmpeg' \\\n  --data-binary '@\u002FUsers\u002F\u003Cuser>\u002FDownloads\u002Faudunspodssounds.mp3'\n```\n\n### 运行测试\n\n```bash\n$ pytest\n```\n\n## 🥳 贡献\n\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fschibsted\u002FWAAS\u002Fgraphs\u002Fcontributors\">\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fschibsted_WAAS_readme_78ba37e4a96e.png\" \u002F>\n\u003C\u002Fa>\n\n## 常见问题解答\n\n### 如何解决 `[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate` 错误？\n\n```sh\n$ \u002FApplications\u002FPython\\ 3.7\u002FInstall\\ Certificates.command\n```\n\n### 如何在 Docker 容器之外运行测试？\n\n确保你已经通过 docker-compose 启动了 Redis，然后使用以下命令：\n\n`ENVIRONMENT=test BASE_URL=http:\u002F\u002Flocalhost REDIS_URL=redis:\u002F\u002Flocalhost:6379 pytest -v `","# WAAS (Whisper as a Service) 快速上手指南\n\nWAAS 是为 OpenAI Whisper 模型提供的图形界面 (GUI) 和 API 服务，支持音频\u002F视频文件的上传、转录、翻译及结果下载。\n\n## 环境准备\n\n### 系统要求\n- **Python 版本**: 3.8 - 3.10\n- **显卡 (可选但推荐)**: NVIDIA GPU (用于加速转录)\n  - 最小模型 `tiny` 约需 1GB 显存 (VRAM)。\n  - 若使用 CPU 运行，速度会较慢。\n- **依赖服务**: Redis (用于任务队列管理)\n- **容器化方案**: Docker & Docker Compose (推荐)\n\n### 前置依赖\n- 已安装 Docker 和 Docker Compose。\n- 若使用 NVIDIA GPU 加速，需预先安装 [NVIDIA Container Toolkit](https:\u002F\u002Fdocs.nvidia.com\u002Fdatacenter\u002Fcloud-native\u002Fcontainer-toolkit\u002Finstall-guide.html#docker)。\n\n## 安装步骤\n\n推荐使用 Docker Compose 进行一键部署。\n\n### 1. 配置环境变量\n在项目根目录创建 `.envrc` 文件，填入以下配置（请根据实际情况修改邮箱和域名）：\n\n```sh\nexport BASE_URL=https:\u002F\u002Fexample.com\nexport EMAIL_SENDER_ADDRESS=example@example.com\nexport EMAIL_SENDER_PASSWORD=example\nexport EMAIL_SENDER_HOST=smtp.example.com\n\nexport DISCLAIMER='This is a \u003Ca href=\"example.com\">disclaimer\u003C\u002Fa>'\n\nexport ALLOWED_WEBHOOKS_FILE='allowed_webhooks.json'\nexport LOG_EMAIL=true\n```\n\n### 2. 配置 Webhook 白名单\n在项目根目录创建 `allowed_webhooks.json` 文件（该文件已被 git 忽略），用于定义允许的回调地址：\n\n```json\n[\n  {\n    \"id\": \"77c500b2-0e0f-4785-afc7-f94ed529c897\",\n    \"url\": \"https:\u002F\u002Fmyniceserver.com\u002Fmywebhook\",\n    \"token\": \"frKPI6p5LxxpJa8tCvVr=u5NvU66EJCQdybPuEmzKNeyCDul2-zrOx05?LwIhL5N\"\n  }\n]\n```\n> 提示：测试时可暂时使用 https:\u002F\u002Fwebhook.site 生成的临时地址（请勿上传敏感数据）。\n\n### 3. 启动服务\n#### 标准启动 (CPU)\n```sh\ndocker-compose --env-file .envrc up\n```\n这将启动三个容器：Redis、API 服务 (Flask) 和 工作节点 (RQ Worker)。\n\n#### GPU 加速启动 (NVIDIA)\n若需启用 GPU 加速，请先修改 `docker-compose.yml`：\n1. 将 `dockerfile` 改为 `Dockerfile.gpu`。\n2. 取消注释 `deploy` 部分中的 `devices` 配置以启用 nvidia 驱动。\n\n然后执行相同的启动命令：\n```sh\ndocker-compose --env-file .envrc up\n```\n\n## 基本使用\n\n服务启动后，默认 API 端口为 3000。你可以通过命令行工具 `curl` 提交转录任务。\n\n### 示例：提交音频转录任务\n\n以下命令将上传一个名为 `audunspodssounds.mp3` 的挪威语音频文件，并使用 `large` 模型进行转录，完成后通过邮件通知。\n\n**使用邮件回调：**\n```sh\ncurl --location --request POST 'localhost:3000\u002Fv1\u002Ftranscribe?output=vtt&email_callback=test@localhost&language=norwegian&model=large' \\\n  --header 'Content-Type: audio\u002Fmpeg' \\\n  --data-binary '@\u002FUsers\u002F\u003Cuser>\u002FDownloads\u002Faudunspodssounds.mp3'\n```\n\n**使用 Webhook 回调：**\n```sh\ncurl --location --request POST 'localhost:3000\u002Fv1\u002Ftranscribe?output=vtt&language=norwegian&model=large&webhook_callback_url=https:\u002F\u002Fmyniceserver.something\u002Fmywebhookid' \\\n  --header 'Content-Type: audio\u002Fmpeg' \\\n  --data-binary '@\u002FUsers\u002F\u003Cuser>\u002FDownloads\u002Faudunspodssounds.mp3'\n```\n\n### 参数说明\n- `model`: 选择 Whisper 模型 (`tiny`, `base`, `small`, `medium`, `large`)，默认为 `tiny`。\n- `language`: 指定音频语言，留空则自动检测。\n- `task`: `transcribe` (转录) 或 `translate` (转录并翻译为英文)。\n- `output`: 返回格式 (`json`, `srt`, `txt`, `vtt` 等)，默认为 `srt`。\n\n任务提交后，系统将异步处理。处理完成后，你将收到包含下载链接的邮件或 Webhook 通知，可下载 SRT 字幕、纯文本或编辑用的 Jojo 文件。","某媒体公司的内容团队每天需处理数十小时的多语言采访录音，以生成带时间轴的字幕文件供后期剪辑使用。\n\n### 没有 WAAS 时\n- 开发人员需在本地手动部署复杂的 Whisper 环境，每次处理大文件都容易因显存不足导致进程崩溃。\n- 缺乏任务队列机制，多人同时上传音频时服务器直接宕机，无法管理并发请求。\n- 转录完成后需人工编写脚本转换格式（如 SRT 或 VTT），且无法在线校对，发现错误必须重新运行整个流程。\n- 语言检测依赖人工预判，一旦选错模型参数，整段转录结果完全不可用，浪费大量算力。\n\n### 使用 WAAS 后\n- 通过 API 直接提交任务，WAAS 内置的异步队列自动调度资源，即使百人并发上传也能稳定处理不崩盘。\n- 利用 `webhook_id` 回调机制，任务完成后自动推送通知并返回下载链接，支持一键获取 JSON、SRT 等多种格式。\n- 借助集成的 Jojo GUI 编辑器，编辑人员可在浏览器中直接试听片段并修正文字，修改后本地保存即可，无需重跑模型。\n- 调用 `\u002Fv1\u002Fdetect` 接口自动识别音频语言并匹配最佳模型，消除了人工配置误差，确保转录准确率。\n\nWAAS 将原本繁琐的本地语音转写工程转化为稳定的云端服务，让团队从环境维护中解脱，专注于内容生产本身。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fschibsted_WAAS_8354be95.png","schibsted","Schibsted","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fschibsted_b148b16b.png","",null,"schibstedgroup","https:\u002F\u002Fschibsted.com\u002F","https:\u002F\u002Fgithub.com\u002Fschibsted",[86,90,94,98,102],{"name":87,"color":88,"percentage":89},"JavaScript","#f1e05a",47.6,{"name":91,"color":92,"percentage":93},"Python","#3572A5",40,{"name":95,"color":96,"percentage":97},"CSS","#663399",8.8,{"name":99,"color":100,"percentage":101},"HTML","#e34c26",3.3,{"name":103,"color":104,"percentage":105},"Dockerfile","#384d54",0.3,2058,115,"2026-04-06T05:27:22","Apache-2.0","Linux, macOS","非必需。若使用 NVIDIA GPU 加速，需安装 nvidia-docker 并修改配置使用 Dockerfile.gpu；显存需求取决于模型，最小模型 'tiny' 约需 1GB VRAM。","未说明",{"notes":114,"python":115,"dependencies":116},"该项目可通过 docker-compose 一键部署（包含 Redis、API 和 Worker 容器）。若使用 GPU 需在 docker-compose.yml 中启用 nvidia 运行时。最小模型 'tiny' 仅需约 1GB 显存，更大模型需更多显存（参考 OpenAI Whisper 官方文档）。支持通过邮件或 Webhook 接收转录结果。","3.8-3.10",[117,118,119,120],"OpenAI Whisper","Flask","Redis","RQ (Redis Queue)",[21],"2026-03-27T02:49:30.150509","2026-04-06T20:54:07.763537",[125,130,135,140,145,150],{"id":126,"question_zh":127,"answer_zh":128,"source_url":129},19978,"运行服务时遇到内存不足导致任务失败（work-horse terminated unexpectedly），需要多少显存？","显存需求与 OpenAI Whisper 官方仓库中注明的相同。对于本地开发，使用 'tiny' 模型在配备 M1 芯片的 MacBook Pro（8GB 内存）上可以正常运行。如果遇到问题，建议尝试更小的模型尺寸。具体模型需求可参考：https:\u002F\u002Fgithub.com\u002Fopenai\u002Fwhisper#available-models-and-languages","https:\u002F\u002Fgithub.com\u002Fschibsted\u002FWAAS\u002Fissues\u002F94",{"id":131,"question_zh":132,"answer_zh":133,"source_url":134},19979,"如何配置 SMTP 邮件发送功能？为什么环境变量设置后仍无法发送邮件？","首先，.envrc 文件中的变量值不应包含前导的 'export' 关键字。其次，如果使用的 SMTP 服务器登录用户名与发件人邮箱地址不同（例如某些域名服务商的 SMTP），需要额外添加 'EMAIL_SENDER_USERNAME' 变量。解决方法是：在 .envrc 和 docker-compose.yaml 中添加该变量，并修改 mailer.py 代码，使其使用该用户名进行登录验证，同时保留原有的 '_ADDRESS' 变量用于显示发件人地址。","https:\u002F\u002Fgithub.com\u002Fschibsted\u002FWAAS\u002Fissues\u002F96",{"id":136,"question_zh":137,"answer_zh":138,"source_url":139},19980,"浏览器拦截了对 cis.schibsted.com 的 API 调用，这是什么原因？","这是由 Firefox 浏览器内置的跟踪保护功能拦截的。该请求原本用于 Schibsted 内部的内部使用统计（tracking）。在开源版本中，不应该捆绑这些专有追踪器。目前的计划是在前端重构中移除此依赖或允许用户自定义\u002F禁用追踪器。在此之前，被拦截属于正常现象，不影响核心转录功能。","https:\u002F\u002Fgithub.com\u002Fschibsted\u002FWAAS\u002Fissues\u002F153",{"id":141,"question_zh":142,"answer_zh":143,"source_url":144},19981,"是否支持通过编程方式（如 Webhook）接收转录文本文件，而不仅仅是电子邮件？","是的，该项目已支持 Webhook 功能。现在可以通过配置 Webhook 以编程方式接收转录结果，便于与其他服务集成。相关功能已在 PR #95 中实现合并。","https:\u002F\u002Fgithub.com\u002Fschibsted\u002FWAAS\u002Fissues\u002F68",{"id":146,"question_zh":147,"answer_zh":148,"source_url":149},19982,"网站是否支持记住用户上次使用的电子邮件地址？","支持。该功能已在 Issue #73 中修复并上线。现在网站会记住用户最后一次输入的电子邮件地址，方便下次直接使用，无需重复输入。","https:\u002F\u002Fgithub.com\u002Fschibsted\u002FWAAS\u002Fissues\u002F69",{"id":151,"question_zh":152,"answer_zh":153,"source_url":154},19983,"是否有接口可以查询服务累计转录了多少小时的音频？","有的。项目已添加了一个专门的端点（endpoint）来统计并返回服务累计转录的总时长。该功能已在 Issue #74 中实现，可用于评估服务节省的时间。","https:\u002F\u002Fgithub.com\u002Fschibsted\u002FWAAS\u002Fissues\u002F67",[]]