openspeechapi 0.2.3__tar.gz → 0.2.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/PKG-INFO +1 -1
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/__init__.py +1 -1
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/core/models.py +10 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/dispatch/dispatcher.py +23 -4
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/logging_config.py +16 -2
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/stt/iflytek.py +17 -3
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/pyproject.toml +1 -1
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_logging.py +32 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/.dockerignore +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/.env.example +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/.github/workflows/ci.yml +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/.gitignore +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/.tmp/audio/en.aiff +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/.tmp/audio/en_16k.wav +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/.tmp/audio/en_16k_pad6.wav +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/.tmp/audio/en_long.aiff +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/.tmp/audio/en_long_16k.wav +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/.tmp/audio/en_mid.aiff +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/.tmp/audio/en_mid_16k.wav +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/.tmp/audio/zh.aiff +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/.tmp/audio/zh_16k.wav +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/.tmp/openspeech-8600.log +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/.tmp/openspeech-serve.log +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/.tmp/webui-server.log +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/.tmp/webui-server.pid +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/.tmp/wlk12101.log +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/.tmp/wlk12101.pid +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/.tmp/wlk12102.log +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/.tmp/wlk12102.pid +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/AGENTS.md +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/CLAUDE.md +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/Dockerfile +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/README.md +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/aibox-script/aibox-1.0.0-SNAPSHOT-stdout.log +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/aibox-script/aibox.2026-04-02.log +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/aibox-script/com.user.restart-jar.plist +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/aibox-script/restart-jar.sh +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/aibox-script.tar.gz +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/docker-compose.yml +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/docs/architecture/local-engine-manager.md +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/docs/architecture/logging-spec.md +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/docs/architecture/stt-engineering-optimization-guide.md +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/docs/architecture/stt-streaming-spec.md +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/docs/architecture/webui-phase-a.md +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/docs/engines/fish-speech-docker.md +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/docs/engines/fish-speech-native.md +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/docs/engines/stt-native-models.md +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/docs/superpowers/plans/2026-04-01-phase1-implementation.md +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/docs/superpowers/plans/2026-04-11-macos-native-tts-stt.md +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/docs/superpowers/specs/2026-04-01-openspeech-api-design.md +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/docs/superpowers/specs/2026-04-03-hot-lazy-loading.md +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/docs/superpowers/specs/2026-04-03-phase2-protocol-layer.md +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/docs/superpowers/specs/2026-04-03-phase3-production.md +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/docs/superpowers/specs/2026-04-11-macos-native-tts-stt-design.md +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/docs/superpowers/specs/2026-04-12-cloud-providers-webui-design.md +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/docs/superpowers/specs/2026-04-15-streaming-tts-stt-fixes-display-names.md +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/docs/superpowers/specs/2026-04-16-provider-management-engines-rename.md +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/examples/client_stt.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/examples/client_tts.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/examples/stt_simple.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/examples/tts_simple.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/__main__.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/cli.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/client/__init__.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/client/client.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/config.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/core/__init__.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/core/base.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/core/enums.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/core/registry.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/core/settings.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/demo.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/dispatch/__init__.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/dispatch/context.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/dispatch/executors/__init__.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/dispatch/executors/base.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/dispatch/executors/in_process.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/dispatch/executors/remote.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/dispatch/executors/subprocess_exec.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/dispatch/fanout.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/dispatch/filters.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/dispatch/lifecycle.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/dispatch/watcher.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/engine_catalog.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/engine_registry.yaml +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/exceptions.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/factory.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/local_engines/__init__.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/local_engines/aim_resolver.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/local_engines/backends/__init__.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/local_engines/backends/docker_backend.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/local_engines/backends/native_backend.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/local_engines/base.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/local_engines/engines/__init__.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/local_engines/engines/faster_whisper.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/local_engines/engines/fish_speech.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/local_engines/engines/sherpa_onnx.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/local_engines/engines/whisper.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/local_engines/engines/whisperlivekit.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/local_engines/manager.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/local_engines/models.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/local_engines/progress.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/local_engines/registry.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/local_engines/task_store.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/local_engines/tasks.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/observe/__init__.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/observe/base.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/observe/debug.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/observe/latency.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/observe/metrics.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/observe/tracing.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/observe/usage.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/__init__.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/_template.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/stt/__init__.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/stt/alibaba.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/stt/assemblyai.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/stt/azure_speech.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/stt/baidu.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/stt/deepgram.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/stt/elevenlabs.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/stt/faster_whisper.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/stt/google_cloud.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/stt/macos_speech.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/stt/openai.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/stt/sherpa_onnx.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/stt/tencent.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/stt/volcengine.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/stt/whisper.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/stt/whisperlivekit.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/stt/windows_speech.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/tts/__init__.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/tts/alibaba.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/tts/azure_speech.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/tts/baidu.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/tts/coqui.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/tts/cosyvoice.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/tts/deepgram.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/tts/elevenlabs.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/tts/fish_speech.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/tts/google_cloud.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/tts/iflytek.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/tts/macos_say.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/tts/minimax.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/tts/openai.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/tts/piper.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/tts/tencent.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/tts/volcengine.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/providers/tts/windows_sapi.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/server/__init__.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/server/app.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/server/auth.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/server/middleware.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/server/routes/__init__.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/server/routes/management.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/server/routes/stt.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/server/routes/tts.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/server/routes/webui.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/server/webui/app.js +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/server/webui/index.html +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/server/webui/styles.css +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/server/ws/__init__.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/server/ws/stt_stream.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/server/ws/tts_stream.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/telemetry/__init__.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/telemetry/perf.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/utils/__init__.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/utils/audio_converter.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/utils/audio_playback.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/vendor_registry.yaml +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/output/output.wav +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/output.wav +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/providers.example.yaml +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/scripts/engines/cloud/install.sh +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/scripts/engines/faster-whisper/native/install.sh +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/scripts/engines/fish-speech/native/install.sh +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/scripts/engines/macos-stt/install.sh +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/scripts/engines/macos-stt/macos_stt.swift +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/scripts/engines/macos-stt/request_auth.swift +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/scripts/engines/sherpa-onnx/native/install.sh +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/scripts/engines/sherpa-onnx/native/run_streaming_server.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/scripts/engines/whisper/native/install.sh +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/scripts/engines/whisperlivekit/native/install.sh +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/__init__.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/conftest.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/e2e/__init__.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/e2e/conftest.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/e2e/test_fanout_e2e.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/e2e/test_faster_whisper_e2e.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/e2e/test_openai_e2e.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/e2e/test_webui_e2e.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/fixtures/hello.wav +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/integration/__init__.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/integration/test_fanout_integration.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/integration/test_in_process_integration.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/integration/test_server_client.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/__init__.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_aim_resolver.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_audio_converter.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_audio_playback.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_base.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_cli.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_cli_engine.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_client.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_config.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_context.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_debug_observer.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_dispatcher.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_docker_backend_progress.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_engine_registry.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_enums.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_executor_base.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_fanout.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_filters.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_hot_reload.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_in_process.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_latency_observer.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_lifecycle.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_local_engine_task_store.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_local_engines_manager.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_metrics_observer.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_models.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_native_backend.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_observer_base.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_plugin_mechanism.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_providers/__init__.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_providers/test_cloud_providers.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_providers/test_elevenlabs_stt.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_providers/test_macos_say.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_providers/test_macos_speech.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_providers/test_openai_base_url.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_providers/test_openai_stt.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_providers/test_openai_tts.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_providers/test_sherpa_onnx_stt.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_providers/test_stt_stubs.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_providers/test_tts_stubs.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_providers/test_whisperlivekit_stt.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_registry.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_remote.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_server/__init__.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_server/test_auth.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_server/test_config_api.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_server/test_routes.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_server/test_websocket.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_subprocess.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_usage_observer.py +0 -0
- {openspeechapi-0.2.3 → openspeechapi-0.2.5}/tests/unit/test_watcher.py +0 -0
|
@@ -50,6 +50,16 @@ class STTOptions:
|
|
|
50
50
|
beam_size: int | None = None
|
|
51
51
|
compute_type: str | None = None
|
|
52
52
|
fp16: bool | None = None
|
|
53
|
+
# Per-call override for the trailing-silence threshold (ms) before
|
|
54
|
+
# the provider treats utterance as ended. ``None`` means "use the
|
|
55
|
+
# provider's configured default" (e.g. iflytek's ``settings.vad_eos``
|
|
56
|
+
# populated from speech_providers.yaml). Wallex passes the
|
|
57
|
+
# panel-supplied ``parameter.iat.eos`` here when the panel needs a
|
|
58
|
+
# different value than the deployment default — for instance a
|
|
59
|
+
# kiosk that wants more responsive cut-off than a slow-paced
|
|
60
|
+
# voice assistant. Providers that don't support VAD finalization
|
|
61
|
+
# (Whisper, Faster-Whisper) silently ignore this field.
|
|
62
|
+
vad_eos: int | None = None
|
|
53
63
|
|
|
54
64
|
|
|
55
65
|
@dataclass
|
|
@@ -114,9 +114,17 @@ class _STTNamespace:
|
|
|
114
114
|
self,
|
|
115
115
|
provider: str,
|
|
116
116
|
stream: "AsyncIterator[bytes]",
|
|
117
|
+
opts: "STTOptions | None" = None,
|
|
117
118
|
) -> "AsyncIterator[Transcription]":
|
|
118
|
-
"""Stream audio chunks to the named provider and yield transcriptions.
|
|
119
|
-
|
|
119
|
+
"""Stream audio chunks to the named provider and yield transcriptions.
|
|
120
|
+
|
|
121
|
+
``opts`` is optional and forwarded to the provider's
|
|
122
|
+
``transcribe_stream`` if it declares the parameter (current users:
|
|
123
|
+
iFlytek STT honors ``opts.vad_eos`` for per-call silence-threshold
|
|
124
|
+
override). Providers that don't declare ``opts`` raise TypeError;
|
|
125
|
+
callers that don't need the override should leave it ``None``.
|
|
126
|
+
"""
|
|
127
|
+
async for item in self._dispatcher._transcribe_stream(provider, stream, opts):
|
|
120
128
|
yield item
|
|
121
129
|
|
|
122
130
|
async def fanout(
|
|
@@ -479,8 +487,14 @@ class ServiceDispatcher:
|
|
|
479
487
|
self,
|
|
480
488
|
provider: str,
|
|
481
489
|
stream: AsyncIterator[bytes],
|
|
490
|
+
opts: STTOptions | None = None,
|
|
482
491
|
) -> AsyncIterator[Transcription]:
|
|
483
|
-
"""Stream audio chunks to the provider and yield Transcription results.
|
|
492
|
+
"""Stream audio chunks to the provider and yield Transcription results.
|
|
493
|
+
|
|
494
|
+
``opts`` is forwarded to the provider only when non-None — keeps
|
|
495
|
+
the call site backward-compatible with providers whose
|
|
496
|
+
``transcribe_stream`` predates the ``opts`` parameter.
|
|
497
|
+
"""
|
|
484
498
|
handle = self._get_handle(provider)
|
|
485
499
|
await self._lifecycle.ensure_ready(provider)
|
|
486
500
|
ctx = InvokeContext(
|
|
@@ -488,6 +502,11 @@ class ServiceDispatcher:
|
|
|
488
502
|
method="transcribe_stream",
|
|
489
503
|
exec_mode=handle.exec_mode,
|
|
490
504
|
)
|
|
505
|
+
# Build kwargs conditionally so providers without ``opts`` in
|
|
506
|
+
# their signature don't get a surprise unexpected-keyword error.
|
|
507
|
+
invoke_kwargs: dict[str, Any] = {"stream": stream}
|
|
508
|
+
if opts is not None:
|
|
509
|
+
invoke_kwargs["opts"] = opts
|
|
491
510
|
with bind_context(
|
|
492
511
|
provider=provider, engine=provider, request_id=ctx.request_id
|
|
493
512
|
):
|
|
@@ -500,7 +519,7 @@ class ServiceDispatcher:
|
|
|
500
519
|
count = 0
|
|
501
520
|
try:
|
|
502
521
|
async for item in handle.executor.invoke_stream(
|
|
503
|
-
"transcribe_stream",
|
|
522
|
+
"transcribe_stream", **invoke_kwargs
|
|
504
523
|
):
|
|
505
524
|
count += 1
|
|
506
525
|
yield item
|
|
@@ -185,10 +185,24 @@ def bind_context(
|
|
|
185
185
|
if v is not None:
|
|
186
186
|
bindings[k] = v
|
|
187
187
|
|
|
188
|
+
# NOTE: we drive logger.contextualize manually instead of using its
|
|
189
|
+
# ``with`` form so we can swallow the cleanup-time ValueError that
|
|
190
|
+
# loguru raises when bind_context wraps a ``yield`` in an async
|
|
191
|
+
# generator and that generator is closed from a different asyncio
|
|
192
|
+
# Context (e.g. the consumer task gets cancelled). The token loguru
|
|
193
|
+
# tries to reset was set in the original Context and Python forbids
|
|
194
|
+
# cross-context reset. The bindings are scoped to the closing
|
|
195
|
+
# Context anyway, so dropping the reset is harmless — Python GCs the
|
|
196
|
+
# vanishing Context's vars regardless.
|
|
197
|
+
contextualizer = logger.contextualize(**bindings)
|
|
198
|
+
contextualizer.__enter__()
|
|
188
199
|
try:
|
|
189
|
-
|
|
190
|
-
yield bindings
|
|
200
|
+
yield bindings
|
|
191
201
|
finally:
|
|
202
|
+
try:
|
|
203
|
+
contextualizer.__exit__(None, None, None)
|
|
204
|
+
except ValueError:
|
|
205
|
+
pass
|
|
192
206
|
for var, token in reversed(resets):
|
|
193
207
|
try:
|
|
194
208
|
var.reset(token)
|
|
@@ -216,10 +216,18 @@ class IflytekSTT(STTProvider):
|
|
|
216
216
|
# confuses anyone reading the request body, so
|
|
217
217
|
# gate it on the canonical language.
|
|
218
218
|
canon = _canonical_language(self.settings.language)
|
|
219
|
+
# Per-call override (``opts.vad_eos``) trumps the
|
|
220
|
+
# provider default. Wallex routes the panel's
|
|
221
|
+
# ``parameter.iat.eos`` through here so a kiosk
|
|
222
|
+
# can ship a tighter or looser silence threshold
|
|
223
|
+
# than the deployment yaml.
|
|
224
|
+
eos = (opts.vad_eos
|
|
225
|
+
if opts is not None and opts.vad_eos is not None
|
|
226
|
+
else self.settings.vad_eos)
|
|
219
227
|
business = {
|
|
220
228
|
"language": canon,
|
|
221
229
|
"domain": "iat",
|
|
222
|
-
"vad_eos":
|
|
230
|
+
"vad_eos": eos,
|
|
223
231
|
}
|
|
224
232
|
if canon == "zh_cn":
|
|
225
233
|
business["accent"] = "mandarin"
|
|
@@ -288,7 +296,7 @@ class IflytekSTT(STTProvider):
|
|
|
288
296
|
return "".join(parts)
|
|
289
297
|
|
|
290
298
|
async def transcribe_stream(
|
|
291
|
-
self, stream: AsyncIterator[bytes]
|
|
299
|
+
self, stream: AsyncIterator[bytes], opts: STTOptions | None = None,
|
|
292
300
|
) -> AsyncIterator[Transcription]:
|
|
293
301
|
"""Stream audio chunks to iFlytek via WebSocket and yield transcriptions.
|
|
294
302
|
|
|
@@ -345,11 +353,17 @@ class IflytekSTT(STTProvider):
|
|
|
345
353
|
# See transcribe() for rationale on
|
|
346
354
|
# canonicalizing language and gating accent.
|
|
347
355
|
canon = _canonical_language(self.settings.language)
|
|
356
|
+
# Per-call ``opts.vad_eos`` (e.g. wallex
|
|
357
|
+
# forwarding the panel's ``parameter.iat.eos``)
|
|
358
|
+
# trumps the provider's configured default.
|
|
359
|
+
eos = (opts.vad_eos
|
|
360
|
+
if opts is not None and opts.vad_eos is not None
|
|
361
|
+
else self.settings.vad_eos)
|
|
348
362
|
business = {
|
|
349
363
|
"language": canon,
|
|
350
364
|
"domain": "iat",
|
|
351
365
|
"dwa": "wpgs",
|
|
352
|
-
"vad_eos":
|
|
366
|
+
"vad_eos": eos,
|
|
353
367
|
}
|
|
354
368
|
if canon == "zh_cn":
|
|
355
369
|
business["accent"] = "mandarin"
|
|
@@ -96,6 +96,38 @@ def test_bind_context_sets_and_resets_request_id() -> None:
|
|
|
96
96
|
assert get_request_id() is None
|
|
97
97
|
|
|
98
98
|
|
|
99
|
+
def test_bind_context_aclose_from_different_asyncio_context_does_not_raise() -> None:
|
|
100
|
+
"""When bind_context wraps a yield in an async generator and the generator
|
|
101
|
+
is later closed from a different asyncio Context, loguru's
|
|
102
|
+
contextualize.__exit__ raises
|
|
103
|
+
``ValueError("<Token ...> was created in a different Context")``.
|
|
104
|
+
|
|
105
|
+
Production trace (2026-05-06): openspeechapi/dispatch/dispatcher.py
|
|
106
|
+
``_synthesize_stream`` holds bind_context across ``yield chunk``; when
|
|
107
|
+
the consumer's task is cancelled, athrow runs the finally in a new
|
|
108
|
+
Context and the unhandled ValueError pollutes the log.
|
|
109
|
+
|
|
110
|
+
bind_context must swallow that cleanup error.
|
|
111
|
+
"""
|
|
112
|
+
import asyncio
|
|
113
|
+
|
|
114
|
+
async def gen():
|
|
115
|
+
with bind_context(request_id="rid", provider="prov"):
|
|
116
|
+
for i in range(3):
|
|
117
|
+
yield i
|
|
118
|
+
|
|
119
|
+
async def driver():
|
|
120
|
+
g = gen()
|
|
121
|
+
first = await g.__anext__()
|
|
122
|
+
assert first == 0
|
|
123
|
+
# Closing from a freshly-created task puts aclose in a different
|
|
124
|
+
# asyncio Context than where bind_context was entered. This is the
|
|
125
|
+
# exact mismatch that production hit.
|
|
126
|
+
await asyncio.create_task(g.aclose())
|
|
127
|
+
|
|
128
|
+
asyncio.run(driver())
|
|
129
|
+
|
|
130
|
+
|
|
99
131
|
def test_bind_context_decorates_log_records(tmp_path: Path) -> None:
|
|
100
132
|
configure_logging(level="DEBUG", format="json", log_dir=str(tmp_path))
|
|
101
133
|
captured: list[dict] = []
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openspeechapi-0.2.3 → openspeechapi-0.2.5}/docs/architecture/stt-engineering-optimization-guide.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openspeechapi-0.2.3 → openspeechapi-0.2.5}/docs/superpowers/specs/2026-04-03-hot-lazy-loading.md
RENAMED
|
File without changes
|
|
File without changes
|
{openspeechapi-0.2.3 → openspeechapi-0.2.5}/docs/superpowers/specs/2026-04-03-phase3-production.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/dispatch/executors/subprocess_exec.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/local_engines/backends/__init__.py
RENAMED
|
File without changes
|
{openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/local_engines/backends/docker_backend.py
RENAMED
|
File without changes
|
{openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/local_engines/backends/native_backend.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/local_engines/engines/faster_whisper.py
RENAMED
|
File without changes
|
{openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/local_engines/engines/fish_speech.py
RENAMED
|
File without changes
|
{openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/local_engines/engines/sherpa_onnx.py
RENAMED
|
File without changes
|
|
File without changes
|
{openspeechapi-0.2.3 → openspeechapi-0.2.5}/openspeechapi/local_engines/engines/whisperlivekit.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|