commit 5076963f2cd4d6daba55f72c27ec5a84aa8bc04a Author: old-tom <892955278@msn.cn> Date: Mon Jun 2 21:07:57 2025 +0800 feat:提交 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1aeead1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,228 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be added to the global gitignore or merged into this project gitignore. For a PyCharm +# project, it is recommended to include the following files: +#*.iml +#*.iws +#*.ipr +#out/ + +# Rider +.idea/ +*.sln.iml + +# Visual Studio Code +.vscode/ + +# macOS +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# Project specific +# 模型文件(太大,不适合版本控制) +models/*.onnx +models/*.tar.bz2 +models/*.zip + +# 日志文件 +logs/ +*.log + +# 输出文件 +output/ + +# 临时文件 +temp/ +tmp/ + +# 音频文件 +*.wav +*.mp3 +*.flac +*.m4a + +# 配置文件(可能包含敏感信息) +config.local.py +settings.local.py +.env.local + +# UV 相关 +.uv/ +uv.lock \ No newline at end of file diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..3b2cfc0 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.12.10 diff --git a/.trae/rules/project_rules.md b/.trae/rules/project_rules.md new file mode 100644 index 0000000..3d95a26 --- /dev/null +++ b/.trae/rules/project_rules.md @@ -0,0 +1,42 @@ +# 角色 +你是一名精通python开发的高级工程师,拥有10年的开发经验,擅长使用python 开发各种应用程序,你的任务是帮助用户设计和开发易用且易于维护的应用。请始终遵循最佳实践并坚持干净代码和健壮架构的原则。 + +# 目标 +你的目标是以用户容易理解的方式帮助他们完成应用的设计和开发工作,确保应用功能完善、性能优异、用户体验良好、可扩展性强,并且易于维护和扩展。 + +# 要求 +在理解用户需求、设计UI、编写代码、解决问题和项目迭代优化时,你应该始终遵循以下原则: + +## 一、项目初始化 ++ 在项目开始时,首先仔细阅读项目目录下的README.md文件,包括项目目标、功能架构、技术栈和开发计划。确保对项目的整体架构和实现方法有清晰的认知。 ++ 如果还没有README.md,请主动创建一个,用于后续记录该应用的功能模块、页面结构、数据模型、接口设计等信息。 + +## 二、需求理解 ++ 充分理解用户需求,分析需求是否存在缺漏、冲突,确保需求的完整性和准确性,并与用户讨论完善需求。 ++ 选择最合理的解决方案来满足用户需求,避免过度设计。 + +## 三、UI和样式设计 ++ 使用现代UI框架进行样式设计。 ++ 在不同的平台上实现一致的设计和响应式模式 + +## 四、代码编写 ++ 技术选型:通常已经在README.md中说明,如果没有的话请根据项目需求选择合适的技术栈。你需要仔细阅读相关技术栈的API文档,不能猜测API的使用方法,而应该根据文档进行使用。 ++ 代码结构:通常已经在README.md中说明, 如果没有的话请根据项目需求选择合适的代码结构。强调代码清晰、可读性、模块化、可维护性,遵循最佳实践(如DRY原则、KISS原则、YAGNI原则、最小权限原则、响应式、函数式等)。 ++ 代码安全性:始终考虑代码安全性,避免引入漏洞。 ++ 性能优化:优化代码性能,减少资源占用,提升加载运行速度,确保项目高效运行。 ++ 测试与文档:编写单元测试,确保代码质量,并提供清晰的中文注释和文档,方便后续阅读和维护。 + +## 五、问题解决 ++ 全面月底相关代码和文档,理解项目的整体架构和实现方法、工作原理。 ++ 根据用户的反馈分析问题原因,提出解决方案,确保问题得到有效解决。 ++ 确保每次代码变更不会破坏现有功能,尽可能保持最小的改动。 + +## 六、项目迭代优化 ++ 与用户保持密切沟通,根据反馈调整功能和设计,确保应用符合用户需求。 ++ 在不确定需求时,主动询问用户已澄清需求和技术细节 ++ 每次迭代必须更新说明文件,包括功能说明和优化建议;如果说明文件不存在,请在docs目录下主动创建一个。 + +## 七、方法论 ++ 系统思维:以分析严谨的方式解决问题。可将需求拆解为更小、更易于理解、管理的部分,并在实施前仔细思考每一步。 ++ 思维树:评估多种可能的解决方案及后果。使用结构化的方法探索不用的实现路径,并选择最优的解决方案。 ++ 迭代改进:在最终确定代码前,考虑改进、边缘情况和优化。通过潜在增强的迭代,确保最终解决方案是健壮的。 \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..0e9e0c5 --- /dev/null +++ b/README.md @@ -0,0 +1,54 @@ +本项目目标是实现实时语音识别功能,支持中英文。 +实现思路如下: +1. 语音输入:使用麦克风采集音频数据。 +2. 语音预处理:对音频数据进行预处理,如降噪、增益控制等。 +3. 语音识别:使用语音识别模型将预处理后的音频数据转换为文本。 + +# 基础环境 ++ 操作系统:linux ++ 语言:python 3.12 ++ 虚拟环境及包管理工具:uv ++ 语音识别框架:新一代kaldi ++ 语音识别模型:zipformer ++ 部署框架:sherpa-onnx + +# 目录层级说明 +```text +. +├── .venv +│ ├── bin +│ ├── lib +│ └── pyvenv.cfg +├── .python-version +├── docs +├── src +│ └── main.py +├── config +├── tests +├── static +├── README.md +├── hello.py +├── pyproject.toml +└── uv.lock +``` ++ docs 存放项目文档 ++ src 存放项目源码 ++ config 存放项目配置文件 ++ tests 存放单元测试代码 ++ static 目录下存放静态文件,如图片、css、js等 ++ README.md 项目说明文件 ++ pyproject.toml 项目配置文件 ++ uv.lock 虚拟环境依赖文件 + +除main.py外,其他文件均需要放置在src子目录下,要求子目录名称清晰易读不能过长。 + +# 包管理命令说明 +1. 添加包 uv add +2. 移除包 uv remove +3. 所有包管理命令均需要在项目根目录下执行,并且强制使用uv命令,不能使用pip命令。 + +# 脚本运行命令说明 +1. 运行项目 uv run main.py +2. 运行单元测试 uv run -m pytest tests + +*禁止修改本文件* diff --git a/main.py b/main.py new file mode 100644 index 0000000..c3f4d55 --- /dev/null +++ b/main.py @@ -0,0 +1,153 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +实时语音转文字系统主程序 +基于sherpa-onnx的实时语音识别应用 +""" + +import sys +import argparse +import logging +from pathlib import Path + +# 添加src目录到Python路径 +sys.path.insert(0, str(Path(__file__).parent / "src")) + +from src import RealTimeVTT, ModelDownloader, ModelConfig + +def setup_logging(level: str = "INFO"): + """设置日志""" + logging.basicConfig( + level=getattr(logging, level.upper()), + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' + ) + +def check_models() -> bool: + """检查模型文件是否存在""" + config = ModelConfig() + missing_files = config.validate_model_files() + + if missing_files: + print("错误: 缺少模型文件") + print("缺少的文件:") + for file_path in missing_files: + print(f" - {file_path}") + print("\n请运行以下命令下载模型:") + print(" python main.py --download-model") + return False + + return True + +def download_model_interactive(): + """交互式下载模型""" + config = ModelConfig() + downloader = ModelDownloader(config) + downloader.interactive_download() + +def main(): + """主函数""" + parser = argparse.ArgumentParser( + description="实时语音转文字系统", + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=""" +示例用法: + python main.py # 启动实时语音识别 + python main.py --download-model # 下载语音识别模型 + python main.py --list-devices # 列出音频设备 + python main.py --log-level DEBUG # 启用调试日志 + """ + ) + + parser.add_argument( + "--download-model", + action="store_true", + help="下载语音识别模型" + ) + + parser.add_argument( + "--list-devices", + action="store_true", + help="列出可用的音频设备" + ) + + parser.add_argument( + "--log-level", + choices=["DEBUG", "INFO", "WARNING", "ERROR"], + default="INFO", + help="设置日志级别 (默认: INFO)" + ) + + parser.add_argument( + "--no-save", + action="store_true", + help="不保存识别结果到文件" + ) + + parser.add_argument( + "--no-partial", + action="store_true", + help="不显示部分识别结果" + ) + + args = parser.parse_args() + + # 设置日志 + setup_logging(args.log_level) + + try: + if args.download_model: + # 下载模型 + download_model_interactive() + return + + # 创建应用实例 + app = RealTimeVTT() + + # 应用配置 + if args.no_save: + app.app_config.save_to_file = False + + if args.no_partial: + app.app_config.show_partial_results = False + + if args.list_devices: + # 列出音频设备 + if not app.audio_processor.initialize(): + print("错误: 无法初始化音频设备") + return 1 + + devices = app.list_audio_devices() + print("可用的音频设备:") + for device in devices: + print(f" [{device['index']}] {device['name']}") + print(f" 通道数: {device['channels']}") + print(f" 采样率: {device['sample_rate']} Hz") + + app.cleanup() + return + + # 检查模型文件 + if not check_models(): + return 1 + + # 初始化应用 + if not app.initialize(): + print("错误: 应用初始化失败") + return 1 + + # 运行应用 + app.run_interactive() + + except KeyboardInterrupt: + print("\n程序被用户中断") + except Exception as e: + print(f"错误: {e}") + if args.log_level == "DEBUG": + import traceback + traceback.print_exc() + return 1 + + return 0 + +if __name__ == "__main__": + sys.exit(main()) diff --git a/models/tokens.txt b/models/tokens.txt new file mode 100644 index 0000000..980dd6c --- /dev/null +++ b/models/tokens.txt @@ -0,0 +1,6257 @@ + 0 + 1 + 2 +▁AS 3 +▁ONE 4 +▁OF 5 +▁A 6 +▁COMP 7 +AN 8 +Y 9 +▁SOME 10 +▁HUNDRED 11 +▁AND 12 +▁FI 13 +F 14 +T 15 +▁ME 16 +N 17 +▁WO 18 +M 19 +EN 20 +▁NOT 21 +▁LA 22 +BO 23 +UR 24 +ING 25 +▁UNDER 26 +▁ANY 27 +▁SU 28 +S 29 +P 30 +IC 31 +ION 32 +▁ 33 +LU 34 +AC 35 +▁THAT 36 +▁THE 37 +▁CO 38 +▁CHA 39 +CE 40 +RY 41 +▁THOUGH 42 +▁SH 43 +IN 44 +B 45 +J 46 +E 47 +C 48 +▁MUCH 49 +▁PO 50 +UL 51 +AR 52 +▁PRE 53 +U 54 +DI 55 +▁AT 56 +▁WHICH 57 +▁POINT 58 +▁I 59 +▁JU 60 +D 61 +GE 62 +▁E 63 +▁HAD 64 +▁CA 65 +▁IN 66 +▁MY 67 +▁DI 68 +RE 69 +CTION 70 +▁WAS 71 +L 72 +MO 73 +ATE 74 +▁THERE 75 +▁BEEN 76 +▁HE 77 +IT 78 +TED 79 +▁T 80 +RI 81 +VI 82 +AL 83 +▁B 84 +LE 85 +ISH 86 +▁OR 87 +▁SO 88 +▁IT 89 +▁RA 90 +TE 91 +▁PRO 92 +G 93 +▁BUT 94 +▁THIS 95 +▁EX 96 +A 97 +ER 98 +ATED 99 +▁EN 100 +TI 101 +LY 102 +OW 103 +▁TO 104 +▁PA 105 +R 106 +IM 107 +ON 108 +▁PUBLIC 109 +▁GU 110 +IL 111 +▁APP 112 +ED 113 +▁UN 114 +ENT 115 +▁MOST 116 +▁DE 117 +TER 118 +▁MAN 119 +▁ON 120 +▁BY 121 +▁NO 122 +▁MEAN 123 +▁NUMBER 124 +O 125 +▁BELIEVE 126 +▁RI 127 +CH 128 +▁SECOND 129 +▁OTHER 130 +▁K 131 +▁WILL 132 +▁DO 133 +▁WELL 134 +▁SEE 135 +UND 136 +▁JO 137 +KE 138 +▁BE 139 +▁BO 140 +OK 141 +▁COULD 142 +▁THEM 143 +▁THESE 144 +▁P 145 +AGE 146 +▁SHA 147 +ME 148 +IOUS 149 +▁IS 150 +▁ONLY 151 +▁WORD 152 +▁RE 153 +K 154 +I 155 +▁SHOULD 156 +▁HAVE 157 +OR 158 +ITY 159 +▁WHAT 160 +LL 161 +▁SP 162 +TA 163 +NE 164 +OUS 165 +▁COM 166 +US 167 +TION 168 +▁HAS 169 +▁S 170 +TH 171 +▁MI 172 +RO 173 +▁GOOD 174 +▁FRIEND 175 +▁LE 176 +W 177 +ES 178 +▁WITH 179 +▁WHO 180 +▁THINK 181 +▁MU 182 +IG 183 +▁MO 184 +▁MIGHT 185 +▁AN 186 +QU 187 +ATION 188 +▁FROM 189 +▁NA 190 +TURE 191 +▁ALL 192 +IES 193 +▁LET 194 +▁TIME 195 +▁WHEN 196 +▁EVEN 197 +▁NEED 198 +▁O 199 +VE 200 +▁WI 201 +FUL 202 +▁NE 203 +LI 204 +AD 205 +ERS 206 +▁BEFORE 207 +▁WORK 208 +▁LIKE 209 +▁HAND 210 +▁THEN 211 +SH 212 +▁WERE 213 +OM 214 +▁KNOW 215 +EL 216 +MA 217 +▁OVER 218 +▁LO 219 +TING 220 +▁LI 221 +OL 222 +▁HA 223 +MP 224 +LA 225 +ABLE 226 +MB 227 +▁WE 228 +▁ST 229 +ET 230 +▁IF 231 +▁WA 232 +▁NEW 233 +IR 234 +▁FA 235 +▁G 236 +IAN 237 +ND 238 +VER 239 +IS 240 +▁DIS 241 +CO 242 +UN 243 +▁SEVEN 244 +▁TH 245 +▁AFTER 246 +WARD 247 +▁RO 248 +▁WOULD 249 +▁SA 250 +▁FOR 251 +▁FE 252 +▁LONG 253 +▁STILL 254 +▁CON 255 +X 256 +▁HERE 257 +▁EVERYTHING 258 +▁SE 259 +ANT 260 +ALLY 261 +RU 262 +▁THAN 263 +ANCE 264 +▁ARE 265 +▁NEXT 266 +▁DOWN 267 +▁CHI 268 +▁MA 269 +CK 270 +▁DR 271 +Z 272 +▁F 273 +ROW 274 +▁GO 275 +▁INTO 276 +INE 277 +▁SIX 278 +▁YEAR 279 +▁HIS 280 +CI 281 +ENCE 282 +▁CLOSE 283 +▁LAST 284 +▁C 285 +▁MORE 286 +▁THOUSAND 287 +LO 288 +▁UP 289 +▁WANT 290 +▁JA 291 +▁GA 292 +▁THROUGH 293 +▁PLACE 294 +▁HU 295 +MAN 296 +UGH 297 +IST 298 +▁HO 299 +▁BETTER 300 +▁THEIR 301 +▁VERY 302 +NG 303 +▁ANOTHER 304 +▁UM 305 +AS 306 +▁TE 307 +V 308 +▁HER 309 +▁HIGH 310 +QUI 311 +▁BECAUSE 312 +▁SHOW 313 +▁WHERE 314 +▁DAY 315 +▁BRO 316 +▁OLD 317 +MENT 318 +▁HARD 319 +▁THOSE 320 +CU 321 +AT 322 +▁INTEREST 323 +▁EVERY 324 +HE 325 +▁GIVE 326 +▁FACT 327 +▁FOUND 328 +▁HEAR 329 +▁NEVER 330 +▁CAN 331 +▁COME 332 +▁SORT 333 +ITION 334 +EST 335 +IGHT 336 +SHIP 337 +SIDE 338 +▁GREAT 339 +▁MAR 340 +▁GET 341 +▁OUT 342 +▁STA 343 +OP 344 +AIN 345 +▁PI 346 +RA 347 +ID 348 +▁DA 349 +▁LOOK 350 +END 351 +▁BA 352 +VO 353 +H 354 +▁LITTLE 355 +▁THEY 356 +▁ALWAYS 357 +CA 358 +▁HOUSE 359 +TIC 360 +IVE 361 +▁RU 362 +HO 363 +▁RIGHT 364 +ICAL 365 +HA 366 +▁AGAIN 367 +▁EXP 368 +IBLE 369 +▁CERTAIN 370 +▁SHE 371 +▁PRI 372 +▁PLAY 373 +▁VA 374 +LIC 375 +▁TWO 376 +▁THREE 377 +▁DOES 378 +▁YOU 379 +▁TALK 380 +▁ABOUT 381 +UT 382 +▁WITHOUT 383 +▁PEOPLE 384 +FF 385 +▁DON 386 +▁HAPPEN 387 +▁PERSON 388 +▁MADE 389 +▁PART 390 +▁HOW 391 +▁WHY 392 +▁MAKE 393 +▁HIM 394 +▁STATE 395 +▁GRA 396 +▁TRA 397 +FOR 398 +▁LIFE 399 +▁PER 400 +AM 401 +▁DU 402 +PORT 403 +IA 404 +▁BUSINESS 405 +▁UNDERSTAND 406 +▁PLAN 407 +▁KEEP 408 +▁GOT 409 +▁MONEY 410 +▁OWN 411 +▁MANY 412 +ONE 413 +▁BU 414 +▁REALLY 415 +▁COURSE 416 +▁THINGS 417 +▁SAID 418 +▁US 419 +▁WAY 420 +▁TAKE 421 +▁WORLD 422 +▁THING 423 +▁SAY 424 +▁TA 425 +▁SOMETHING 426 +▁LEARN 427 +DE 428 +▁QUESTION 429 +DAY 430 +▁NOW 431 +▁BACK 432 +▁YOUR 433 +ACH 434 +▁SPEAK 435 +▁TURN 436 +ATIVE 437 +▁OUR 438 +▁JE 439 +▁VI 440 +▁HI 441 +▁OP 442 +▁WEEK 443 +▁IDEA 444 +▁AWAY 445 +▁COUNT 446 +NESS 447 +▁REASON 448 +PH 449 +▁TWENTY 450 +▁QUITE 451 +▁CHANGE 452 +▁LOVE 453 +DUC 454 +▁SAME 455 +▁ENOUGH 456 +▁YES 457 +▁FEEL 458 +▁FIRST 459 +▁WHILE 460 +IZE 461 +▁ANYTHING 462 +▁DID 463 +▁KIND 464 +▁POWER 465 +▁JUST 466 +IF 467 +▁PH 468 +▁ANSWER 469 +▁FIND 470 +▁THANK 471 +▁BUILD 472 +▁GOING 473 +▁CAME 474 +▁TOGETHER 475 +▁IMPORTANT 476 +▁HELP 477 +▁FOUR 478 +▁DIFFERENT 479 +▁AROUND 480 +▁AMERICA 481 +▁ALSO 482 +▁NINE 483 +▁AH 484 +▁LOT 485 +▁BETWEEN 486 +▁START 487 +▁SCHOOL 488 +▁SYSTEM 489 +▁MAYBE 490 +▁ACTUALLY 491 +▁PROBLEM 492 +Q 493 +▁MR 494 +▁YEAH 495 +▁OKAY 496 +以 497 +后 498 +你 499 +是 500 +男 501 +孩 502 +子 503 +曾 504 +丽 505 +婷 506 +妈 507 +很 508 +想 509 +兰 510 +州 511 +哪 512 +有 513 +买 514 +路 515 +虎 516 +汽 517 +车 518 +的 519 +我 520 +家 521 +狗 522 +叫 523 +什 524 +么 525 +名 526 +字 527 +现 528 +在 529 +网 530 +络 531 +怎 532 +样 533 +鞍 534 +山 535 +到 536 +郑 537 +大 538 +巴 539 +上 540 +没 541 +厕 542 +所 543 +英 544 +文 545 +给 546 +一 547 +个 548 +惊 549 +喜 550 +看 551 +日 552 +程 553 +表 554 +形 555 +容 556 +人 557 +强 558 +势 559 +面 560 +前 561 +不 562 +敢 563 +吭 564 +声 565 +词 566 +儿 567 +些 568 +办 569 +法 570 +说 571 +话 572 +唱 573 +首 574 +老 575 +与 576 +海 577 +婆 578 +笨 579 +蛋 580 +为 581 +欢 582 +女 583 +呢 584 +杭 585 +里 586 +可 587 +打 588 +炮 589 +朋 590 +友 591 +啊 592 +对 593 +练 594 +语 595 +听 596 +力 597 +帮 598 +助 599 +歌 600 +请 601 +推 602 +荐 603 +几 604 +谢 605 +明 606 +天 607 +早 608 +七 609 +点 610 +起 611 +床 612 +时 613 +候 614 +睡 615 +觉 616 +会 617 +了 618 +吗 619 +查 620 +本 621 +地 622 +气 623 +公 624 +快 625 +吧 626 +注 627 +意 628 +安 629 +全 630 +要 631 +错 632 +过 633 +四 634 +川 635 +再 636 +讲 637 +笑 638 +好 639 +午 640 +连 641 +烟 642 +台 643 +轮 644 +船 645 +史 646 +记 647 +商 648 +君 649 +列 650 +传 651 +孙 652 +鞅 653 +乃 654 +遂 655 +西 656 +入 657 +秦 658 +翻 659 +译 660 +做 661 +下 662 +提 663 +醒 664 +发 665 +送 666 +排 667 +班 668 +邮 669 +件 670 +刘 671 +俊 672 +峰 673 +电 674 +播 675 +放 676 +曲 677 +最 678 +炫 679 +民 680 +族 681 +风 682 +还 683 +年 684 +中 685 +泰 686 +拉 687 +石 688 +光 689 +剑 690 +任 691 +务 692 +玛 693 +雅 694 +预 695 +言 696 +真 697 +视 698 +频 699 +爱 700 +范 701 +冰 702 +出 703 +演 704 +剧 705 +六 706 +三 707 +十 708 +分 709 +退 710 +当 711 +模 712 +式 713 +附 714 +近 715 +洗 716 +浴 717 +方 718 +交 719 +和 720 +玩 721 +见 722 +工 723 +作 724 +干 725 +就 726 +能 727 +疖 728 +吃 729 +饭 730 +或 731 +者 732 +其 733 +他 734 +东 735 +国 736 +移 737 +动 738 +通 739 +信 740 +限 741 +司 742 +介 743 +绍 744 +讯 745 +录 746 +载 747 +装 748 +跟 749 +位 750 +置 751 +离 752 +莞 753 +长 754 +站 755 +多 756 +远 757 +福 758 +建 759 +高 760 +速 761 +服 762 +少 763 +把 764 +这 765 +定 766 +成 767 +彩 768 +铃 769 +手 770 +机 771 +别 772 +忘 773 +盒 774 +拿 775 +回 776 +校 777 +区 778 +万 779 +口 780 +坐 781 +冷 782 +漠 783 +醉 784 +红 785 +颜 786 +来 787 +猪 788 +张 789 +波 790 +炎 791 +亚 792 +纶 793 +媳 794 +妇 795 +马 796 +志 797 +华 798 +短 799 +清 800 +图 801 +片 802 +生 803 +五 804 +钟 805 +开 806 +启 807 +蓝 808 +牙 809 +锂 810 +池 811 +初 812 +次 813 +充 814 +让 815 +今 816 +号 817 +顷 818 +等 819 +于 820 +平 821 +也 822 +呀 823 +聊 824 +问 825 +主 826 +结 827 +婚 828 +恭 829 +情 830 +流 831 +返 832 +洒 833 +热 834 +泪 835 +诗 836 +那 837 +去 838 +眠 839 +药 840 +功 841 +使 842 +用 843 +象 844 +间 845 +估 846 +计 847 +厚 848 +德 849 +物 850 +思 851 +搞 852 +们 853 +只 854 +知 855 +道 856 +奥 857 +特 858 +曼 859 +越 860 +野 861 +比 862 +较 863 +重 864 +新 865 +陈 866 +奕 867 +迅 868 +泉 869 +湾 870 +票 871 +呵 872 +活 873 +经 874 +历 875 +摇 876 +痴 877 +此 878 +刻 879 +呈 880 +报 881 +脑 882 +总 883 +着 884 +她 885 +阿 886 +斯 887 +顿 888 +丁 889 +影 890 +终 891 +幻 892 +雨 893 +否 894 +带 895 +伞 896 +休 897 +息 898 +值 899 +百 900 +每 901 +月 902 +找 903 +扎 904 +屯 905 +线 906 +仙 907 +奇 908 +侠 909 +业 910 +写 911 +完 912 +姐 913 +稍 914 +烤 915 +鹅 916 +肠 917 +团 918 +狩 919 +猎 920 +美 921 +忍 922 +向 923 +冲 924 +常 925 +熟 926 +度 927 +折 928 +扣 929 +二 930 +乘 931 +教 932 +实 933 +认 934 +证 935 +考 936 +试 937 +答 938 +案 939 +费 940 +脸 941 +自 942 +恋 943 +广 944 +府 945 +待 946 +赶 947 +集 948 +告 949 +诉 950 +太 951 +懂 952 +坏 953 +泡 954 +妞 955 +伊 956 +更 957 +健 958 +康 959 +检 960 +乙 961 +肝 962 +厦 963 +门 964 +急 965 +控 966 +毒 967 +产 968 +头 969 +脚 970 +轻 971 +感 972 +空 973 +订 974 +从 975 +碑 976 +店 977 +北 978 +京 979 +火 980 +鸡 981 +白 982 +态 983 +啥 984 +幺 985 +哈 986 +尔 987 +滨 988 +至 989 +硬 990 +座 991 +换 992 +姿 993 +亲 994 +级 995 +紫 996 +秋 997 +叶 998 +刀 999 +爆 1000 +率 1001 +馨 1002 +予 1003 +帅 1004 +汇 1005 +询 1006 +小 1007 +唉 1008 +性 1009 +挺 1010 +厉 1011 +害 1012 +八 1013 +米 1014 +跑 1015 +步 1016 +达 1017 +标 1018 +规 1019 +准 1020 +码 1021 +音 1022 +拨 1023 +器 1024 +油 1025 +价 1026 +卡 1027 +尿 1028 +防 1029 +杀 1030 +死 1031 +倍 1032 +晋 1033 +映 1034 +部 1035 +韩 1036 +己 1037 +右 1038 +键 1039 +编 1040 +辑 1041 +您 1042 +房 1043 +租 1044 +具 1045 +体 1046 +牌 1047 +瑞 1048 +士 1049 +浪 1050 +琴 1051 +简 1052 +永 1053 +拥 1054 +灿 1055 +烂 1056 +朝 1057 +阳 1058 +解 1059 +赢 1060 +事 1061 +滚 1062 +周 1063 +吕 1064 +忠 1065 +页 1066 +心 1067 +份 1068 +被 1069 +龙 1070 +肖 1071 +半 1072 +喊 1073 +改 1074 +堵 1075 +饿 1076 +瞌 1077 +叔 1078 +戏 1079 +兴 1080 +化 1081 +备 1082 +萍 1083 +乡 1084 +钓 1085 +鱼 1086 +岛 1087 +消 1088 +忻 1089 +襄 1090 +县 1091 +况 1092 +得 1093 +王 1094 +属 1095 +假 1096 +期 1097 +像 1098 +脾 1099 +零 1100 +九 1101 +关 1102 +晚 1103 +陪 1104 +危 1105 +苦 1106 +难 1107 +例 1108 +顺 1109 +序 1110 +盖 1111 +茨 1112 +邦 1113 +故 1114 +警 1115 +戒 1116 +搜 1117 +索 1118 +黄 1119 +照 1120 +底 1121 +识 1122 +武 1123 +汉 1124 +第 1125 +博 1126 +基 1127 +尼 1128 +删 1129 +除 1130 +沃 1131 +狐 1132 +场 1133 +卖 1134 +便 1135 +宜 1136 +营 1137 +厅 1138 +资 1139 +料 1140 +哥 1141 +句 1142 +员 1143 +随 1144 +导 1145 +航 1146 +学 1147 +星 1148 +脱 1149 +毛 1150 +膏 1151 +种 1152 +乐 1153 +贵 1154 +妃 1155 +酒 1156 +内 1157 +条 1158 +联 1159 +系 1160 +希 1161 +望 1162 +非 1163 +苹 1164 +果 1165 +银 1166 +登 1167 +户 1168 +密 1169 +师 1170 +沟 1171 +莫 1172 +才 1173 +喝 1174 +累 1175 +彭 1176 +裘 1177 +莹 1178 +珠 1179 +徐 1180 +管 1181 +爸 1182 +敏 1183 +腰 1184 +闪 1185 +舟 1186 +凯 1187 +肯 1188 +水 1189 +济 1190 +闻 1191 +约 1192 +伦 1193 +乱 1194 +舞 1195 +春 1196 +叮 1197 +咚 1198 +昨 1199 +又 1200 +宵 1201 +省 1202 +途 1203 +无 1204 +院 1205 +吉 1206 +农 1207 +股 1208 +胶 1209 +布 1210 +谁 1211 +免 1212 +疫 1213 +逗 1214 +闹 1215 +闭 1216 +青 1217 +景 1218 +花 1219 +园 1220 +富 1221 +桥 1222 +哭 1223 +节 1224 +树 1225 +茂 1226 +盛 1227 +边 1228 +余 1229 +姚 1230 +走 1231 +原 1232 +行 1233 +都 1234 +旅 1235 +馆 1236 +宾 1237 +根 1238 +修 1239 +理 1240 +厂 1241 +板 1242 +诊 1243 +专 1244 +复 1245 +鹰 1246 +队 1247 +桌 1248 +财 1249 +港 1250 +色 1251 +诚 1252 +勿 1253 +扰 1254 +持 1255 +孟 1256 +古 1257 +医 1258 +研 1259 +究 1260 +取 1261 +卫 1262 +目 1263 +铁 1264 +麻 1265 +将 1266 +浏 1267 +览 1268 +湿 1269 +朱 1270 +沱 1271 +合 1272 +江 1273 +何 1274 +祈 1275 +祷 1276 +义 1277 +酷 1278 +派 1279 +如 1280 +咩 1281 +正 1282 +算 1283 +楼 1284 +距 1285 +震 1286 +借 1287 +政 1288 +策 1289 +温 1290 +宝 1291 +沙 1292 +角 1293 +肚 1294 +疼 1295 +林 1296 +宿 1297 +舍 1298 +阴 1299 +晴 1300 +圆 1301 +缺 1302 +微 1303 +辽 1304 +刚 1305 +牛 1306 +偷 1307 +吓 1308 +跳 1309 +城 1310 +吴 1311 +称 1312 +呼 1313 +爷 1314 +埋 1315 +怨 1316 +缠 1317 +柴 1318 +钱 1319 +极 1320 +先 1321 +辞 1322 +职 1323 +哦 1324 +啦 1325 +售 1326 +保 1327 +黑 1328 +客 1329 +立 1330 +足 1331 +之 1332 +鬼 1333 +留 1334 +辟 1335 +邪 1336 +谱 1337 +减 1338 +肥 1339 +皇 1340 +萨 1341 +舅 1342 +幽 1343 +默 1344 +细 1345 +胞 1346 +溪 1347 +懒 1348 +书 1349 +杨 1350 +慧 1351 +芝 1352 +屁 1353 +画 1354 +晨 1355 +宁 1356 +侦 1357 +探 1358 +柯 1359 +南 1360 +涛 1361 +应 1362 +该 1363 +弑 1364 +神 1365 +魔 1366 +创 1367 +世 1368 +游 1369 +犯 1370 +已 1371 +泽 1372 +村 1373 +变 1374 +奏 1375 +杰 1376 +偶 1377 +命 1378 +乔 1379 +恩 1380 +并 1381 +阅 1382 +读 1383 +左 1384 +般 1385 +低 1386 +调 1387 +阔 1388 +烦 1389 +球 1390 +峡 1391 +界 1392 +霆 1393 +锋 1394 +柏 1395 +需 1396 +艺 1397 +术 1398 +弄 1399 +章 1400 +悲 1401 +咒 1402 +版 1403 +统 1404 +羊 1405 +肉 1406 +斤 1407 +嘿 1408 +郁 1409 +闷 1410 +进 1411 +姨 1412 +庆 1413 +威 1414 +两 1415 +岸 1416 +普 1417 +琪 1418 +玫 1419 +瑰 1420 +香 1421 +碟 1422 +眼 1423 +收 1424 +湖 1425 +禽 1426 +涮 1427 +汪 1428 +盘 1429 +夹 1430 +存 1431 +枕 1432 +指 1433 +针 1434 +仓 1435 +库 1436 +餐 1437 +块 1438 +咪 1439 +毕 1440 +薪 1441 +赛 1442 +纪 1443 +末 1444 +典 1445 +娱 1446 +傻 1447 +嘲 1448 +彪 1449 +升 1450 +润 1451 +核 1452 +遍 1453 +接 1454 +元 1455 +鼓 1456 +屿 1457 +爹 1458 +胡 1459 +雪 1460 +招 1461 +喂 1462 +齿 1463 +侣 1464 +土 1465 +豆 1466 +铿 1467 +锵 1468 +聪 1469 +但 1470 +飞 1471 +鹤 1472 +壁 1473 +摞 1474 +久 1475 +冬 1476 +骏 1477 +然 1478 +讨 1479 +论 1480 +腾 1481 +易 1482 +筋 1483 +转 1484 +弯 1485 +耳 1486 +齐 1487 +阶 1488 +革 1489 +代 1490 +许 1491 +圣 1492 +诞 1493 +吸 1494 +血 1495 +燕 1496 +松 1497 +鼠 1498 +确 1499 +凤 1500 +凰 1501 +由 1502 +翔 1503 +段 1504 +超 1505 +精 1506 +支 1507 +扶 1508 +室 1509 +包 1510 +菜 1511 +田 1512 +骂 1513 +洋 1514 +舒 1515 +衡 1516 +款 1517 +嘴 1518 +菲 1519 +嘛 1520 +嗨 1521 +鸟 1522 +玉 1523 +数 1524 +贝 1525 +郝 1526 +漫 1527 +诺 1528 +衣 1529 +嫖 1530 +娼 1531 +穿 1532 +骨 1533 +拆 1534 +伤 1535 +获 1536 +奖 1537 +稿 1538 +锅 1539 +购 1540 +治 1541 +痘 1542 +遗 1543 +疤 1544 +痕 1545 +饱 1546 +寻 1547 +瓷 1548 +妹 1549 +徽 1550 +参 1551 +格 1552 +题 1553 +凭 1554 +住 1555 +剖 1556 +腹 1557 +祝 1558 +贺 1559 +加 1560 +跪 1561 +潞 1562 +云 1563 +端 1564 +木 1565 +烁 1566 +朵 1567 +赵 1568 +潘 1569 +津 1570 +滋 1571 +燥 1572 +利 1573 +负 1574 +昆 1575 +因 1576 +森 1577 +及 1578 +病 1579 +固 1580 +市 1581 +烧 1582 +番 1583 +茄 1584 +炒 1585 +而 1586 +凉 1587 +冒 1588 +量 1589 +夸 1590 +尾 1591 +崔 1592 +另 1593 +处 1594 +铺 1595 +沈 1596 +哎 1597 +身 1598 +哟 1599 +习 1600 +虞 1601 +瞧 1602 +烈 1603 +皮 1604 +鞋 1605 +深 1606 +圳 1607 +委 1608 +胖 1609 +猴 1610 +军 1611 +素 1612 +楷 1613 +补 1614 +偿 1615 +屏 1616 +散 1617 +效 1618 +丹 1619 +念 1620 +绝 1621 +艳 1622 +够 1623 +狼 1624 +且 1625 +龄 1626 +乌 1627 +蓉 1628 +厘 1629 +含 1630 +庚 1631 +澈 1632 +犬 1633 +致 1634 +运 1635 +慢 1636 +钻 1637 +李 1638 +轩 1639 +育 1640 +项 1641 +咱 1642 +误 1643 +弟 1644 +依 1645 +尽 1646 +河 1647 +夫 1648 +沁 1649 +始 1650 +芳 1651 +禺 1652 +旧 1653 +坑 1654 +胜 1655 +酱 1656 +漂 1657 +亮 1658 +战 1659 +斗 1660 +严 1661 +娟 1662 +逼 1663 +添 1664 +盈 1665 +萝 1666 +莉 1667 +肌 1668 +唐 1669 +兵 1670 +辆 1671 +双 1672 +佛 1673 +傅 1674 +劲 1675 +直 1676 +测 1677 +苏 1678 +迁 1679 +沭 1680 +祥 1681 +婴 1682 +品 1683 +销 1684 +禹 1685 +哲 1686 +嗯 1687 +趟 1688 +拐 1689 +金 1690 +满 1691 +套 1692 +倒 1693 +千 1694 +迎 1695 +淇 1696 +驾 1697 +拟 1698 +良 1699 +揭 1700 +杯 1701 +淄 1702 +睛 1703 +制 1704 +枪 1705 +抢 1706 +狸 1707 +泥 1708 +造 1709 +哇 1710 +羯 1711 +庙 1712 +逃 1713 +朗 1714 +领 1715 +悟 1716 +湛 1717 +贸 1718 +垃 1719 +圾 1720 +软 1721 +莲 1722 +味 1723 +旺 1724 +旦 1725 +潮 1726 +奶 1727 +央 1728 +惜 1729 +续 1730 +咨 1731 +茅 1732 +父 1733 +母 1734 +笔 1735 +封 1736 +同 1737 +黎 1738 +共 1739 +科 1740 +相 1741 +镇 1742 +贤 1743 +宏 1744 +洲 1745 +瓦 1746 +寨 1747 +受 1748 +梦 1749 +呗 1750 +苍 1751 +丘 1752 +避 1753 +孕 1754 +灰 1755 +尤 1756 +击 1757 +腮 1758 +腺 1759 +兆 1760 +坨 1761 +屎 1762 +忧 1763 +草 1764 +赠 1765 +外 1766 +险 1767 +某 1768 +磁 1769 +贷 1770 +反 1771 +罚 1772 +昌 1773 +饰 1774 +辉 1775 +权 1776 +材 1777 +炯 1778 +签 1779 +追 1780 +求 1781 +催 1782 +痛 1783 +盱 1784 +眙 1785 +围 1786 +淘 1787 +幸 1788 +扫 1789 +旭 1790 +切 1791 +磋 1792 +冠 1793 +征 1794 +郎 1795 +骗 1796 +哄 1797 +释 1798 +蒙 1799 +涯 1800 +碧 1801 +斜 1802 +嫁 1803 +幕 1804 +哼 1805 +钢 1806 +碳 1807 +纤 1808 +维 1809 +决 1810 +妻 1811 +未 1812 +绳 1813 +断 1814 +寺 1815 +妙 1816 +伯 1817 +蹲 1818 +宅 1819 +吵 1820 +娃 1821 +兄 1822 +廷 1823 +夺 1824 +社 1825 +示 1826 +按 1827 +饺 1828 +甜 1829 +蜜 1830 +咖 1831 +啡 1832 +优 1833 +逛 1834 +街 1835 +著 1836 +杂 1837 +址 1838 +荷 1839 +塘 1840 +拜 1841 +币 1842 +迟 1843 +货 1844 +粉 1845 +刮 1846 +破 1847 +射 1848 +狂 1849 +苗 1850 +罗 1851 +设 1852 +困 1853 +湘 1854 +潭 1855 +评 1856 +娘 1857 +涉 1858 +采 1859 +芙 1860 +夜 1861 +捷 1862 +斩 1863 +摩 1864 +托 1865 +泳 1866 +琳 1867 +律 1868 +官 1869 +劫 1870 +蛮 1871 +替 1872 +架 1873 +悬 1874 +浮 1875 +窗 1876 +顶 1877 +敦 1878 +善 1879 +哉 1880 +桂 1881 +勇 1882 +荆 1883 +镜 1884 +监 1885 +怕 1886 +呐 1887 +劳 1888 +莱 1889 +狮 1890 +宽 1891 +袋 1892 +囊 1893 +秀 1894 +卸 1895 +链 1896 +嵩 1897 +韭 1898 +葆 1899 +额 1900 +翼 1901 +忙 1902 +瓶 1903 +梅 1904 +堰 1905 +粒 1906 +汤 1907 +谋 1908 +樊 1909 +恨 1910 +愿 1911 +锡 1912 +申 1913 +护 1914 +庄 1915 +临 1916 +源 1917 +环 1918 +境 1919 +礼 1920 +恐 1921 +晒 1922 +虫 1923 +划 1924 +鸣 1925 +怖 1926 +伍 1927 +佰 1928 +岁 1929 +组 1930 +响 1931 +类 1932 +韶 1933 +克 1934 +洛 1935 +玲 1936 +裤 1937 +柔 1938 +疆 1939 +篮 1940 +伟 1941 +扔 1942 +掉 1943 +媒 1944 +涨 1945 +透 1946 +纯 1947 +怀 1948 +坊 1949 +麦 1950 +菠 1951 +养 1952 +晕 1953 +群 1954 +展 1955 +厌 1956 +拒 1957 +单 1958 +静 1959 +刷 1960 +插 1961 +肛 1962 +互 1963 +蘑 1964 +菇 1965 +姑 1966 +桐 1967 +辛 1968 +察 1969 +毫 1970 +质 1971 +差 1972 +翰 1973 +爽 1974 +欣 1975 +议 1976 +铜 1977 +籍 1978 +争 1979 +喆 1980 +孔 1981 +堤 1982 +薇 1983 +茵 1984 +席 1985 +琼 1986 +杠 1987 +衔 1988 +概 1989 +往 1990 +邢 1991 +惠 1992 +烫 1993 +绑 1994 +崇 1995 +帝 1996 +据 1997 +貌 1998 +似 1999 +胸 2000 +罩 2001 +构 2002 +尊 2003 +秘 2004 +它 2005 +详 2006 +悠 2007 +闲 2008 +违 2009 +陆 2010 +割 2011 +绩 2012 +企 2013 +绥 2014 +辐 2015 +舌 2016 +寂 2017 +寞 2018 +宇 2019 +携 2020 +拳 2021 +观 2022 +魏 2023 +郭 2024 +磊 2025 +副 2026 +梁 2027 +斌 2028 +须 2029 +僧 2030 +徒 2031 +季 2032 +灯 2033 +梯 2034 +墙 2035 +付 2036 +坦 2037 +殊 2038 +曹 2039 +操 2040 +捡 2041 +赤 2042 +盗 2043 +废 2044 +蒋 2045 +浙 2046 +食 2047 +咯 2048 +童 2049 +坡 2050 +剪 2051 +唯 2052 +疗 2053 +状 2054 +暴 2055 +缓 2056 +誉 2057 +衰 2058 +宋 2059 +娜 2060 +雄 2061 +谛 2062 +糖 2063 +羽 2064 +棋 2065 +滩 2066 +佳 2067 +臭 2068 +帆 2069 +岳 2070 +疲 2071 +惫 2072 +滴 2073 +倾 2074 +盆 2075 +谷 2076 +施 2077 +晶 2078 +赚 2079 +澡 2080 +遇 2081 +鲁 2082 +祭 2083 +灶 2084 +独 2085 +谈 2086 +承 2087 +蜀 2088 +丰 2089 +归 2090 +辜 2091 +扇 2092 +渴 2093 +羡 2094 +慕 2095 +裸 2096 +宗 2097 +纬 2098 +亦 2099 +儒 2100 +霸 2101 +翡 2102 +翠 2103 +芭 2104 +抱 2105 +歉 2106 +邱 2107 +夏 2108 +隆 2109 +灵 2110 +珍 2111 +浩 2112 +乾 2113 +坤 2114 +培 2115 +训 2116 +压 2117 +偏 2118 +骤 2119 +熙 2120 +葬 2121 +姆 2122 +兽 2123 +筑 2124 +丝 2125 +若 2126 +诡 2127 +异 2128 +侯 2129 +摆 2130 +俗 2131 +缚 2132 +束 2133 +愁 2134 +盟 2135 +却 2136 +显 2137 +肤 2138 +茹 2139 +荣 2140 +增 2141 +宫 2142 +局 2143 +适 2144 +楚 2145 +驻 2146 +纽 2147 +秒 2148 +辣 2149 +虾 2150 +甘 2151 +肃 2152 +粕 2153 +喻 2154 +敬 2155 +谨 2156 +慎 2157 +竭 2158 +止 2159 +际 2160 +寓 2161 +勤 2162 +挫 2163 +泣 2164 +奈 2165 +圭 2166 +焰 2167 +猩 2168 +守 2169 +允 2170 +兔 2171 +篇 2172 +敌 2173 +辕 2174 +猫 2175 +柠 2176 +檬 2177 +橘 2178 +卜 2179 +妓 2180 +既 2181 +闯 2182 +胆 2183 +刁 2184 +竟 2185 +竞 2186 +冯 2187 +陇 2188 +赣 2189 +呆 2190 +滞 2191 +停 2192 +邯 2193 +郸 2194 +域 2195 +徕 2196 +患 2197 +甲 2198 +亡 2199 +鼻 2200 +背 2201 +戴 2202 +幼 2203 +伙 2204 +括 2205 +邓 2206 +谐 2207 +担 2208 +浑 2209 +抖 2210 +耍 2211 +综 2212 +失 2213 +蕾 2214 +鸭 2215 +莘 2216 +选 2217 +糸 2218 +桶 2219 +弃 2220 +暗 2221 +卓 2222 +榜 2223 +拼 2224 +壅 2225 +丈 2226 +锈 2227 +恢 2228 +刺 2229 +嘻 2230 +顾 2231 +投 2232 +晓 2233 +巨 2234 +抽 2235 +档 2236 +乳 2237 +迪 2238 +蠢 2239 +裹 2240 +唤 2241 +焦 2242 +择 2243 +俺 2244 +技 2245 +暧 2246 +昧 2247 +怪 2248 +坛 2249 +眉 2250 +嘉 2251 +逸 2252 +课 2253 +栏 2254 +撬 2255 +框 2256 +液 2257 +凝 2258 +暑 2259 +型 2260 +烘 2261 +簿 2262 +扬 2263 +汁 2264 +诸 2265 +迹 2266 +禁 2267 +株 2268 +泸 2269 +屠 2270 +宰 2271 +忽 2272 +炼 2273 +必 2274 +妆 2275 +飘 2276 +鹿 2277 +敲 2278 +拾 2279 +躺 2280 +歇 2281 +狠 2282 +沾 2283 +畅 2284 +镕 2285 +贪 2286 +污 2287 +斧 2288 +巡 2289 +弹 2290 +盐 2291 +枝 2292 +渝 2293 +壑 2294 +郴 2295 +落 2296 +牡 2297 +钛 2298 +剩 2299 +俄 2300 +抵 2301 +押 2302 +郊 2303 +弱 2304 +授 2305 +蟹 2306 +糕 2307 +败 2308 +各 2309 +伴 2310 +享 2311 +居 2312 +障 2313 +棕 2314 +旁 2315 +屌 2316 +绒 2317 +酸 2318 +隔 2319 +瞄 2320 +俩 2321 +柳 2322 +册 2323 +弊 2324 +逮 2325 +绵 2326 +挣 2327 +闵 2328 +勒 2329 +陶 2330 +寒 2331 +吻 2332 +桃 2333 +悍 2334 +绮 2335 +贞 2336 +疾 2337 +诫 2338 +菌 2339 +则 2340 +谭 2341 +咏 2342 +麟 2343 +棠 2344 +抬 2345 +棺 2346 +均 2347 +纸 2348 +碱 2349 +沧 2350 +董 2351 +挤 2352 +虚 2353 +钠 2354 +胃 2355 +躁 2356 +智 2357 +畔 2358 +墨 2359 +堂 2360 +喔 2361 +宣 2362 +丑 2363 +嚣 2364 +辈 2365 +孤 2366 +鞭 2367 +验 2368 +夕 2369 +印 2370 +欧 2371 +阵 2372 +咋 2373 +驹 2374 +挂 2375 +轿 2376 +拍 2377 +洁 2378 +凑 2379 +蕉 2380 +诱 2381 +惑 2382 +颐 2383 +箭 2384 +樱 2385 +辖 2386 +捕 2387 +炸 2388 +斋 2389 +恒 2390 +沉 2391 +侧 2392 +跌 2393 +暇 2394 +掌 2395 +筷 2396 +彬 2397 +稚 2398 +傲 2399 +腔 2400 +藏 2401 +浦 2402 +瓣 2403 +捆 2404 +卧 2405 +欠 2406 +犀 2407 +甩 2408 +敷 2409 +衍 2410 +谅 2411 +积 2412 +怡 2413 +阁 2414 +趣 2415 +掰 2416 +耽 2417 +蒜 2418 +菱 2419 +葛 2420 +聚 2421 +露 2422 +帐 2423 +紧 2424 +郓 2425 +聘 2426 +桑 2427 +众 2428 +圈 2429 +渡 2430 +鲜 2431 +杜 2432 +甫 2433 +遵 2434 +骚 2435 +吹 2436 +蚊 2437 +塔 2438 +赏 2439 +荒 2440 +欺 2441 +揍 2442 +锁 2443 +恼 2444 +忐 2445 +忑 2446 +输 2447 +描 2448 +触 2449 +糊 2450 +涂 2451 +熊 2452 +妮 2453 +抄 2454 +裙 2455 +塑 2456 +橡 2457 +阜 2458 +獒 2459 +励 2460 +黔 2461 +臣 2462 +憔 2463 +悴 2464 +昂 2465 +党 2466 +沐 2467 +浓 2468 +灾 2469 +捐 2470 +柿 2471 +瑟 2472 +翁 2473 +侨 2474 +督 2475 +振 2476 +鹏 2477 +乒 2478 +乓 2479 +巷 2480 +贡 2481 +祖 2482 +即 2483 +绿 2484 +搭 2485 +配 2486 +骑 2487 +届 2488 +举 2489 +伸 2490 +整 2491 +突 2492 +陌 2493 +糟 2494 +惩 2495 +硕 2496 +茫 2497 +趋 2498 +仁 2499 +钙 2500 +雕 2501 +井 2502 +撒 2503 +岩 2504 +悄 2505 +搁 2506 +浅 2507 +救 2508 +饮 2509 +佩 2510 +赌 2511 +涕 2512 +薯 2513 +令 2514 +泌 2515 +蔬 2516 +批 2517 +攀 2518 +怜 2519 +淮 2520 +寝 2521 +填 2522 +卿 2523 +萱 2524 +寄 2525 +窝 2526 +纳 2527 +洱 2528 +惹 2529 +锦 2530 +浒 2531 +欲 2532 +棉 2533 +箱 2534 +仅 2535 +述 2536 +摸 2537 +纲 2538 +澳 2539 +染 2540 +兼 2541 +岭 2542 +淋 2543 +肿 2544 +旗 2545 +嘞 2546 +乖 2547 +酮 2548 +颠 2549 +覆 2550 +誓 2551 +递 2552 +蛟 2553 +占 2554 +乎 2555 +融 2556 +甸 2557 +幂 2558 +钥 2559 +匙 2560 +酬 2561 +皆 2562 +胎 2563 +腐 2564 +痿 2565 +绣 2566 +枫 2567 +蝴 2568 +蝶 2569 +抛 2570 +撞 2571 +植 2572 +僵 2573 +尸 2574 +巾 2575 +煌 2576 +逊 2577 +引 2578 +兑 2579 +荫 2580 +朔 2581 +丢 2582 +扩 2583 +摄 2584 +龟 2585 +鑫 2586 +谦 2587 +豪 2588 +噬 2589 +眷 2590 +挑 2591 +仲 2592 +穷 2593 +玻 2594 +璃 2595 +岗 2596 +姥 2597 +横 2598 +蚌 2599 +埠 2600 +邀 2601 +蔚 2602 +虹 2603 +降 2604 +疣 2605 +鱿 2606 +喵 2607 +囧 2608 +茶 2609 +猜 2610 +玮 2611 +莎 2612 +冼 2613 +榕 2614 +媛 2615 +瓜 2616 +煮 2617 +耕 2618 +镶 2619 +虽 2620 +驳 2621 +霍 2622 +仗 2623 +窍 2624 +魅 2625 +访 2626 +邻 2627 +抗 2628 +莆 2629 +涵 2630 +筒 2631 +疯 2632 +赖 2633 +豌 2634 +碍 2635 +症 2636 +卤 2637 +翅 2638 +膀 2639 +蓬 2640 +咸 2641 +尚 2642 +瘦 2643 +缸 2644 +爬 2645 +鄂 2646 +塞 2647 +稻 2648 +召 2649 +荡 2650 +桨 2651 +税 2652 +呃 2653 +渠 2654 +骥 2655 +伏 2656 +枥 2657 +邑 2658 +净 2659 +弦 2660 +蔽 2661 +诀 2662 +咳 2663 +嗽 2664 +芯 2665 +储 2666 +缘 2667 +冻 2668 +厨 2669 +鉴 2670 +擦 2671 +棒 2672 +损 2673 +暂 2674 +殖 2675 +焊 2676 +募 2677 +邵 2678 +饶 2679 +梭 2680 +鄙 2681 +骄 2682 +蔡 2683 +辄 2684 +努 2685 +洽 2686 +宙 2687 +鲈 2688 +葫 2689 +芦 2690 +梧 2691 +燎 2692 +缴 2693 +薄 2694 +执 2695 +垫 2696 +靠 2697 +拢 2698 +萧 2699 +醋 2700 +脊 2701 +慰 2702 +攻 2703 +狱 2704 +吝 2705 +啬 2706 +煤 2707 +楞 2708 +脏 2709 +迷 2710 +椒 2711 +侄 2712 +璇 2713 +耐 2714 +庵 2715 +帽 2716 +崎 2717 +峻 2718 +援 2719 +娶 2720 +丫 2721 +犹 2722 +豫 2723 +罪 2724 +恶 2725 +陛 2726 +樟 2727 +截 2728 +巧 2729 +驰 2730 +轨 2731 +继 2732 +葱 2733 +蘸 2734 +汕 2735 +蜘 2736 +蛛 2737 +聋 2738 +俱 2739 +捉 2740 +卢 2741 +骆 2742 +氓 2743 +耶 2744 +仔 2745 +激 2746 +渊 2747 +钾 2748 +暖 2749 +钰 2750 +裁 2751 +判 2752 +略 2753 +墓 2754 +洪 2755 +凌 2756 +符 2757 +壮 2758 +陵 2759 +挥 2760 +夷 2761 +尘 2762 +沪 2763 +榆 2764 +涧 2765 +析 2766 +孝 2767 +弘 2768 +椅 2769 +贴 2770 +蛇 2771 +浣 2772 +镯 2773 +枣 2774 +佐 2775 +柑 2776 +谓 2777 +洞 2778 +漳 2779 +撕 2780 +叉 2781 +诛 2782 +糯 2783 +粽 2784 +碎 2785 +幅 2786 +赘 2787 +浆 2788 +循 2789 +偕 2790 +诙 2791 +阚 2792 +摘 2793 +串 2794 +悉 2795 +蜕 2796 +残 2797 +诅 2798 +祁 2799 +仪 2800 +璐 2801 +瑶 2802 +楠 2803 +崂 2804 +供 2805 +掖 2806 +椎 2807 +铆 2808 +钉 2809 +铐 2810 +镣 2811 +栋 2812 +潇 2813 +抓 2814 +屋 2815 +鸦 2816 +玄 2817 +芜 2818 +钨 2819 +毯 2820 +矿 2821 +缩 2822 +酶 2823 +焕 2824 +埃 2825 +霞 2826 +噢 2827 +韵 2828 +艾 2829 +虐 2830 +俘 2831 +颗 2832 +巩 2833 +牵 2834 +汝 2835 +搅 2836 +廉 2837 +啤 2838 +苑 2839 +辍 2840 +缝 2841 +纫 2842 +膜 2843 +娄 2844 +倩 2845 +魂 2846 +姜 2847 +彻 2848 +扉 2849 +镁 2850 +氢 2851 +铝 2852 +淀 2853 +雹 2854 +妍 2855 +鼎 2856 +碗 2857 +亭 2858 +闽 2859 +献 2860 +耻 2861 +畜 2862 +蚯 2863 +蚓 2864 +杆 2865 +靓 2866 +颖 2867 +瘾 2868 +腿 2869 +咧 2870 +嗦 2871 +忆 2872 +卑 2873 +鸽 2874 +藤 2875 +滑 2876 +蝇 2877 +蚂 2878 +蚁 2879 +迢 2880 +蝎 2881 +斑 2882 +赞 2883 +氧 2884 +姝 2885 +擎 2886 +憋 2887 +屈 2888 +讶 2889 +袜 2890 +吐 2891 +秽 2892 +哑 2893 +蓦 2894 +阑 2895 +珊 2896 +披 2897 +巫 2898 +妖 2899 +坪 2900 +疏 2901 +抒 2902 +炉 2903 +舰 2904 +贱 2905 +搬 2906 +遥 2907 +燃 2908 +咽 2909 +喉 2910 +熔 2911 +婵 2912 +奔 2913 +汗 2914 +蓄 2915 +辰 2916 +肩 2917 +洮 2918 +琅 2919 +径 2920 +廊 2921 +姬 2922 +衬 2923 +雯 2924 +滁 2925 +泗 2926 +筹 2927 +诵 2928 +奴 2929 +跨 2930 +娴 2931 +绯 2932 +惯 2933 +谎 2934 +蹈 2935 +潜 2936 +搂 2937 +逆 2938 +钞 2939 +辅 2940 +凶 2941 +橱 2942 +柜 2943 +婕 2944 +矮 2945 +邹 2946 +嫂 2947 +饼 2948 +撸 2949 +壶 2950 +握 2951 +鸳 2952 +鸯 2953 +寸 2954 +堕 2955 +哀 2956 +械 2957 +蜈 2958 +蚣 2959 +袁 2960 +鸿 2961 +穆 2962 +泊 2963 +衮 2964 +弗 2965 +雷 2966 +谜 2967 +俞 2968 +灏 2969 +毅 2970 +迈 2971 +蜂 2972 +辨 2973 +沂 2974 +灭 2975 +腊 2976 +脍 2977 +炙 2978 +卦 2979 +霄 2980 +扯 2981 +泾 2982 +脂 2983 +肪 2984 +淹 2985 +灌 2986 +辱 2987 +丸 2988 +账 2989 +秤 2990 +褐 2991 +芬 2992 +窖 2993 +慈 2994 +益 2995 +亿 2996 +颈 2997 +糜 2998 +隋 2999 +霉 3000 +署 3001 +狄 3002 +酪 3003 +旋 3004 +蔷 3005 +皱 3006 +纹 3007 +枯 3008 +粤 3009 +拔 3010 +菩 3011 +驱 3012 +咦 3013 +掀 3014 +菊 3015 +涩 3016 +耀 3017 +娥 3018 +奘 3019 +眯 3020 +芊 3021 +绪 3022 +沛 3023 +锐 3024 +姓 3025 +氏 3026 +垂 3027 +迫 3028 +絮 3029 +藕 3030 +捎 3031 +蓓 3032 +沫 3033 +奎 3034 +贩 3035 +泵 3036 +疑 3037 +岐 3038 +拓 3039 +詹 3040 +韦 3041 +粥 3042 +瞎 3043 +层 3044 +寿 3045 +淑 3046 +琦 3047 +履 3048 +痣 3049 +蔓 3050 +延 3051 +措 3052 +氰 3053 +胺 3054 +炭 3055 +鸥 3056 +谊 3057 +宛 3058 +悦 3059 +谣 3060 +茎 3061 +堆 3062 +鲤 3063 +坚 3064 +澎 3065 +溜 3066 +贫 3067 +擅 3068 +锌 3069 +竹 3070 +苟 3071 +磷 3072 +庐 3073 +嵌 3074 +潍 3075 +悚 3076 +岑 3077 +稀 3078 +奋 3079 +呦 3080 +梳 3081 +伐 3082 +芒 3083 +吶 3084 +凡 3085 +臂 3086 +驴 3087 +殿 3088 +雁 3089 +粹 3090 +凋 3091 +葵 3092 +烛 3093 +肾 3094 +尝 3095 +磨 3096 +晏 3097 +甄 3098 +嬛 3099 +盼 3100 +肇 3101 +咬 3102 +洼 3103 +匪 3104 +啰 3105 +硅 3106 +铅 3107 +矛 3108 +盾 3109 +贼 3110 +霜 3111 +螺 3112 +漏 3113 +帕 3114 +杉 3115 +矶 3116 +耗 3117 +责 3118 +靖 3119 +呸 3120 +驶 3121 +吞 3122 +睁 3123 +笼 3124 +茉 3125 +赈 3126 +纱 3127 +艘 3128 +炖 3129 +仿 3130 +瞬 3131 +嵊 3132 +澄 3133 +丞 3134 +摔 3135 +宠 3136 +爪 3137 +笋 3138 +庭 3139 +蜡 3140 +戈 3141 +锻 3142 +粗 3143 +糙 3144 +混 3145 +荚 3146 +曙 3147 +凄 3148 +抚 3149 +瀑 3150 +挖 3151 +掘 3152 +垮 3153 +奢 3154 +侈 3155 +揉 3156 +穹 3157 +钦 3158 +蛙 3159 +荧 3160 +悔 3161 +彦 3162 +忏 3163 +祸 3164 +攒 3165 +慌 3166 +簸 3167 +箕 3168 +繁 3169 +尖 3170 +芋 3171 +铠 3172 +沿 3173 +扮 3174 +隐 3175 +促 3176 +庾 3177 +葡 3178 +萄 3179 +硝 3180 +溶 3181 +淡 3182 +炅 3183 +昕 3184 +尧 3185 +妊 3186 +娠 3187 +曰 3188 +祛 3189 +枚 3190 +卒 3191 +陕 3192 +昭 3193 +龚 3194 +债 3195 +嗓 3196 +陷 3197 +阱 3198 +庞 3199 +盲 3200 +侵 3201 +匣 3202 +愤 3203 +怒 3204 +瞅 3205 +遭 3206 +脉 3207 +馒 3208 +愉 3209 +栗 3210 +鲍 3211 +挎 3212 +匆 3213 +缕 3214 +昵 3215 +鳄 3216 +阙 3217 +坟 3218 +捏 3219 +喽 3220 +雀 3221 +贯 3222 +苇 3223 +鹄 3224 +愈 3225 +裂 3226 +伪 3227 +劣 3228 +歹 3229 +溅 3230 +雌 3231 +猛 3232 +逞 3233 +饥 3234 +愚 3235 +牧 3236 +碰 3237 +帜 3238 +佝 3239 +偻 3240 +讪 3241 +馍 3242 +役 3243 +栈 3244 +唾 3245 +缆 3246 +袄 3247 +闸 3248 +织 3249 +筐 3250 +婉 3251 +昏 3252 +拖 3253 +毙 3254 +咙 3255 +褪 3256 +驼 3257 +壳 3258 +孽 3259 +审 3260 +脖 3261 +恳 3262 +孢 3263 +矫 3264 +臻 3265 +兖 3266 +俏 3267 +棍 3268 +唻 3269 +肘 3270 +俭 3271 +冕 3272 +葩 3273 +佑 3274 +鬓 3275 +柚 3276 +赴 3277 +崖 3278 +塌 3279 +厢 3280 +窈 3281 +窕 3282 +逑 3283 +卷 3284 +拂 3285 +蟑 3286 +螂 3287 +契 3288 +羞 3289 +函 3290 +逐 3291 +拌 3292 +肺 3293 +阻 3294 +纵 3295 +痰 3296 +狙 3297 +惋 3298 +枰 3299 +崽 3300 +胚 3301 +骡 3302 +萎 3303 +泄 3304 +呜 3305 +籁 3306 +濮 3307 +阆 3308 +琵 3309 +琶 3310 +跃 3311 +筝 3312 +勃 3313 +楂 3314 +奉 3315 +础 3316 +吆 3317 +壹 3318 +飙 3319 +虑 3320 +脆 3321 +黛 3322 +栓 3323 +逻 3324 +螃 3325 +轰 3326 +仑 3327 +券 3328 +逢 3329 +疮 3330 +私 3331 +窃 3332 +儋 3333 +泼 3334 +熬 3335 +焚 3336 +梨 3337 +吟 3338 +棱 3339 +稳 3340 +翘 3341 +祠 3342 +遮 3343 +瘤 3344 +稣 3345 +唇 3346 +阖 3347 +堡 3348 +禾 3349 +钗 3350 +爵 3351 +赐 3352 +绕 3353 +粘 3354 +癌 3355 +矜 3356 +虱 3357 +婧 3358 +坝 3359 +菏 3360 +隶 3361 +尺 3362 +滕 3363 +竿 3364 +恰 3365 +喱 3366 +冤 3367 +枉 3368 +叠 3369 +穴 3370 +搏 3371 +窦 3372 +栀 3373 +踪 3374 +昼 3375 +氯 3376 +陋 3377 +铭 3378 +禅 3379 +屑 3380 +巢 3381 +咻 3382 +喇 3383 +叭 3384 +棵 3385 +吊 3386 +诈 3387 +娇 3388 +绘 3389 +圩 3390 +仰 3391 +疙 3392 +瘩 3393 +桦 3394 +妾 3395 +丧 3396 +昊 3397 +湄 3398 +靴 3399 +迭 3400 +劝 3401 +溧 3402 +靡 3403 +梗 3404 +倪 3405 +刍 3406 +芽 3407 +篱 3408 +笆 3409 +漯 3410 +镖 3411 +协 3412 +叙 3413 +汾 3414 +豚 3415 +锷 3416 +瑙 3417 +瑜 3418 +伽 3419 +彰 3420 +扒 3421 +麝 3422 +赔 3423 +焉 3424 +亏 3425 +煅 3426 +翱 3427 +哽 3428 +煦 3429 +喷 3430 +舱 3431 +惨 3432 +哗 3433 +躲 3434 +佘 3435 +憾 3436 +旷 3437 +芹 3438 +簧 3439 +疹 3440 +簇 3441 +羹 3442 +刊 3443 +鹦 3444 +鹉 3445 +狡 3446 +猾 3447 +锯 3448 +呛 3449 +泛 3450 +汶 3451 +毗 3452 +衫 3453 +猕 3454 +祺 3455 +悸 3456 +昙 3457 +莽 3458 +杏 3459 +钮 3460 +叛 3461 +锄 3462 +砸 3463 +囤 3464 +犁 3465 +溃 3466 +疡 3467 +迦 3468 +轲 3469 +噜 3470 +犒 3471 +薰 3472 +薛 3473 +哺 3474 +竖 3475 +氟 3476 +渐 3477 +柒 3478 +贰 3479 +捌 3480 +傍 3481 +抹 3482 +褶 3483 +仇 3484 +偎 3485 +馅 3486 +旱 3487 +渭 3488 +昔 3489 +癣 3490 +挚 3491 +姻 3492 +炽 3493 +嘎 3494 +矢 3495 +汀 3496 +馋 3497 +淌 3498 +莓 3499 +貂 3500 +啧 3501 +茱 3502 +萸 3503 +涌 3504 +臀 3505 +恃 3506 +蒲 3507 +朴 3508 +嘟 3509 +扁 3510 +剂 3511 +歧 3512 +啪 3513 +啵 3514 +匠 3515 +帖 3516 +痒 3517 +睿 3518 +踢 3519 +衿 3520 +叽 3521 +崩 3522 +顽 3523 +嫌 3524 +扛 3525 +浔 3526 +拯 3527 +戊 3528 +戚 3529 +蛔 3530 +醇 3531 +笛 3532 +氛 3533 +沦 3534 +婊 3535 +仍 3536 +镍 3537 +渤 3538 +舶 3539 +哆 3540 +睹 3541 +萤 3542 +弧 3543 +辙 3544 +旯 3545 +纷 3546 +熄 3547 +挽 3548 +帘 3549 +蒸 3550 +橄 3551 +榄 3552 +滥 3553 +掩 3554 +兮 3555 +庸 3556 +玟 3557 +垦 3558 +惟 3559 +朕 3560 +脯 3561 +歪 3562 +吾 3563 +碘 3564 +锰 3565 +矾 3566 +拙 3567 +践 3568 +纠 3569 +赡 3570 +暨 3571 +凳 3572 +雾 3573 +缔 3574 +啫 3575 +毁 3576 +宥 3577 +邛 3578 +崃 3579 +禧 3580 +醛 3581 +滤 3582 +嘀 3583 +缪 3584 +萌 3585 +芥 3586 +胀 3587 +鲨 3588 +腩 3589 +勾 3590 +裳 3591 +雍 3592 +蹭 3593 +匹 3594 +髓 3595 +砍 3596 +孰 3597 +辩 3598 +唰 3599 +慷 3600 +慨 3601 +畏 3602 +坠 3603 +钝 3604 +箫 3605 +愧 3606 +劈 3607 +嘶 3608 +粮 3609 +轼 3610 +蟒 3611 +翊 3612 +澧 3613 +揽 3614 +烹 3615 +饪 3616 +踏 3617 +弛 3618 +婢 3619 +奸 3620 +掏 3621 +泓 3622 +袖 3623 +笈 3624 +刑 3625 +俑 3626 +浇 3627 +骊 3628 +蛀 3629 +蚤 3630 +杵 3631 +兹 3632 +晰 3633 +癫 3634 +痫 3635 +逝 3636 +炬 3637 +讼 3638 +陂 3639 +蚕 3640 +绸 3641 +槽 3642 +纨 3643 +牢 3644 +晃 3645 +窄 3646 +蒂 3647 +湃 3648 +硫 3649 +眨 3650 +耸 3651 +浠 3652 +梵 3653 +纺 3654 +贾 3655 +膨 3656 +阀 3657 +堀 3658 +扭 3659 +捂 3660 +扑 3661 +椭 3662 +鳟 3663 +丙 3664 +烯 3665 +冈 3666 +衷 3667 +牟 3668 +郫 3669 +畴 3670 +腥 3671 +亩 3672 +淤 3673 +禄 3674 +倘 3675 +烷 3676 +仆 3677 +刨 3678 +炜 3679 +挨 3680 +鳅 3681 +奚 3682 +峪 3683 +呻 3684 +佣 3685 +渔 3686 +肢 3687 +霏 3688 +旨 3689 +爰 3690 +吨 3691 +珑 3692 +隽 3693 +橙 3694 +箍 3695 +岚 3696 +啸 3697 +倌 3698 +剃 3699 +御 3700 +沸 3701 +棘 3702 +瘫 3703 +痪 3704 +仕 3705 +闺 3706 +炳 3707 +乏 3708 +拱 3709 +墅 3710 +铢 3711 +痤 3712 +琥 3713 +珈 3714 +荟 3715 +翩 3716 +搓 3717 +阮 3718 +芸 3719 +抠 3720 +弓 3721 +锣 3722 +赫 3723 +挡 3724 +侃 3725 +诶 3726 +沽 3727 +绫 3728 +濑 3729 +龈 3730 +乞 3731 +丐 3732 +宴 3733 +馁 3734 +牲 3735 +闰 3736 +亢 3737 +辫 3738 +铲 3739 +嫦 3740 +卵 3741 +佚 3742 +谬 3743 +倡 3744 +抑 3745 +赋 3746 +跆 3747 +削 3748 +氮 3749 +嫩 3750 +噻 3751 +蜗 3752 +鹂 3753 +靶 3754 +妥 3755 +衢 3756 +腻 3757 +砖 3758 +翎 3759 +拈 3760 +卉 3761 +皂 3762 +曦 3763 +荔 3764 +晤 3765 +曜 3766 +趵 3767 +纣 3768 +捞 3769 +蕲 3770 +猿 3771 +榈 3772 +憎 3773 +媚 3774 +绞 3775 +峙 3776 +饲 3777 +瑾 3778 +寡 3779 +釜 3780 +凸 3781 +凹 3782 +嫉 3783 +妒 3784 +婪 3785 +驸 3786 +荤 3787 +弥 3788 +蹦 3789 +驮 3790 +汞 3791 +唠 3792 +叨 3793 +袈 3794 +裟 3795 +毽 3796 +蔗 3797 +蹄 3798 +犍 3799 +珞 3800 +谚 3801 +煎 3802 +腋 3803 +瞳 3804 +丛 3805 +挪 3806 +榴 3807 +钩 3808 +梓 3809 +骁 3810 +烙 3811 +舜 3812 +暮 3813 +擀 3814 +兜 3815 +癜 3816 +姗 3817 +藜 3818 +擒 3819 +歼 3820 +冉 3821 +倚 3822 +漱 3823 +嫣 3824 +椰 3825 +隘 3826 +掐 3827 +栾 3828 +巍 3829 +咔 3830 +稽 3831 +惆 3832 +怅 3833 +镑 3834 +娲 3835 +芷 3836 +藻 3837 +伺 3838 +忌 3839 +桔 3840 +绅 3841 +坂 3842 +澜 3843 +嚓 3844 +苔 3845 +诣 3846 +倔 3847 +酿 3848 +槟 3849 +榔 3850 +粪 3851 +渺 3852 +馗 3853 +峨 3854 +碚 3855 +阎 3856 +巅 3857 +颊 3858 +戬 3859 +吒 3860 +鸵 3861 +岂 3862 +廖 3863 +娅 3864 +旬 3865 +猥 3866 +琐 3867 +扈 3868 +滔 3869 +枷 3870 +崴 3871 +捣 3872 +泻 3873 +甙 3874 +俯 3875 +撑 3876 +芮 3877 +舆 3878 +邂 3879 +逅 3880 +宪 3881 +晖 3882 +岔 3883 +哒 3884 +酵 3885 +痔 3886 +苓 3887 +捶 3888 +睫 3889 +裕 3890 +彤 3891 +潢 3892 +酉 3893 +聂 3894 +氨 3895 +嗷 3896 +皎 3897 +焖 3898 +袭 3899 +惦 3900 +惘 3901 +隙 3902 +彝 3903 +鞘 3904 +厄 3905 +殷 3906 +罕 3907 +嚏 3908 +拇 3909 +尹 3910 +蔻 3911 +颂 3912 +皖 3913 +霖 3914 +屉 3915 +崛 3916 +砣 3917 +穗 3918 +枸 3919 +杞 3920 +竣 3921 +勋 3922 +坍 3923 +溢 3924 +廓 3925 +煽 3926 +囚 3927 +涪 3928 +墩 3929 +琢 3930 +胳 3931 +膊 3932 +彼 3933 +陀 3934 +汹 3935 +柱 3936 +颁 3937 +闫 3938 +熠 3939 +叹 3940 +婿 3941 +娩 3942 +藓 3943 +岷 3944 +婺 3945 +桓 3946 +赁 3947 +罢 3948 +姊 3949 +瓢 3950 +桩 3951 +淫 3952 +堪 3953 +艰 3954 +枢 3955 +枞 3956 +晗 3957 +泷 3958 +逍 3959 +筱 3960 +烽 3961 +渍 3962 +蒿 3963 +殴 3964 +玖 3965 +罐 3966 +剿 3967 +喀 3968 +磕 3969 +铵 3970 +蕊 3971 +篓 3972 +痞 3973 +磅 3974 +礴 3975 +磐 3976 +拘 3977 +瘙 3978 +惕 3979 +孜 3980 +杖 3981 +撇 3982 +敖 3983 +踩 3984 +刹 3985 +蹿 3986 +坎 3987 +氦 3988 +汨 3989 +垣 3990 +垢 3991 +胁 3992 +趴 3993 +苷 3994 +镒 3995 +幢 3996 +鞠 3997 +逾 3998 +鬃 3999 +尉 4000 +韧 4001 +锤 4002 +嘘 4003 +呷 4004 +噎 4005 +煲 4006 +恍 4007 +粱 4008 +亳 4009 +鳞 4010 +懦 4011 +酚 4012 +酞 4013 +哨 4014 +祀 4015 +刃 4016 +蕴 4017 +晟 4018 +菀 4019 +甬 4020 +鼾 4021 +鳖 4022 +螳 4023 +稼 4024 +栽 4025 +蝗 4026 +颌 4027 +咀 4028 +掠 4029 +嘱 4030 +甚 4031 +菅 4032 +奂 4033 +讽 4034 +秸 4035 +釉 4036 +坞 4037 +雇 4038 +绢 4039 +捧 4040 +狈 4041 +桀 4042 +骜 4043 +摊 4044 +臆 4045 +竺 4046 +栅 4047 +贬 4048 +飒 4049 +浸 4050 +噩 4051 +晾 4052 +绐 4053 +殡 4054 +挠 4055 +於 4056 +茁 4057 +瞪 4058 +窠 4059 +汰 4060 +魁 4061 +忒 4062 +璋 4063 +怠 4064 +莺 4065 +冶 4066 +绰 4067 +邈 4068 +圻 4069 +湮 4070 +亨 4071 +躬 4072 +砂 4073 +鹭 4074 +浊 4075 +楹 4076 +珉 4077 +撵 4078 +筏 4079 +荨 4080 +鳝 4081 +沥 4082 +邳 4083 +殉 4084 +憨 4085 +啼 4086 +熏 4087 +蜃 4088 +毋 4089 +彗 4090 +噪 4091 +绛 4092 +祟 4093 +蝙 4094 +蝠 4095 +漆 4096 +酰 4097 +锑 4098 +栖 4099 +肆 4100 +邕 4101 +弋 4102 +绽 4103 +嚼 4104 +霹 4105 +雳 4106 +谍 4107 +恹 4108 +怏 4109 +倦 4110 +轶 4111 +曛 4112 +疚 4113 +棚 4114 +漕 4115 +浃 4116 +勘 4117 +暄 4118 +趁 4119 +斥 4120 +苞 4121 +膳 4122 +赎 4123 +崭 4124 +笙 4125 +摁 4126 +嗅 4127 +瞒 4128 +舵 4129 +铸 4130 +咫 4131 +涅 4132 +瘪 4133 +潼 4134 +粑 4135 +漾 4136 +噶 4137 +鸠 4138 +铉 4139 +豹 4140 +遛 4141 +襟 4142 +壤 4143 +甭 4144 +吮 4145 +耒 4146 +钊 4147 +泞 4148 +拦 4149 +昱 4150 +腑 4151 +惧 4152 +韬 4153 +焗 4154 +窘 4155 +喳 4156 +溏 4157 +鲛 4158 +慵 4159 +菁 4160 +攥 4161 +埔 4162 +呕 4163 +蓑 4164 +笠 4165 +孑 4166 +咕 4167 +觐 4168 +漓 4169 +碾 4170 +浜 4171 +嬉 4172 +迂 4173 +笃 4174 +勉 4175 +锥 4176 +篷 4177 +亥 4178 +龌 4179 +龊 4180 +煞 4181 +蓟 4182 +皓 4183 +惰 4184 +勺 4185 +缨 4186 +峥 4187 +苯 4188 +豁 4189 +颓 4190 +拽 4191 +啄 4192 +麒 4193 +雎 4194 +鲢 4195 +睬 4196 +渣 4197 +唔 4198 +桧 4199 +癞 4200 +蛤 4201 +蟆 4202 +撩 4203 +酯 4204 +戳 4205 +舔 4206 +孺 4207 +怂 4208 +恿 4209 +臃 4210 +戟 4211 +惭 4212 +耿 4213 +徵 4214 +柬 4215 +朽 4216 +磺 4217 +媲 4218 +懿 4219 +悼 4220 +绎 4221 +缅 4222 +茜 4223 +瞻 4224 +炀 4225 +脓 4226 +罄 4227 +秃 4228 +拎 4229 +譬 4230 +榉 4231 +拭 4232 +玥 4233 +崆 4234 +峒 4235 +胛 4236 +糗 4237 +佗 4238 +佬 4239 +袍 4240 +炊 4241 +仞 4242 +霎 4243 +掺 4244 +匀 4245 +姹 4246 +妯 4247 +娌 4248 +帷 4249 +岢 4250 +柄 4251 +阪 4252 +玺 4253 +窑 4254 +肽 4255 +涡 4256 +窟 4257 +阉 4258 +硼 4259 +蛳 4260 +呤 4261 +砚 4262 +偌 4263 +贿 4264 +芗 4265 +蹊 4266 +跷 4267 +雏 4268 +膝 4269 +嗜 4270 +扦 4271 +涟 4272 +殆 4273 +郡 4274 +洵 4275 +酋 4276 +匡 4277 +胤 4278 +撤 4279 +辗 4280 +冀 4281 +捺 4282 +吏 4283 +衩 4284 +腕 4285 +灸 4286 +绔 4287 +瓯 4288 +蜻 4289 +蜓 4290 +窜 4291 +躯 4292 +髦 4293 +诏 4294 +缄 4295 +筠 4296 +沌 4297 +酐 4298 +皋 4299 +隧 4300 +鹊 4301 +傀 4302 +儡 4303 +诲 4304 +嘏 4305 +寅 4306 +骇 4307 +喧 4308 +癀 4309 +瑚 4310 +碉 4311 +羔 4312 +掂 4313 +痹 4314 +孚 4315 +绡 4316 +馊 4317 +虏 4318 +悖 4319 +漪 4320 +琉 4321 +缉 4322 +冥 4323 +饯 4324 +蔺 4325 +瘆 4326 +榨 4327 +盯 4328 +鄞 4329 +妨 4330 +哐 4331 +寇 4332 +鹃 4333 +卞 4334 +喘 4335 +藩 4336 +踹 4337 +粟 4338 +陨 4339 +遣 4340 +鳌 4341 +烨 4342 +抉 4343 +臧 4344 +墉 4345 +疽 4346 +拷 4347 +赃 4348 +哮 4349 +馥 4350 +砰 4351 +拗 4352 +汐 4353 +矣 4354 +沅 4355 +裴 4356 +阐 4357 +蟋 4358 +蟀 4359 +蚀 4360 +恁 4361 +恙 4362 +蝉 4363 +荀 4364 +彧 4365 +銮 4366 +侮 4367 +驿 4368 +婶 4369 +檀 4370 +哩 4371 +镐 4372 +轴 4373 +扳 4374 +飓 4375 +麓 4376 +牺 4377 +垛 4378 +稞 4379 +桴 4380 +痧 4381 +揣 4382 +殇 4383 +邬 4384 +撅 4385 +邸 4386 +鼬 4387 +剥 4388 +胥 4389 +撼 4390 +溟 4391 +鄱 4392 +鲫 4393 +觅 4394 +犊 4395 +恕 4396 +铂 4397 +褔 4398 +淼 4399 +骝 4400 +藉 4401 +裔 4402 +痨 4403 +颤 4404 +尴 4405 +尬 4406 +癖 4407 +拄 4408 +蠕 4409 +虻 4410 +迄 4411 +攸 4412 +浚 4413 +盔 4414 +肮 4415 +侬 4416 +锏 4417 +憧 4418 +憬 4419 +镰 4420 +懈 4421 +挟 4422 +缤 4423 +涎 4424 +睾 4425 +惶 4426 +褚 4427 +藐 4428 +眺 4429 +艇 4430 +昀 4431 +妄 4432 +祗 4433 +壬 4434 +浯 4435 +衲 4436 +來 4437 +黯 4438 +芩 4439 +敞 4440 +绊 4441 +娣 4442 +掷 4443 +茯 4444 +琍 4445 +蛹 4446 +钧 4447 +瘘 4448 +蜥 4449 +蜴 4450 +唬 4451 +驭 4452 +阂 4453 +诃 4454 +疟 4455 +潦 4456 +谀 4457 +肱 4458 +黏 4459 +甥 4460 +眶 4461 +秩 4462 +庇 4463 +钏 4464 +咝 4465 +肴 4466 +宸 4467 +湟 4468 +沣 4469 +煊 4470 +盂 4471 +弈 4472 +瞩 4473 +聆 4474 +疥 4475 +腼 4476 +腆 4477 +胭 4478 +匕 4479 +讳 4480 +戮 4481 +茧 4482 +趾 4483 +亵 4484 +吖 4485 +漩 4486 +逵 4487 +寰 4488 +滇 4489 +渎 4490 +寮 4491 +嘁 4492 +珂 4493 +珀 4494 +稠 4495 +羌 4496 +徘 4497 +徊 4498 +苛 4499 +蕨 4500 +薏 4501 +苡 4502 +戌 4503 +卯 4504 +馈 4505 +溥 4506 +熹 4507 +屡 4508 +巳 4509 +璜 4510 +铮 4511 +踊 4512 +锚 4513 +濠 4514 +噫 4515 +怦 4516 +蓥 4517 +碌 4518 +霓 4519 +牦 4520 +妤 4521 +屹 4522 +缈 4523 +蹉 4524 +驷 4525 +菡 4526 +谔 4527 +琛 4528 +吡 4529 +喹 4530 +呲 4531 +溺 4532 +鳗 4533 +慑 4534 +秆 4535 +骋 4536 +脐 4537 +涤 4538 +荞 4539 +淅 4540 +罘 4541 +焱 4542 +孵 4543 +斟 4544 +酌 4545 +痊 4546 +秉 4547 +砌 4548 +瘁 4549 +胱 4550 +笫 4551 +燮 4552 +衅 4553 +腱 4554 +垒 4555 +锟 4556 +缀 4557 +疵 4558 +墟 4559 +盏 4560 +舂 4561 +侗 4562 +琨 4563 +唧 4564 +怆 4565 +沮 4566 +敛 4567 +瑕 4568 +奠 4569 +汴 4570 +衙 4571 +歆 4572 +嘹 4573 +饽 4574 +拧 4575 +濒 4576 +锭 4577 +嬴 4578 +吱 4579 +靳 4580 +眸 4581 +渲 4582 +睦 4583 +蝼 4584 +瞿 4585 +剁 4586 +紊 4587 +翟 4588 +攘 4589 +蹂 4590 +躏 4591 +淞 4592 +跎 4593 +侍 4594 +铛 4595 +绷 4596 +仟 4597 +瀚 4598 +赉 4599 +俪 4600 +魄 4601 +吼 4602 +酗 4603 +嚒 4604 +彷 4605 +徨 4606 +煜 4607 +曝 4608 +嗑 4609 +俅 4610 +嵘 4611 +隍 4612 +唆 4613 +郜 4614 +栩 4615 +尻 4616 +咗 4617 +茗 4618 +疱 4619 +斐 4620 +菘 4621 +芎 4622 +帼 4623 +枭 4624 +矩 4625 +仨 4626 +幄 4627 +鲸 4628 +猬 4629 +梢 4630 +槐 4631 +璧 4632 +坷 4633 +逯 4634 +踝 4635 +濡 4636 +樵 4637 +肓 4638 +劵 4639 +羚 4640 +髫 4641 +笄 4642 +俾 4643 +匿 4644 +帛 4645 +孀 4646 +焙 4647 +瘟 4648 +籽 4649 +萦 4650 +灼 4651 +箴 4652 +筵 4653 +窒 4654 +裆 4655 +旎 4656 +砝 4657 +妲 4658 +恺 4659 +覃 4660 +寐 4661 +酝 4662 +啃 4663 +塬 4664 +醴 4665 +蜿 4666 +蜒 4667 +愣 4668 +恤 4669 +撂 4670 +瘸 4671 +檐 4672 +琰 4673 +狒 4674 +摧 4675 +诠 4676 +孪 4677 +嘚 4678 +鼹 4679 +囡 4680 +茴 4681 +噤 4682 +僻 4683 +钕 4684 +锴 4685 +渗 4686 +嗫 4687 +撮 4688 +缭 4689 +粼 4690 +咄 4691 +挝 4692 +蛾 4693 +恪 4694 +皙 4695 +莒 4696 +叼 4697 +诽 4698 +妩 4699 +叱 4700 +咤 4701 +挞 4702 +萼 4703 +饵 4704 +澹 4705 +惺 4706 +呶 4707 +铤 4708 +佟 4709 +丕 4710 +靛 4711 +伶 4712 +涣 4713 +桢 4714 +狭 4715 +卅 4716 +蟠 4717 +蟾 4718 +朦 4719 +胧 4720 +咆 4721 +滦 4722 +岖 4723 +篙 4724 +痍 4725 +胰 4726 +谏 4727 +坳 4728 +樯 4729 +橹 4730 +孬 4731 +潴 4732 +厥 4733 +椐 4734 +谩 4735 +恬 4736 +琬 4737 +遁 4738 +褥 4739 +咎 4740 +羁 4741 +苣 4742 +殁 4743 +懵 4744 +褒 4745 +蜚 4746 +蛊 4747 +筛 4748 +耙 4749 +耨 4750 +嬷 4751 +驯 4752 +赅 4753 +畲 4754 +滢 4755 +伎 4756 +庹 4757 +踉 4758 +戎 4759 +膛 4760 +嗡 4761 +吔 4762 +唏 4763 +喏 4764 +哧 4765 +缇 4766 +蚝 4767 +璀 4768 +璨 4769 +捅 4770 +妁 4771 +曳 4772 +吩 4773 +咐 4774 +罂 4775 +垌 4776 +揪 4777 +壕 4778 +跺 4779 +辘 4780 +轳 4781 +噔 4782 +斓 4783 +厮 4784 +叁 4785 +仄 4786 +沼 4787 +鸢 4788 +醪 4789 +郢 4790 +圃 4791 +碜 4792 +鲅 4793 +嚯 4794 +淳 4795 +迩 4796 +诋 4797 +鬟 4798 +汲 4799 +艮 4800 +跤 4801 +麋 4802 +橇 4803 +悱 4804 +恻 4805 +啷 4806 +惮 4807 +樨 4808 +毓 4809 +裱 4810 +堇 4811 +埸 4812 +叵 4813 +腚 4814 +畀 4815 +钼 4816 +赦 4817 +悯 4818 +谴 4819 +稷 4820 +嘢 4821 +盎 4822 +跶 4823 +窥 4824 +瑄 4825 +谤 4826 +柘 4827 +垄 4828 +蠡 4829 +邝 4830 +娆 4831 +俐 4832 +铷 4833 +肋 4834 +涿 4835 +俎 4836 +捜 4837 +罡 4838 +嗝 4839 +唛 4840 +酣 4841 +鹬 4842 +瑀 4843 +帚 4844 +镭 4845 +搽 4846 +钣 4847 +蜇 4848 +嗞 4849 +颉 4850 +耘 4851 +忡 4852 +噼 4853 +睐 4854 +簋 4855 +镚 4856 +朐 4857 +戛 4858 +扪 4859 +鹩 4860 +稹 4861 +嗣 4862 +睇 4863 +弩 4864 +侥 4865 +绚 4866 +虔 4867 +溴 4868 +毂 4869 +漉 4870 +郧 4871 +杈 4872 +埭 4873 +哝 4874 +纾 4875 +箔 4876 +蚍 4877 +呋 4878 +喃 4879 +旌 4880 +袅 4881 +嫡 4882 +2 4883 +睢 4884 +榭 4885 +濉 4886 +雉 4887 +糍 4888 +谙 4889 +坻 4890 +遨 4891 +囔 4892 +鹜 4893 +垩 4894 +嵋 4895 +葑 4896 +叻 4897 +剌 4898 +铀 4899 +鲟 4900 +珏 4901 +唑 4902 +拴 4903 +乍 4904 +镊 4905 +歩 4906 +姘 4907 +戍 4908 +娈 4909 +槿 4910 +魇 4911 +叩 4912 +啾 4913 +腈 4914 +骞 4915 +殃 4916 +髋 4917 +嶙 4918 +璟 4919 +嚷 4920 +鹳 4921 +嗬 4922 +梆 4923 +晁 4924 +龛 4925 +嚎 4926 +熨 4927 +倭 4928 +峦 4929 +蜍 4930 +桉 4931 +齁 4932 +搀 4933 +铬 4934 +刽 4935 +謝 4936 +沒 4937 +簪 4938 +邺 4939 +嵬 4940 +馄 4941 +饨 4942 +蜢 4943 +嗒 4944 +芨 4945 +弶 4946 +晞 4947 +搔 4948 +昴 4949 +夙 4950 +徙 4951 +霾 4952 +嗖 4953 +碴 4954 +秧 4955 +芍 4956 +匝 4957 +泫 4958 +琯 4959 +扼 4960 +砒 4961 +栎 4962 +卟 4963 +琊 4964 +怯 4965 +侩 4966 +峯 4967 +忿 4968 +藁 4969 +蹼 4970 +毡 4971 +埤 4972 +膘 4973 +噗 4974 +阕 4975 +嘭 4976 +椿 4977 +涸 4978 +祯 4979 +芵 4980 +螨 4981 +寥 4982 +梶 4983 +嘈 4984 +泠 4985 +侏 4986 +棂 4987 +缶 4988 +捋 4989 +钜 4990 +璞 4991 +媞 4992 +唢 4993 +邰 4994 +蚱 4995 +薜 4996 +牒 4997 +缥 4998 +咿 4999 +遐 5000 +蕙 5001 +惬 5002 +惚 5003 +硚 5004 +麽 5005 +踌 5006 +褂 5007 +蜉 5008 +蝣 5009 +腌 5010 +熘 5011 +缮 5012 +锢 5013 +犽 5014 +蹬 5015 +皈 5016 +剔 5017 +芪 5018 +妪 5019 +钇 5020 +仃 5021 +荏 5022 +苒 5023 +塾 5024 +阡 5025 +瑨 5026 +冢 5027 +匈 5028 +庶 5029 +荃 5030 +茬 5031 +妗 5032 +暹 5033 +犷 5034 +嵴 5035 +鳃 5036 +羲 5037 +岱 5038 +烩 5039 +勐 5040 +霁 5041 +厝 5042 +飚 5043 +瀛 5044 +炕 5045 +桅 5046 +垓 5047 +晌 5048 +黒 5049 +蚩 5050 +夔 5051 +垚 5052 +烊 5053 +眀 5054 +荼 5055 +蘼 5056 +尅 5057 +舫 5058 +拣 5059 +蹋 5060 +劭 5061 +耆 5062 +陡 5063 +樽 5064 +谒 5065 +觞 5066 +箩 5067 +槛 5068 +傈 5069 +僳 5070 +爻 5071 +皑 5072 +滘 5073 +嬅 5074 +丶 5075 +邋 5076 +遢 5077 +讴 5078 +隅 5079 +邃 5080 +谑 5081 +哔 5082 +矬 5083 +姣 5084 +凛 5085 +冽 5086 +殒 5087 +眈 5088 +鹧 5089 +鸪 5090 +飕 5091 +亘 5092 +篝 5093 +嘅 5094 +乜 5095 +黜 5096 +颇 5097 +鄄 5098 +蔫 5099 +贻 5100 +猝 5101 +绌 5102 +芈 5103 +隼 5104 +戆 5105 +鹫 5106 +霑 5107 +宕 5108 +凇 5109 +铨 5110 +町 5111 +礁 5112 +蕃 5113 +淖 5114 +搐 5115 +饴 5116 +榛 5117 +晔 5118 +祢 5119 +酥 5120 +丨 5121 +赂 5122 +噘 5123 +黍 5124 +幌 5125 +骅 5126 +黝 5127 +帧 5128 +胯 5129 +埙 5130 +敕 5131 +涓 5132 +掣 5133 +圪 5134 +榻 5135 +濛 5136 +擞 5137 +篡 5138 +榷 5139 +亟 5140 +渌 5141 +锹 5142 +啐 5143 +捍 5144 +嘣 5145 +跻 5146 +桠 5147 +贮 5148 +蛰 5149 +猖 5150 +骸 5151 +溉 5152 +铎 5153 +吁 5154 +溯 5155 +踞 5156 +俨 5157 +茌 5158 +蒯 5159 +篆 5160 +膺 5161 +垭 5162 +匮 5163 +撰 5164 +擂 5165 +倜 5166 +傥 5167 +蔑 5168 +弼 5169 +珮 5170 +颢 5171 +钿 5172 +迸 5173 +凿 5174 +湫 5175 +焯 5176 +硒 5177 +畈 5178 +觑 5179 +揶 5180 +禀 5181 +宦 5182 +杷 5183 +讷 5184 +踮 5185 +掳 5186 +窿 5187 +捻 5188 +褴 5189 +褛 5190 +瑛 5191 +胫 5192 +喋 5193 +沓 5194 +汛 5195 +掴 5196 +魉 5197 +馀 5198 +隗 5199 +咘 5200 +呱 5201 +獭 5202 +畊 5203 +莜 5204 +祐 5205 +轧 5206 +魍 5207 +昶 5208 +诓 5209 +囗 5210 +莠 5211 +岌 5212 +潸 5213 +涞 5214 +綦 5215 +畸 5216 +阄 5217 +遏 5218 +啶 5219 +冇 5220 +懋 5221 +煨 5222 +羱 5223 +诟 5224 +枳 5225 +鲶 5226 +燊 5227 +猷 5228 +铄 5229 +缰 5230 +搪 5231 +赊 5232 +诩 5233 +佼 5234 +钵 5235 +谌 5236 +嬗 5237 +砥 5238 +砺 5239 +觊 5240 +觎 5241 +颅 5242 +怵 5243 +疸 5244 +锆 5245 +缢 5246 +棣 5247 +蛎 5248 +鄯 5249 +茸 5250 +谶 5251 +蹶 5252 +侑 5253 +滂 5254 +襁 5255 +褓 5256 +杳 5257 +臊 5258 +摒 5259 +袂 5260 +掸 5261 +鹞 5262 +忱 5263 +湉 5264 +汩 5265 +剽 5266 +槌 5267 +塍 5268 +喟 5269 +讹 5270 +抡 5271 +烃 5272 +咁 5273 +珺 5274 +槎 5275 +砼 5276 +泯 5277 +泮 5278 +遴 5279 +匾 5280 +沏 5281 +悌 5282 +麾 5283 +垡 5284 +鏖 5285 +垅 5286 +斛 5287 +镂 5288 +骷 5289 +髅 5290 +豺 5291 +诿 5292 +狰 5293 +狞 5294 +泱 5295 +榫 5296 +嗤 5297 +瞥 5298 +揄 5299 +哌 5300 +婀 5301 +恸 5302 +蛐 5303 +镀 5304 +霈 5305 +钒 5306 +踱 5307 +淆 5308 +薹 5309 +纭 5310 +瘠 5311 +戾 5312 +夭 5313 +铰 5314 +渚 5315 +犇 5316 +舀 5317 +傣 5318 +獗 5319 +瞭 5320 +兢 5321 +犟 5322 +袒 5323 +铖 5324 +颚 5325 +徜 5326 +徉 5327 +囍 5328 +酆 5329 +铡 5330 +睽 5331 +裨 5332 +饕 5333 +躇 5334 +噱 5335 +赓 5336 +懊 5337 +蟊 5338 +趸 5339 +鄢 5340 +埝 5341 +椟 5342 +粳 5343 +跛 5344 +莴 5345 +娉 5346 +嗄 5347 +邙 5348 +渑 5349 +佶 5350 +颍 5351 +溆 5352 +诧 5353 +抨 5354 +憷 5355 +涠 5356 +痼 5357 +砀 5358 +剐 5359 +缙 5360 +鞑 5361 +坭 5362 +烬 5363 +唁 5364 +臼 5365 +瓮 5366 +袱 5367 +珩 5368 +蝌 5369 +蚪 5370 +诬 5371 +迥 5372 +楸 5373 +皿 5374 +蜷 5375 +遑 5376 +啖 5377 +篪 5378 +崮 5379 +讧 5380 +盹 5381 +瞑 5382 +鲳 5383 +谟 5384 +拮 5385 +琏 5386 +瞰 5387 +憩 5388 +馏 5389 +炷 5390 +眩 5391 +羿 5392 +洙 5393 +珲 5394 +愫 5395 +佯 5396 +舸 5397 +祎 5398 +旮 5399 +翌 5400 +畿 5401 +桎 5402 +梏 5403 +钳 5404 +鳍 5405 +犸 5406 +祉 5407 +缜 5408 +硌 5409 +殓 5410 +砾 5411 +酩 5412 +酊 5413 +兀 5414 +矸 5415 +髙 5416 +疝 5417 +膑 5418 +哂 5419 +僚 5420 +耷 5421 +窨 5422 +孳 5423 +鲠 5424 +淝 5425 +搡 5426 +伢 5427 +鲷 5428 +谕 5429 +頫 5430 +泺 5431 +谧 5432 +煳 5433 +萁 5434 +馕 5435 +鹌 5436 +鹑 5437 +钴 5438 +埇 5439 +摈 5440 +踵 5441 +冗 5442 +铣 5443 +萃 5444 +忤 5445 +揩 5446 +铧 5447 +矗 5448 +闾 5449 +柞 5450 +貉 5451 +撺 5452 +掇 5453 +灞 5454 +醍 5455 +痱 5456 +粲 5457 +糠 5458 +讣 5459 +蹴 5460 +茆 5461 +螈 5462 +旻 5463 +蔼 5464 +咣 5465 +麸 5466 +涝 5467 +渥 5468 +垤 5469 +咭 5470 +玳 5471 +瑁 5472 +郏 5473 +纂 5474 +扞 5475 +峭 5476 +铩 5477 +锨 5478 +坩 5479 +埚 5480 +瑭 5481 +札 5482 +舛 5483 +臬 5484 +郯 5485 +晦 5486 +耄 5487 +耋 5488 +俚 5489 +鲭 5490 +柩 5491 +黟 5492 +骼 5493 +蛆 5494 +跋 5495 +俸 5496 +幡 5497 +愕 5498 +噙 5499 +峋 5500 +厩 5501 +夯 5502 +擢 5503 +枋 5504 +葳 5505 +偃 5506 +赝 5507 +昝 5508 +镉 5509 +嫔 5510 +潋 5511 +娓 5512 +郅 5513 +瘀 5514 +奄 5515 +荇 5516 +咂 5517 +痉 5518 +挛 5519 +祚 5520 +庖 5521 +纰 5522 +簌 5523 +淬 5524 +掮 5525 +俟 5526 +臾 5527 +雒 5528 +吋 5529 +颧 5530 +嗔 5531 +诘 5532 +焘 5533 +獾 5534 +氤 5535 +氲 5536 +鲲 5537 +麂 5538 +罹 5539 +澍 5540 +镳 5541 +囱 5542 +玷 5543 +嗳 5544 +擘 5545 +濂 5546 +逡 5547 +骛 5548 +镔 5549 +湍 5550 +讥 5551 +蹁 5552 +跹 5553 +淦 5554 +骰 5555 +疃 5556 +腓 5557 +嵇 5558 +怄 5559 +谯 5560 +啕 5561 +坯 5562 +钎 5563 +锒 5564 +伉 5565 +佻 5566 +腴 5567 +怼 5568 +浐 5569 +摹 5570 +僮 5571 +芾 5572 +矍 5573 +泔 5574 +蚬 5575 +屐 5576 +翕 5577 +唿 5578 +苋 5579 +氪 5580 +楔 5581 +莪 5582 +掬 5583 +舷 5584 +骐 5585 +嗲 5586 +荻 5587 +缱 5588 +绻 5589 +嫚 5590 +铟 5591 +饷 5592 +醐 5593 +伫 5594 +澶 5595 +郇 5596 +蹚 5597 +藿 5598 +鳕 5599 +蝈 5600 +钯 5601 +铍 5602 +骠 5603 +盅 5604 +蜊 5605 +腭 5606 +谘 5607 +孛 5608 +豇 5609 +囫 5610 +囵 5611 +抿 5612 +楣 5613 +廾 5614 +貔 5615 +貅 5616 +蛉 5617 +猹 5618 +蚴 5619 +轱 5620 +葚 5621 +胗 5622 +鸮 5623 +篦 5624 +谆 5625 +篑 5626 +莅 5627 +砷 5628 +蝾 5629 +疴 5630 +葺 5631 +瘴 5632 +滹 5633 +砭 5634 +噌 5635 +鸾 5636 +珙 5637 +碣 5638 +餮 5639 +荸 5640 +荠 5641 +犄 5642 +歙 5643 +樾 5644 +淙 5645 +痢 5646 +濯 5647 +轫 5648 +琮 5649 +啜 5650 +闳 5651 +椁 5652 +蓼 5653 +垴 5654 +唷 5655 +炔 5656 +峁 5657 +囹 5658 +尕 5659 +嗪 5660 +缎 5661 +拚 5662 +稔 5663 +牍 5664 +赳 5665 +忪 5666 +菖 5667 +佃 5668 +埂 5669 +宓 5670 +瞠 5671 +洹 5672 +锲 5673 +睑 5674 +攫 5675 +竽 5676 +蹩 5677 +慜 5678 +锉 5679 +羧 5680 +崧 5681 +醺 5682 +舐 5683 +讫 5684 +熵 5685 +▁GONNA 5686 +瘢 5687 +秭 5688 +跄 5689 +绀 5690 +懑 5691 +弭 5692 +萋 5693 +篁 5694 +缛 5695 +茭 5696 +吠 5697 +鲑 5698 +幔 5699 +潺 5700 +鹈 5701 +鹕 5702 +椴 5703 +哕 5704 +剜 5705 +湎 5706 +玑 5707 +槃 5708 +暌 5709 +蹒 5710 +跚 5711 +恣 5712 +磬 5713 +悭 5714 +劾 5715 +唳 5716 +绉 5717 +枇 5718 +蜱 5719 +瞟 5720 +膈 5721 +磴 5722 +嶂 5723 +苫 5724 +邡 5725 +骈 5726 +惴 5727 +硖 5728 +鳜 5729 +羸 5730 +秣 5731 +殚 5732 +桷 5733 +罔 5734 +颦 5735 +桁 5736 +鸩 5737 +孱 5738 +伥 5739 +愎 5740 +圄 5741 +贲 5742 +旖 5743 +荥 5744 +徇 5745 +镌 5746 +偈 5747 +敝 5748 +刎 5749 +跬 5750 +欸 5751 +髌 5752 +椤 5753 +觥 5754 +踟 5755 +斡 5756 +陉 5757 +谡 5758 +龅 5759 +鸨 5760 +豢 5761 +豉 5762 +悻 5763 +曈 5764 +茼 5765 +谗 5766 +忖 5767 +牯 5768 +痂 5769 +虢 5770 +馓 5771 +跖 5772 +聿 5773 +箅 5774 +塅 5775 +丼 5776 +獐 5777 +肏 5778 +逄 5779 +钡 5780 +叒 5781 +霭 5782 +鲮 5783 +凫 5784 +鹥 5785 +鳙 5786 +玦 5787 +蒡 5788 +嘬 5789 +鹗 5790 +鬄 5791 +鎏 5792 +嘤 5793 +绦 5794 +涔 5795 +齑 5796 +蒌 5797 +墘 5798 +俠 5799 +蛭 5800 +薅 5801 +叕 5802 +砧 5803 +嘧 5804 +媺 5805 +蚵 5806 +楽 5807 +浄 5808 +厍 5809 +鳊 5810 +泂 5811 +龋 5812 +瓒 5813 +瑧 5814 +邨 5815 +峣 5816 +蚺 5817 +鲉 5818 +滟 5819 +堑 5820 +豳 5821 +骧 5822 +艹 5823 +柾 5824 +鬣 5825 +眦 5826 +畦 5827 +虬 5828 +睨 5829 +飨 5830 +蘖 5831 +羟 5832 +瓤 5833 +岫 5834 +惇 5835 +鲵 5836 +痦 5837 +笤 5838 +憙 5839 +痩 5840 +煋 5841 +媤 5842 +佤 5843 +羮 5844 +鏊 5845 +昇 5846 +蛱 5847 +珅 5848 +庋 5849 +搵 5850 +旸 5851 +岿 5852 +亓 5853 +揸 5854 +谂 5855 +淠 5856 +糅 5857 +儆 5858 +苕 5859 +刿 5860 +呒 5861 +岙 5862 +荜 5863 +玧 5864 +鄠 5865 +讬 5866 +祕 5867 +箦 5868 +醚 5869 +膻 5870 +笕 5871 +蛏 5872 +哞 5873 +饸 5874 +饹 5875 +愻 5876 +汫 5877 +鹇 5878 +栉 5879 +沇 5880 +擤 5881 +徳 5882 +黢 5883 +狍 5884 +錫 5885 +暝 5886 +機 5887 +鉅 5888 +菓 5889 +廋 5890 +橛 5891 +羣 5892 +笊 5893 +魃 5894 +掼 5895 +魑 5896 +靥 5897 +酔 5898 +铱 5899 +峄 5900 +哋 5901 +畹 5902 +鍪 5903 +髀 5904 +嚄 5905 +秾 5906 +苾 5907 +孓 5908 +汆 5909 +嗟 5910 +锺 5911 +睥 5912 +炝 5913 +怔 5914 +咛 5915 +巉 5916 +墒 5917 +岘 5918 +禛 5919 +陟 5920 +皲 5921 +萘 5922 +妣 5923 +芃 5924 +煸 5925 +郦 5926 +蒗 5927 +仝 5928 +抻 5929 +苜 5930 +蓿 5931 +鎵 5932 +減 5933 +燧 5934 +娭 5935 +毑 5936 +诂 5937 +烔 5938 +猗 5939 +哏 5940 +氙 5941 +匯 5942 +颛 5943 +鞣 5944 +笺 5945 +枖 5946 +忾 5947 +黉 5948 +埯 5949 +敩 5950 +玏 5951 +钺 5952 +纥 5953 +佈 5954 +沖 5955 +蚜 5956 +莨 5957 +菟 5958 +麇 5959 +沤 5960 +耦 5961 +赭 5962 +祊 5963 +璄 5964 +旼 5965 +浞 5966 +痄 5967 +蔸 5968 +璎 5969 +屛 5970 +錤 5971 +弢 5972 +绨 5973 +員 5974 +誕 5975 +祜 5976 +勍 5977 +浉 5978 +娑 5979 +呓 5980 +啉 5981 +嗐 5982 +弁 5983 +绺 5984 +撷 5985 +崑 5986 +诌 5987 +標 5988 +甯 5989 +俣 5990 +趔 5991 +趄 5992 +垠 5993 +赟 5994 +馐 5995 +畑 5996 +給 5997 +幣 5998 +產 5999 +恵 6000 +併 6001 +蒹 6002 +葭 6003 +後 6004 +瀍 6005 +愠 6006 +莛 6007 +蝰 6008 +鹮 6009 +逶 6010 +侪 6011 +蒽 6012 +巽 6013 +瓴 6014 +鲱 6015 +薙 6016 +過 6017 +億 6018 +車 6019 +鲇 6020 +淨 6021 +嗎 6022 +诨 6023 +靚 6024 +內 6025 +糁 6026 +錾 6027 +刈 6028 +滯 6029 +炆 6030 +徂 6031 +傩 6032 +鲺 6033 +叟 6034 +埗 6035 +篠 6036 +焐 6037 +暻 6038 +盃 6039 +髻 6040 +樘 6041 +墈 6042 +菉 6043 +巯 6044 +嘌 6045 +遒 6046 +鼋 6047 +匍 6048 +匐 6049 +臜 6050 +馔 6051 +鲎 6052 +獠 6053 +蟇 6054 +栄 6055 +騎 6056 +賽 6057 +場 6058 +幾 6059 +鐘 6060 +镛 6061 +鸶 6062 +镆 6063 +窸 6064 +庠 6065 +蒺 6066 +溱 6067 +倮 6068 +楪 6069 +帀 6070 +躶 6071 +洰 6072 +圉 6073 +圊 6074 +捨 6075 +谝 6076 +呔 6077 +勖 6078 +揖 6079 +喈 6080 +霰 6081 +觋 6082 +嫪 6083 +毐 6084 +繇 6085 +珐 6086 +馃 6087 +孃 6088 +逖 6089 +骶 6090 +喬 6091 +奧 6092 +風 6093 +裵 6094 +胍 6095 +確 6096 +揠 6097 +榀 6098 +聒 6099 +谪 6100 +歘 6101 +粿 6102 +舾 6103 +聩 6104 +嫘 6105 +砟 6106 +侉 6107 +捯 6108 +饬 6109 +囏 6110 +喙 6111 +笥 6112 +燿 6113 +鮀 6114 +芡 6115 +蛄 6116 +铳 6117 +挲 6118 +笞 6119 +廿 6120 +蠹 6121 +湋 6122 +暎 6123 +霙 6124 +颔 6125 +苁 6126 +啮 6127 +囖 6128 +寤 6129 +炟 6130 +乩 6131 +熥 6132 +桡 6133 +阈 6134 +孖 6135 +鐢 6136 +衾 6137 +怍 6138 +沆 6139 +囿 6140 +胬 6141 +陲 6142 +缦 6143 +誇 6144 +醮 6145 +箬 6146 +盥 6147 +鹘 6148 +诳 6149 +氡 6150 +狎 6151 +枧 6152 +谄 6153 +芣 6154 +苢 6155 +俤 6156 +誊 6157 +殄 6158 +辋 6159 +係 6160 +迤 6161 +謦 6162 +簰 6163 +滓 6164 +嬢 6165 +倏 6166 +睺 6167 +滏 6168 +脘 6169 +嗙 6170 +谥 6171 +歃 6172 +锃 6173 +欻 6174 +挼 6175 +襙 6176 +檄 6177 +龇 6178 +楫 6179 +咵 6180 +徭 6181 +闱 6182 +嚅 6183 +鳑 6184 +鲏 6185 +佞 6186 +箜 6187 +篌 6188 +蹑 6189 +喑 6190 +胄 6191 +鞥 6192 +蟥 6193 +骢 6194 +蹙 6195 +柰 6196 +蕤 6197 +癸 6198 +哙 6199 +睚 6200 +绾 6201 +篾 6202 +鳏 6203 +谲 6204 +袤 6205 +翳 6206 +蹰 6207 +槊 6208 +黠 6209 +姒 6210 +锱 6211 +猢 6212 +狲 6213 +粝 6214 +戕 6215 +茕 6216 +瀣 6217 +踽 6218 +绶 6219 +媾 6220 +舢 6221 +螯 6222 +茏 6223 +廪 6224 +诰 6225 +辇 6226 +琚 6227 +汜 6228 +洇 6229 +還 6230 +遽 6231 +槁 6232 +靼 6233 +髡 6234 +鸬 6235 +鹚 6236 +捭 6237 +黩 6238 +俶 6239 +個 6240 +圜 6241 +颞 6242 +苻 6243 +恽 6244 +腧 6245 +甾 6246 +辎 6247 +顼 6248 +阗 6249 +鬻 6250 +鬶 6251 +沔 6252 +狃 6253 +#0 6254 +#1 6255 +#2 6256 diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..feb8ae2 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,16 @@ +[project] +name = "realtimevtt" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +requires-python = ">=3.12.10" +dependencies = [ + "numpy>=2.2.6", + "pyaudio>=0.2.14", + "sherpa-onnx>=1.12.0", +] + +[[tool.uv.index]] +name = "private-pypi" +url = "https://mirrors.aliyun.com/pypi/simple/" +default = true diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 0000000..2c1af4b --- /dev/null +++ b/src/__init__.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +实时语音转文字系统 +基于sherpa-onnx的实时语音识别应用 +""" + +__version__ = "1.0.0" +__author__ = "RealTimeVTT Team" +__description__ = "基于sherpa-onnx的实时语音转文字系统" + +from .config import ModelConfig, AudioConfig, AppConfig +from .audio_processor import AudioProcessor +from .speech_recognizer import SpeechRecognizer, RecognitionResult, RecognitionSession +from .realtime_vtt import RealTimeVTT +from .model_downloader import ModelDownloader + +__all__ = [ + "ModelConfig", + "AudioConfig", + "AppConfig", + "AudioProcessor", + "SpeechRecognizer", + "RecognitionResult", + "RecognitionSession", + "RealTimeVTT", + "ModelDownloader" +] \ No newline at end of file diff --git a/src/audio_processor.py b/src/audio_processor.py new file mode 100644 index 0000000..0b5d8ec --- /dev/null +++ b/src/audio_processor.py @@ -0,0 +1,175 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +音频处理模块 +负责从麦克风采集音频数据并进行预处理 +""" + +import pyaudio +import numpy as np +import threading +import queue +import logging +from typing import Optional, Callable +from .config import AudioConfig + +class AudioProcessor: + """音频处理器类""" + + def __init__(self, config: AudioConfig): + self.config = config + self.audio = None + self.stream = None + self.is_recording = False + self.audio_queue = queue.Queue() + self.record_thread = None + + # 设置日志 + self.logger = logging.getLogger(__name__) + + def initialize(self) -> bool: + """初始化音频设备""" + try: + self.audio = pyaudio.PyAudio() + self.config.format = pyaudio.paInt16 + + # 检查音频设备 + device_count = self.audio.get_device_count() + self.logger.info(f"检测到 {device_count} 个音频设备") + + # 查找默认输入设备 + default_input_device = self.audio.get_default_input_device_info() + self.logger.info(f"默认输入设备: {default_input_device['name']}") + + return True + + except Exception as e: + self.logger.error(f"音频设备初始化失败: {e}") + return False + + def start_recording(self, callback: Optional[Callable] = None) -> bool: + """开始录音""" + if self.is_recording: + self.logger.warning("录音已在进行中") + return False + + try: + # 创建音频流(只使用回调模式) + self.stream = self.audio.open( + format=self.config.format, + channels=self.config.channels, + rate=self.config.sample_rate, + input=True, + frames_per_buffer=self.config.chunk_size, + stream_callback=self._audio_callback if callback is None else callback + ) + + self.is_recording = True + self.stream.start_stream() + + self.logger.info("开始录音") + return True + + except Exception as e: + self.logger.error(f"启动录音失败: {e}") + return False + + def stop_recording(self): + """停止录音""" + if not self.is_recording: + return + + self.is_recording = False + + if self.stream: + self.stream.stop_stream() + self.stream.close() + self.stream = None + + if self.record_thread and self.record_thread.is_alive(): + self.record_thread.join(timeout=1.0) + + self.logger.info("停止录音") + + def get_audio_data(self, timeout: float = 0.1) -> Optional[np.ndarray]: + """获取音频数据""" + try: + audio_data = self.audio_queue.get(timeout=timeout) + return audio_data + except queue.Empty: + return None + + def _audio_callback(self, in_data, frame_count, time_info, status): + """音频回调函数""" + if status: + self.logger.warning(f"音频流状态: {status}") + + # 将音频数据转换为numpy数组 + audio_data = np.frombuffer(in_data, dtype=np.int16) + + # 将数据放入队列 + try: + self.audio_queue.put_nowait(audio_data) + except queue.Full: + # 队列满时丢弃最旧的数据 + try: + self.audio_queue.get_nowait() + self.audio_queue.put_nowait(audio_data) + except queue.Empty: + pass + + return (None, pyaudio.paContinue) + + def _record_loop(self): + """录音循环(已弃用,现在使用回调模式)""" + # 此方法已不再使用,保留用于兼容性 + pass + + def cleanup(self): + """清理资源""" + self.stop_recording() + + if self.audio: + self.audio.terminate() + self.audio = None + + self.logger.info("音频处理器已清理") + + def list_audio_devices(self): + """列出所有音频设备""" + if not self.audio: + self.logger.error("音频设备未初始化") + return [] + + devices = [] + device_count = self.audio.get_device_count() + + for i in range(device_count): + device_info = self.audio.get_device_info_by_index(i) + if device_info['maxInputChannels'] > 0: # 只显示输入设备 + devices.append({ + 'index': i, + 'name': device_info['name'], + 'channels': device_info['maxInputChannels'], + 'sample_rate': device_info['defaultSampleRate'] + }) + + return devices + + def apply_noise_reduction(self, audio_data: np.ndarray) -> np.ndarray: + """简单的噪声抑制""" + # 这里可以实现更复杂的噪声抑制算法 + # 目前只做简单的音量门限处理 + threshold = np.max(np.abs(audio_data)) * 0.1 + audio_data[np.abs(audio_data) < threshold] = 0 + return audio_data + + def apply_gain_control(self, audio_data: np.ndarray, target_level: float = 0.5) -> np.ndarray: + """自动增益控制""" + current_level = np.sqrt(np.mean(audio_data.astype(np.float32) ** 2)) + if current_level > 0: + gain = target_level / current_level + # 限制增益范围 + gain = np.clip(gain, 0.1, 10.0) + audio_data = (audio_data.astype(np.float32) * gain).astype(np.int16) + return audio_data \ No newline at end of file diff --git a/src/config.py b/src/config.py new file mode 100644 index 0000000..7a2fff2 --- /dev/null +++ b/src/config.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +配置文件 +管理sherpa-onnx模型路径和语音识别参数 +""" + +import os +from pathlib import Path + +# 项目根目录 +PROJECT_ROOT = Path(__file__).parent.parent + +# 模型配置 +class ModelConfig: + """模型配置类""" + + def __init__(self): + # 模型文件路径(需要用户下载) + self.model_dir = PROJECT_ROOT / "models" + + # 默认使用中英双语模型 + self.tokens = str(self.model_dir / "tokens.txt") + self.encoder = str(self.model_dir / "encoder-epoch-99-avg-1.onnx") + self.decoder = str(self.model_dir / "decoder-epoch-99-avg-1.onnx") + self.joiner = str(self.model_dir / "joiner-epoch-99-avg-1.onnx") + + # 语音识别参数 + self.sample_rate = 16000 + self.feature_dim = 80 + self.num_threads = 1 + + # 端点检测参数 + self.enable_endpoint = True + self.enable_endpoint_detection = True + self.rule1_min_trailing_silence = 2.4 + self.rule2_min_trailing_silence = 1.2 + self.rule3_min_utterance_length = 300 + + # 解码方法 + self.decoding_method = "greedy_search" + self.max_active_paths = 4 + self.provider = "cpu" + + def validate_model_files(self): + """验证模型文件是否存在""" + required_files = [self.tokens, self.encoder, self.decoder, self.joiner] + missing_files = [] + + for file_path in required_files: + if not os.path.exists(file_path): + missing_files.append(file_path) + + return missing_files + +# 音频配置 +class AudioConfig: + """音频配置类""" + + def __init__(self): + # PyAudio配置 + self.sample_rate = 16000 # 采样率 + self.chunk_size = 1024 # 每次读取的音频帧数 + self.channels = 1 # 单声道 + self.format = None # 将在运行时设置为pyaudio.paInt16 + + # 音频处理参数 + self.samples_per_read = int(0.1 * self.sample_rate) # 100ms + +# 应用配置 +class AppConfig: + """应用配置类""" + + def __init__(self): + # 显示配置 + self.show_partial_results = True # 显示部分识别结果 + self.show_timestamps = True # 显示时间戳 + + # 日志配置 + self.log_level = "INFO" + self.log_file = PROJECT_ROOT / "logs" / "app.log" + + # 输出配置 + self.output_file = PROJECT_ROOT / "output" / "transcription.txt" + self.save_to_file = True \ No newline at end of file diff --git a/src/model_downloader.py b/src/model_downloader.py new file mode 100644 index 0000000..f99a8db --- /dev/null +++ b/src/model_downloader.py @@ -0,0 +1,311 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +模型下载工具 +帮助用户下载sherpa-onnx模型文件 +""" + +import os +import urllib.request +import tarfile +import zipfile +import logging +from pathlib import Path +from typing import Dict, List +from .config import ModelConfig + +class ModelDownloader: + """模型下载器类""" + + # 预定义的模型配置 + MODELS = { + "zh-en-bilingual": { + "name": "中英双语模型 (推荐)", + "url": "https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20.tar.bz2", + "size": "约 65MB", + "description": "支持中文和英文的实时语音识别模型", + "files": { + "tokens": "tokens.txt", + "encoder": "encoder-epoch-99-avg-1.onnx", + "decoder": "decoder-epoch-99-avg-1.onnx", + "joiner": "joiner-epoch-99-avg-1.onnx" + } + }, + "zh-only": { + "name": "中文模型", + "url": "https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-streaming-zipformer-zh-14M-2023-02-23.tar.bz2", + "size": "约 45MB", + "description": "专门针对中文优化的语音识别模型", + "files": { + "tokens": "tokens.txt", + "encoder": "encoder-epoch-99-avg-1.onnx", + "decoder": "decoder-epoch-99-avg-1.onnx", + "joiner": "joiner-epoch-99-avg-1.onnx" + } + }, + "en-only": { + "name": "英文模型", + "url": "https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-streaming-zipformer-en-2023-06-26.tar.bz2", + "size": "约 65MB", + "description": "专门针对英文优化的语音识别模型", + "files": { + "tokens": "tokens.txt", + "encoder": "encoder-epoch-99-avg-1-chunk-16-left-128.onnx", + "decoder": "decoder-epoch-99-avg-1-chunk-16-left-128.onnx", + "joiner": "joiner-epoch-99-avg-1-chunk-16-left-128.onnx" + } + } + } + + def __init__(self, config: ModelConfig): + self.config = config + self.logger = logging.getLogger(__name__) + + # 创建模型目录 + self.config.model_dir.mkdir(exist_ok=True) + + def list_available_models(self) -> Dict: + """列出可用的模型""" + return self.MODELS + + def check_model_exists(self, model_key: str = "zh-en-bilingual") -> bool: + """检查模型是否已存在""" + if model_key not in self.MODELS: + return False + + model_info = self.MODELS[model_key] + for file_key, filename in model_info["files"].items(): + file_path = self.config.model_dir / filename + if not file_path.exists(): + return False + + return True + + def download_model(self, model_key: str = "zh-en-bilingual", force: bool = False) -> bool: + """下载指定模型""" + if model_key not in self.MODELS: + self.logger.error(f"未知的模型: {model_key}") + return False + + model_info = self.MODELS[model_key] + + # 检查模型是否已存在 + if not force and self.check_model_exists(model_key): + self.logger.info(f"模型 {model_info['name']} 已存在") + return True + + self.logger.info(f"开始下载模型: {model_info['name']}") + self.logger.info(f"大小: {model_info['size']}") + self.logger.info(f"描述: {model_info['description']}") + + try: + # 下载文件 + url = model_info["url"] + filename = url.split("/")[-1] + download_path = self.config.model_dir / filename + + self.logger.info(f"正在下载: {url}") + self._download_file_with_progress(url, download_path) + + # 解压文件 + self.logger.info("正在解压文件...") + extract_dir = self._extract_archive(download_path) + + # 移动文件到正确位置 + self._organize_model_files(extract_dir, model_info["files"]) + + # 清理下载的压缩文件 + download_path.unlink() + + # 清理解压目录 + if extract_dir.exists(): + import shutil + shutil.rmtree(extract_dir) + + self.logger.info(f"模型 {model_info['name']} 下载完成") + return True + + except Exception as e: + self.logger.error(f"下载模型失败: {e}") + return False + + def _download_file_with_progress(self, url: str, filepath: Path): + """带进度显示的文件下载""" + def progress_hook(block_num, block_size, total_size): + downloaded = block_num * block_size + if total_size > 0: + percent = min(100, (downloaded * 100) // total_size) + print(f"\r下载进度: {percent}% ({downloaded // 1024 // 1024}MB / {total_size // 1024 // 1024}MB)", end="") + else: + print(f"\r已下载: {downloaded // 1024 // 1024}MB", end="") + + urllib.request.urlretrieve(url, filepath, progress_hook) + print() # 换行 + + def _extract_archive(self, archive_path: Path) -> Path: + """解压压缩文件""" + extract_dir = archive_path.parent / archive_path.stem + + if archive_path.suffix == '.zip': + with zipfile.ZipFile(archive_path, 'r') as zip_ref: + zip_ref.extractall(extract_dir) + elif archive_path.suffix in ['.tar', '.bz2'] or '.tar.' in archive_path.name: + with tarfile.open(archive_path, 'r:*') as tar_ref: + tar_ref.extractall(extract_dir) + else: + raise ValueError(f"不支持的压缩格式: {archive_path.suffix}") + + return extract_dir + + def _organize_model_files(self, extract_dir: Path, file_mapping: Dict[str, str]): + """整理模型文件到正确位置""" + # 查找解压后的实际目录 + actual_dirs = [d for d in extract_dir.iterdir() if d.is_dir()] + if actual_dirs: + source_dir = actual_dirs[0] # 通常模型文件在第一个子目录中 + else: + source_dir = extract_dir + + # 移动文件 + for file_key, target_filename in file_mapping.items(): + # 查找源文件 + source_files = list(source_dir.glob(f"*{target_filename}")) + if not source_files: + # 尝试查找类似的文件 + if file_key == "encoder": + source_files = list(source_dir.glob("*encoder*.onnx")) + elif file_key == "decoder": + source_files = list(source_dir.glob("*decoder*.onnx")) + elif file_key == "joiner": + source_files = list(source_dir.glob("*joiner*.onnx")) + elif file_key == "tokens": + source_files = list(source_dir.glob("tokens.txt")) + + if source_files: + source_file = source_files[0] + target_file = self.config.model_dir / target_filename + + # 如果目标文件已存在,先删除 + if target_file.exists(): + target_file.unlink() + + # 移动文件 + source_file.rename(target_file) + self.logger.info(f"已安装: {target_filename}") + else: + self.logger.warning(f"未找到文件: {target_filename}") + + def remove_model(self, model_key: str = "zh-en-bilingual") -> bool: + """删除指定模型""" + if model_key not in self.MODELS: + self.logger.error(f"未知的模型: {model_key}") + return False + + model_info = self.MODELS[model_key] + + try: + for file_key, filename in model_info["files"].items(): + file_path = self.config.model_dir / filename + if file_path.exists(): + file_path.unlink() + self.logger.info(f"已删除: {filename}") + + self.logger.info(f"模型 {model_info['name']} 已删除") + return True + + except Exception as e: + self.logger.error(f"删除模型失败: {e}") + return False + + def get_model_status(self) -> Dict[str, bool]: + """获取所有模型的状态""" + status = {} + for model_key in self.MODELS: + status[model_key] = self.check_model_exists(model_key) + return status + + def interactive_download(self): + """交互式下载模型""" + print("=" * 60) + print("模型下载工具") + print("=" * 60) + + # 显示可用模型 + print("\n可用模型:") + for i, (key, info) in enumerate(self.MODELS.items(), 1): + status = "已安装" if self.check_model_exists(key) else "未安装" + print(f" {i}. {info['name']} ({info['size']}) - {status}") + print(f" {info['description']}") + + # 用户选择 + try: + choice = input("\n请选择要下载的模型 (1-3, 默认1): ").strip() + if not choice: + choice = "1" + + choice_idx = int(choice) - 1 + model_keys = list(self.MODELS.keys()) + + if 0 <= choice_idx < len(model_keys): + model_key = model_keys[choice_idx] + + # 检查是否已存在 + if self.check_model_exists(model_key): + overwrite = input("模型已存在,是否重新下载?(y/N): ").strip().lower() + if overwrite != 'y': + print("取消下载") + return + + # 开始下载 + print(f"\n开始下载模型...") + if self.download_model(model_key, force=True): + print("\n下载完成!") + else: + print("\n下载失败!") + else: + print("无效的选择") + + except (ValueError, KeyboardInterrupt): + print("\n取消下载") + except Exception as e: + print(f"\n下载过程中出错: {e}") + +def main(): + """命令行入口""" + import argparse + + parser = argparse.ArgumentParser(description="sherpa-onnx 模型下载工具") + parser.add_argument("--model", choices=list(ModelDownloader.MODELS.keys()), + default="zh-en-bilingual", help="要下载的模型") + parser.add_argument("--force", action="store_true", help="强制重新下载") + parser.add_argument("--list", action="store_true", help="列出可用模型") + parser.add_argument("--status", action="store_true", help="显示模型状态") + parser.add_argument("--interactive", action="store_true", help="交互式下载") + + args = parser.parse_args() + + # 设置日志 + logging.basicConfig(level=logging.INFO, format='%(levelname)s: %(message)s') + + config = ModelConfig() + downloader = ModelDownloader(config) + + if args.list: + print("可用模型:") + for key, info in downloader.list_available_models().items(): + print(f" {key}: {info['name']} ({info['size']})") + print(f" {info['description']}") + elif args.status: + print("模型状态:") + status = downloader.get_model_status() + for key, installed in status.items(): + info = downloader.MODELS[key] + status_text = "已安装" if installed else "未安装" + print(f" {key}: {info['name']} - {status_text}") + elif args.interactive: + downloader.interactive_download() + else: + downloader.download_model(args.model, args.force) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/src/realtime_vtt.py b/src/realtime_vtt.py new file mode 100644 index 0000000..2bd5690 --- /dev/null +++ b/src/realtime_vtt.py @@ -0,0 +1,319 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +实时语音转文字主应用 +整合音频处理和语音识别功能 +""" + +import time +import threading +import logging +import signal +import sys +from pathlib import Path +from typing import Optional, Callable + +from .config import ModelConfig, AudioConfig, AppConfig +from .audio_processor import AudioProcessor +from .speech_recognizer import SpeechRecognizer, RecognitionSession + +class RealTimeVTT: + """实时语音转文字应用类""" + + def __init__(self): + # 配置 + self.model_config = ModelConfig() + self.audio_config = AudioConfig() + self.app_config = AppConfig() + + # 组件 + self.audio_processor = AudioProcessor(self.audio_config) + self.speech_recognizer = SpeechRecognizer(self.model_config) + + # 会话 + self.session = RecognitionSession() + + # 状态 + self.is_running = False + self.processing_thread = None + + # 回调函数 + self.result_callback = None + self.partial_result_callback = None + + # 设置日志 + self._setup_logging() + self.logger = logging.getLogger(__name__) + + # 设置信号处理 + signal.signal(signal.SIGINT, self._signal_handler) + signal.signal(signal.SIGTERM, self._signal_handler) + + def _setup_logging(self): + """设置日志""" + # 创建日志目录 + log_dir = self.app_config.log_file.parent + log_dir.mkdir(exist_ok=True) + + # 配置日志格式 + logging.basicConfig( + level=getattr(logging, self.app_config.log_level), + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', + handlers=[ + logging.FileHandler(self.app_config.log_file, encoding='utf-8'), + logging.StreamHandler(sys.stdout) + ] + ) + + def _signal_handler(self, signum, frame): + """信号处理函数""" + self.logger.info(f"接收到信号 {signum},正在停止应用...") + self.stop() + sys.exit(0) + + def initialize(self) -> bool: + """初始化应用""" + self.logger.info("初始化实时语音转文字应用") + + # 初始化音频处理器 + if not self.audio_processor.initialize(): + self.logger.error("音频处理器初始化失败") + return False + + # 初始化语音识别器 + if not self.speech_recognizer.initialize(): + self.logger.error("语音识别器初始化失败") + return False + + # 设置回调函数 + self.speech_recognizer.set_result_callback(self._on_recognition_result) + self.speech_recognizer.set_partial_result_callback(self._on_partial_result) + + # 创建输出目录 + if self.app_config.save_to_file: + output_dir = self.app_config.output_file.parent + output_dir.mkdir(exist_ok=True) + + self.logger.info("应用初始化完成") + return True + + def start(self) -> bool: + """开始实时语音识别""" + if self.is_running: + self.logger.warning("应用已在运行中") + return False + + self.logger.info("开始实时语音识别") + + # 创建识别流 + if not self.speech_recognizer.create_stream(): + self.logger.error("创建识别流失败") + return False + + # 开始录音 + if not self.audio_processor.start_recording(): + self.logger.error("开始录音失败") + return False + + # 开始会话 + self.session.start() + + # 启动处理线程 + self.is_running = True + self.processing_thread = threading.Thread(target=self._processing_loop) + self.processing_thread.daemon = True + self.processing_thread.start() + + self.logger.info("实时语音识别已启动") + return True + + def stop(self): + """停止实时语音识别""" + if not self.is_running: + return + + self.logger.info("停止实时语音识别") + + # 停止处理循环 + self.is_running = False + + # 等待处理线程结束 + if self.processing_thread and self.processing_thread.is_alive(): + self.processing_thread.join(timeout=2.0) + + # 获取最终结果(在停止录音之前) + try: + final_result = self.speech_recognizer.finalize_stream() + if final_result: + self._on_recognition_result(final_result) + except Exception as e: + self.logger.warning(f"获取最终识别结果失败: {e}") + + # 停止录音 + self.audio_processor.stop_recording() + + # 结束会话 + self.session.stop() + + # 保存结果到文件 + if self.app_config.save_to_file: + self._save_results_to_file() + + self.logger.info("实时语音识别已停止") + + def _processing_loop(self): + """音频处理循环""" + self.logger.info("开始音频处理循环") + + while self.is_running: + try: + # 获取音频数据 + audio_data = self.audio_processor.get_audio_data(timeout=0.1) + if audio_data is None: + continue + + # 音频预处理 + # audio_data = self.audio_processor.apply_noise_reduction(audio_data) + # audio_data = self.audio_processor.apply_gain_control(audio_data) + + # 语音识别 + result = self.speech_recognizer.process_audio(audio_data) + + # 处理识别结果在回调函数中完成 + + except Exception as e: + self.logger.error(f"音频处理循环错误: {e}") + break + + self.logger.info("音频处理循环结束") + + def _on_recognition_result(self, text: str): + """识别结果回调""" + if not text.strip(): + return + + # 添加到会话 + result = self.session.add_result(text, is_final=True) + + # 显示结果 + if self.app_config.show_timestamps: + print(f"\n[{time.strftime('%H:%M:%S')}] {text}") + else: + print(f"\n{text}") + + # 调用外部回调 + if self.result_callback: + self.result_callback(result) + + self.logger.info(f"识别结果: {text}") + + def _on_partial_result(self, text: str): + """部分识别结果回调""" + if not text.strip() or not self.app_config.show_partial_results: + return + + # 显示部分结果(覆盖当前行) + print(f"\r正在识别: {text}", end="", flush=True) + + # 调用外部回调 + if self.partial_result_callback: + self.partial_result_callback(text) + + def _save_results_to_file(self): + """保存结果到文件""" + try: + with open(self.app_config.output_file, 'w', encoding='utf-8') as f: + f.write(f"# 语音识别结果\n") + f.write(f"# 开始时间: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(self.session.start_time))}\n") + f.write(f"# 持续时间: {self.session.get_duration():.2f} 秒\n") + f.write(f"# 识别结果数量: {len([r for r in self.session.results if r.is_final])}\n\n") + + for result in self.session.results: + if result.is_final: + f.write(f"{result}\n") + + f.write(f"\n# 完整文本\n") + f.write(self.session.get_full_text()) + + self.logger.info(f"结果已保存到: {self.app_config.output_file}") + + except Exception as e: + self.logger.error(f"保存结果到文件失败: {e}") + + def set_result_callback(self, callback: Callable): + """设置识别结果回调函数""" + self.result_callback = callback + + def set_partial_result_callback(self, callback: Callable): + """设置部分识别结果回调函数""" + self.partial_result_callback = callback + + def get_session_info(self) -> dict: + """获取会话信息""" + return { + "is_active": self.session.is_active, + "start_time": self.session.start_time, + "duration": self.session.get_duration(), + "result_count": len([r for r in self.session.results if r.is_final]), + "full_text": self.session.get_full_text() + } + + def get_model_info(self) -> dict: + """获取模型信息""" + return self.speech_recognizer.get_model_info() + + def list_audio_devices(self) -> list: + """列出音频设备""" + return self.audio_processor.list_audio_devices() + + def cleanup(self): + """清理资源""" + self.stop() + self.audio_processor.cleanup() + self.speech_recognizer.cleanup() + self.logger.info("应用资源已清理") + + def run_interactive(self): + """交互式运行""" + print("=" * 60) + print("实时语音转文字系统") + print("=" * 60) + + # 显示系统信息 + print(f"\n模型信息:") + model_info = self.get_model_info() + for key, value in model_info.items(): + print(f" {key}: {value}") + + print(f"\n音频设备:") + devices = self.list_audio_devices() + for device in devices: + print(f" [{device['index']}] {device['name']} ({device['channels']} 通道)") + + print(f"\n按 Ctrl+C 停止识别") + print(f"开始说话...\n") + + try: + # 启动识别 + if not self.start(): + print("启动失败") + return + + # 等待用户中断 + while self.is_running: + time.sleep(0.1) + + except KeyboardInterrupt: + print("\n\n用户中断") + finally: + self.cleanup() + + # 显示会话统计 + session_info = self.get_session_info() + print(f"\n=" * 60) + print(f"会话统计:") + print(f" 持续时间: {session_info['duration']:.2f} 秒") + print(f" 识别结果数量: {session_info['result_count']}") + if self.app_config.save_to_file: + print(f" 结果已保存到: {self.app_config.output_file}") + print(f"=" * 60) \ No newline at end of file diff --git a/src/speech_recognizer.py b/src/speech_recognizer.py new file mode 100644 index 0000000..e95054a --- /dev/null +++ b/src/speech_recognizer.py @@ -0,0 +1,236 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +语音识别模块 +使用sherpa-onnx进行实时语音识别 +""" + +import sherpa_onnx +import numpy as np +import logging +import time +from typing import Optional, List, Callable +from .config import ModelConfig + +class SpeechRecognizer: + """语音识别器类""" + + def __init__(self, config: ModelConfig): + self.config = config + self.recognizer = None + self.stream = None + self.display = None + + # 设置日志 + self.logger = logging.getLogger(__name__) + + # 识别结果回调 + self.result_callback = None + self.partial_result_callback = None + + def initialize(self) -> bool: + """初始化语音识别器""" + try: + # 检查模型文件 + missing_files = self.config.validate_model_files() + if missing_files: + self.logger.error(f"缺少模型文件: {missing_files}") + self.logger.error("请下载模型文件到 models/ 目录") + return False + + # 使用工厂方法创建识别器 + self.recognizer = sherpa_onnx.OnlineRecognizer.from_transducer( + tokens=self.config.tokens, + encoder=self.config.encoder, + decoder=self.config.decoder, + joiner=self.config.joiner, + num_threads=self.config.num_threads, + sample_rate=self.config.sample_rate, + feature_dim=self.config.feature_dim, + decoding_method=self.config.decoding_method, + max_active_paths=self.config.max_active_paths, + enable_endpoint_detection=self.config.enable_endpoint, + rule1_min_trailing_silence=self.config.rule1_min_trailing_silence, + rule2_min_trailing_silence=self.config.rule2_min_trailing_silence, + rule3_min_utterance_length=self.config.rule3_min_utterance_length, + provider=self.config.provider + ) + + self.logger.info("语音识别器初始化成功") + return True + + except Exception as e: + self.logger.error(f"语音识别器初始化失败: {e}") + return False + + def create_stream(self): + """创建识别流""" + if not self.recognizer: + self.logger.error("识别器未初始化") + return None + + self.stream = self.recognizer.create_stream() + return self.stream + + def process_audio(self, audio_data: np.ndarray) -> Optional[str]: + """处理音频数据""" + if not self.stream or not self.recognizer: + return None + + try: + # 将音频数据转换为float32格式 + audio_float = audio_data.astype(np.float32) / 32768.0 + + # 接受音频数据 + self.stream.accept_waveform( + sample_rate=self.config.sample_rate, + waveform=audio_float + ) + + # 解码音频流 + while self.recognizer.is_ready(self.stream): + self.recognizer.decode_stream(self.stream) + + # 获取部分识别结果 + result = self.recognizer.get_result(self.stream) + if result and result.strip() and self.partial_result_callback: + self.partial_result_callback(result) + + # 检查是否有完整的识别结果(端点检测) + if self.recognizer.is_endpoint(self.stream): + final_result = self.recognizer.get_result(self.stream) + if final_result and final_result.strip(): + if self.result_callback: + self.result_callback(final_result) + + # 重置流以继续识别 + self.recognizer.reset(self.stream) + return final_result + else: + # 即使没有结果也要重置流 + self.recognizer.reset(self.stream) + + return None + + except Exception as e: + self.logger.error(f"音频处理错误: {e}") + return None + + def finalize_stream(self) -> Optional[str]: + """结束识别流并获取最终结果""" + if not self.stream: + return None + + try: + # 输入结束标志 + self.stream.input_finished() + + # 获取最终结果 + result = self.recognizer.get_result(self.stream) + if result and result.strip(): + if self.result_callback: + self.result_callback(result) + return result + + return None + + except Exception as e: + self.logger.error(f"结束识别流错误: {e}") + return None + + def set_result_callback(self, callback: Callable[[str], None]): + """设置识别结果回调函数""" + self.result_callback = callback + + def set_partial_result_callback(self, callback: Callable[[str], None]): + """设置部分识别结果回调函数""" + self.partial_result_callback = callback + + def reset_stream(self): + """重置识别流""" + if self.stream and self.recognizer: + self.recognizer.reset(self.stream) + + def get_model_info(self) -> dict: + """获取模型信息""" + if not self.recognizer: + return {} + + return { + "sample_rate": self.config.sample_rate, + "feature_dim": self.config.feature_dim, + "num_threads": self.config.num_threads, + "provider": self.config.provider, + "decoding_method": self.config.decoding_method, + "endpoint_detection": self.config.enable_endpoint_detection + } + + def cleanup(self): + """清理资源""" + if self.stream: + self.stream = None + + if self.recognizer: + self.recognizer = None + + self.logger.info("语音识别器已清理") + +class RecognitionResult: + """识别结果类""" + + def __init__(self, text: str, timestamp: float, is_final: bool = True): + self.text = text + self.timestamp = timestamp + self.is_final = is_final + self.confidence = 1.0 # sherpa-onnx暂不提供置信度 + + def __str__(self): + return f"[{time.strftime('%H:%M:%S', time.localtime(self.timestamp))}] {self.text}" + + def to_dict(self): + return { + "text": self.text, + "timestamp": self.timestamp, + "is_final": self.is_final, + "confidence": self.confidence + } + +class RecognitionSession: + """识别会话类""" + + def __init__(self): + self.results: List[RecognitionResult] = [] + self.start_time = time.time() + self.is_active = False + + def add_result(self, text: str, is_final: bool = True): + """添加识别结果""" + result = RecognitionResult( + text=text, + timestamp=time.time(), + is_final=is_final + ) + self.results.append(result) + return result + + def get_full_text(self) -> str: + """获取完整文本""" + return " ".join([r.text for r in self.results if r.is_final]) + + def get_duration(self) -> float: + """获取会话持续时间""" + return time.time() - self.start_time + + def start(self): + """开始会话""" + self.is_active = True + self.start_time = time.time() + + def stop(self): + """结束会话""" + self.is_active = False + + def clear(self): + """清空结果""" + self.results.clear() + self.start_time = time.time() \ No newline at end of file