refactor: split core/ui/apps targets and add unit tests
Move all business logic into liblivecaption_core (no Qt dependency) and the widgets into liblivecaption_ui, leaving two executables: the caption window and the CLI, which no longer links Qt Widgets. Abstract the ASR backend behind IAsr so the streaming policy and the live pipeline can be tested with a scripted fake backend instead of a real model. 把全部业务逻辑下沉到不依赖 Qt 的 liblivecaption_core,界面独立成 liblivecaption_ui,拆出悬浮窗与命令行两个可执行程序(CLI 不再链接 Qt Widgets);并用 IAsr 抽象推理后端,使流式策略与实时管线可脱离真模型 用假实现做单元测试。测试还抓到一个真 bug:段恰好结束在 chunk 边界时 只提交了稳定部分,最后几个词被丢掉,已修。
This commit is contained in:
1 parent
4ed4e23282
commit
736ec14d5b
32 files changed
+1502
-655
No files matched your search
@@ -0,0 +1,60 @@
|
||||
#include "livetranscriber.h"
|
||||
|
||||
#include "iasr.h"
|
||||
|
||||
namespace lc {
|
||||
|
||||
LiveTranscriber::LiveTranscriber(IAsr & asr, QObject * parent)
|
||||
: QObject(parent), asr_(asr)
|
||||
{
|
||||
}
|
||||
|
||||
LiveTranscriber::~LiveTranscriber()
|
||||
{
|
||||
stop();
|
||||
}
|
||||
|
||||
QString LiveTranscriber::deviceName() const
|
||||
{
|
||||
return pipeline_ ? QString::fromStdString(pipeline_->deviceName()) : QString();
|
||||
}
|
||||
|
||||
bool LiveTranscriber::start(const StreamOptions & opts, QString * error)
|
||||
{
|
||||
stop();
|
||||
|
||||
LivePipelineOptions popt;
|
||||
popt.stream = opts;
|
||||
|
||||
pipeline_ = std::make_unique<LivePipeline>(asr_, popt);
|
||||
|
||||
// 回调在工作线程上被调用;连到主线程的接收者时 Qt 会自动排队投递。
|
||||
pipeline_->setCaptionCallback([this](const std::string & committed,
|
||||
const std::string & tail,
|
||||
const std::string & language) {
|
||||
Q_EMIT caption(QString::fromStdString(committed),
|
||||
QString::fromStdString(tail),
|
||||
QString::fromStdString(language));
|
||||
});
|
||||
pipeline_->setErrorCallback([this](const std::string & message) {
|
||||
Q_EMIT failed(QString::fromStdString(message));
|
||||
});
|
||||
|
||||
std::string err;
|
||||
if (!pipeline_->start(&err)) {
|
||||
if (error) *error = QString::fromStdString(err);
|
||||
pipeline_.reset();
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void LiveTranscriber::stop()
|
||||
{
|
||||
if (pipeline_) {
|
||||
pipeline_->stop();
|
||||
pipeline_.reset();
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace lc
|
||||
Reference in new issue
Block a user