fix: 修复 SenseVoiceEngine Windows 编译错误

- Impl 的 QMutex 移出 HAVE_ONNXRUNTIME 条件编译块
- loadModelSync/loadModelAsync 中的 ONNX 成员访问添加 #ifdef 保护

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Alvin Young 2026-05-13 17:43:12 +08:00
parent a56f273c45
commit 09677e3620

View File

@ -184,9 +184,9 @@ struct SenseVoiceEngine::Impl {
return false; return false;
} }
} }
#endif
QMutex mutex; QMutex mutex;
#endif
}; };
SenseVoiceEngine::SenseVoiceEngine(QObject* parent) SenseVoiceEngine::SenseVoiceEngine(QObject* parent)
@ -206,14 +206,17 @@ bool SenseVoiceEngine::loadModelSync(const QString& modelPath,
if (loaded_) { if (loaded_) {
LOG_WARNING(kTag, "模型已加载,先卸载再加载"); LOG_WARNING(kTag, "模型已加载,先卸载再加载");
// 内联清理,避免调用 unloadModel() 导致 mutex 递归死锁 // 内联清理,避免调用 unloadModel() 导致 mutex 递归死锁
#ifdef HAVE_ONNXRUNTIME
impl_->session.reset(); impl_->session.reset();
impl_->sessionOptions.reset(); impl_->sessionOptions.reset();
impl_->env.reset(); impl_->env.reset();
impl_->features.reset(); impl_->features.reset();
impl_->tokenizer = SenseVoiceTokenizer(); impl_->tokenizer = SenseVoiceTokenizer();
#endif
loaded_ = false; loaded_ = false;
} }
#ifdef HAVE_ONNXRUNTIME
QString errorMsg; QString errorMsg;
bool success = impl_->loadInWorker(modelPath, tokensPath, device, numThreads, errorMsg); bool success = impl_->loadInWorker(modelPath, tokensPath, device, numThreads, errorMsg);
loaded_ = success; loaded_ = success;
@ -225,6 +228,11 @@ bool SenseVoiceEngine::loadModelSync(const QString& modelPath,
emit error(errorMsg); emit error(errorMsg);
} }
return success; return success;
#else
(void)modelPath; (void)tokensPath; (void)device; (void)numThreads;
LOG_ERROR(kTag, "ONNX Runtime 未编译启用");
return false;
#endif
} }
void SenseVoiceEngine::loadModelAsync(const QString& modelPath, void SenseVoiceEngine::loadModelAsync(const QString& modelPath,
@ -235,14 +243,17 @@ void SenseVoiceEngine::loadModelAsync(const QString& modelPath,
if (loaded_) { if (loaded_) {
LOG_WARNING(kTag, "模型已加载,先卸载再加载"); LOG_WARNING(kTag, "模型已加载,先卸载再加载");
// 内联清理,避免调用 unloadModel() 导致 mutex 递归死锁 // 内联清理,避免调用 unloadModel() 导致 mutex 递归死锁
#ifdef HAVE_ONNXRUNTIME
impl_->session.reset(); impl_->session.reset();
impl_->sessionOptions.reset(); impl_->sessionOptions.reset();
impl_->env.reset(); impl_->env.reset();
impl_->features.reset(); impl_->features.reset();
impl_->tokenizer = SenseVoiceTokenizer(); impl_->tokenizer = SenseVoiceTokenizer();
#endif
loaded_ = false; loaded_ = false;
} }
#ifdef HAVE_ONNXRUNTIME
LOG_INFO(kTag, QString("异步加载 SenseVoice 模型: %1").arg(modelPath)); LOG_INFO(kTag, QString("异步加载 SenseVoice 模型: %1").arg(modelPath));
QFuture<void> future = QtConcurrent::run([this, modelPath, tokensPath, device, numThreads]() { QFuture<void> future = QtConcurrent::run([this, modelPath, tokensPath, device, numThreads]() {
@ -259,6 +270,10 @@ void SenseVoiceEngine::loadModelAsync(const QString& modelPath,
} }
}, Qt::QueuedConnection); }, Qt::QueuedConnection);
}); });
#else
(void)modelPath; (void)tokensPath; (void)device; (void)numThreads;
LOG_ERROR(kTag, "ONNX Runtime 未编译启用");
#endif
} }
void SenseVoiceEngine::unloadModel() { void SenseVoiceEngine::unloadModel() {