Cancel speech recognition by timeout.

This commit is contained in:
levlam 2022-05-27 19:07:37 +03:00
parent b56b778660
commit 677c5795a3
5 changed files with 43 additions and 6 deletions

View File

@ -3558,6 +3558,8 @@ void Td::clear() {
LOG(DEBUG) << "TopDialogManager actor was cleared" << timer;
updates_manager_actor_.reset();
LOG(DEBUG) << "UpdatesManager actor was cleared" << timer;
voice_notes_manager_actor_.reset();
LOG(DEBUG) << "VoiceNotesManager actor was cleared" << timer;
web_pages_manager_actor_.reset();
LOG(DEBUG) << "WebPagesManager actor was cleared" << timer;
}
@ -3981,7 +3983,6 @@ void Td::init_managers() {
documents_manager_ = make_unique<DocumentsManager>(this);
video_notes_manager_ = make_unique<VideoNotesManager>(this);
videos_manager_ = make_unique<VideosManager>(this);
voice_notes_manager_ = make_unique<VoiceNotesManager>(this);
animations_manager_ = make_unique<AnimationsManager>(this, create_reference());
animations_manager_actor_ = register_actor("AnimationsManager", animations_manager_.get());
@ -4037,6 +4038,8 @@ void Td::init_managers() {
updates_manager_ = make_unique<UpdatesManager>(this, create_reference());
updates_manager_actor_ = register_actor("UpdatesManager", updates_manager_.get());
G()->set_updates_manager(updates_manager_actor_.get());
voice_notes_manager_ = make_unique<VoiceNotesManager>(this, create_reference());
voice_notes_manager_actor_ = register_actor("VoiceNotesManager", voice_notes_manager_.get());
web_pages_manager_ = make_unique<WebPagesManager>(this, create_reference());
web_pages_manager_actor_ = register_actor("WebPagesManager", web_pages_manager_.get());
G()->set_web_pages_manager(web_pages_manager_actor_.get());

View File

@ -137,7 +137,6 @@ class Td final : public Actor {
unique_ptr<DocumentsManager> documents_manager_;
unique_ptr<VideoNotesManager> video_notes_manager_;
unique_ptr<VideosManager> videos_manager_;
unique_ptr<VoiceNotesManager> voice_notes_manager_;
unique_ptr<AnimationsManager> animations_manager_;
ActorOwn<AnimationsManager> animations_manager_actor_;
@ -185,6 +184,8 @@ class Td final : public Actor {
ActorOwn<TopDialogManager> top_dialog_manager_actor_;
unique_ptr<UpdatesManager> updates_manager_;
ActorOwn<UpdatesManager> updates_manager_actor_;
unique_ptr<VoiceNotesManager> voice_notes_manager_;
ActorOwn<VoiceNotesManager> voice_notes_manager_actor_;
unique_ptr<WebPagesManager> web_pages_manager_;
ActorOwn<WebPagesManager> web_pages_manager_actor_;

View File

@ -94,7 +94,25 @@ class RateTranscribedAudioQuery final : public Td::ResultHandler {
}
};
VoiceNotesManager::VoiceNotesManager(Td *td) : td_(td) {
VoiceNotesManager::VoiceNotesManager(Td *td, ActorShared<> parent) : td_(td), parent_(std::move(parent)) {
voice_note_transcription_timeout_.set_callback(on_voice_note_transcription_timeout_callback);
voice_note_transcription_timeout_.set_callback_data(static_cast<void *>(this));
}
void VoiceNotesManager::tear_down() {
parent_.reset();
}
void VoiceNotesManager::on_voice_note_transcription_timeout_callback(void *voice_notes_manager_ptr,
int64 transcription_id) {
if (G()->close_flag()) {
return;
}
auto voice_notes_manager = static_cast<VoiceNotesManager *>(voice_notes_manager_ptr);
send_closure_later(voice_notes_manager->actor_id(voice_notes_manager),
&VoiceNotesManager::on_pending_voice_note_transcription_failed, transcription_id,
Status::Error(500, "Timeout expired"));
}
int32 VoiceNotesManager::get_voice_note_duration(FileId file_id) const {
@ -302,6 +320,7 @@ void VoiceNotesManager::on_voice_note_transcribed(FileId file_id, string &&text,
}
bool is_inserted = pending_voice_note_transcription_queries_.emplace(transcription_id, file_id).second;
CHECK(is_inserted);
voice_note_transcription_timeout_.set_timeout_in(transcription_id, TRANSCRIPTION_TIMEOUT);
}
}
@ -335,6 +354,7 @@ void VoiceNotesManager::on_update_transcribed_audio(string &&text, int64 transcr
}
auto file_id = it->second;
pending_voice_note_transcription_queries_.erase(it);
voice_note_transcription_timeout_.cancel_timeout(transcription_id);
on_voice_note_transcribed(file_id, std::move(text), transcription_id, is_final);
}
@ -346,6 +366,8 @@ void VoiceNotesManager::on_pending_voice_note_transcription_failed(int64 transcr
}
auto file_id = it->second;
pending_voice_note_transcription_queries_.erase(it);
voice_note_transcription_timeout_.cancel_timeout(transcription_id);
on_voice_note_transcription_failed(file_id, std::move(error));
}

View File

@ -13,7 +13,9 @@
#include "td/telegram/telegram_api.h"
#include "td/telegram/Version.h"
#include "td/actor/actor.h"
#include "td/actor/PromiseFuture.h"
#include "td/actor/Timeout.h"
#include "td/utils/common.h"
#include "td/utils/FlatHashMap.h"
@ -24,9 +26,9 @@ namespace td {
class Td;
class VoiceNotesManager {
class VoiceNotesManager final : public Actor {
public:
explicit VoiceNotesManager(Td *td);
VoiceNotesManager(Td *td, ActorShared<> parent);
int32 get_voice_note_duration(FileId file_id) const;
@ -66,6 +68,8 @@ class VoiceNotesManager {
FileId parse_voice_note(ParserT &parser);
private:
static constexpr int32 TRANSCRIPTION_TIMEOUT = 60;
class VoiceNote {
public:
string mime_type;
@ -78,6 +82,8 @@ class VoiceNotesManager {
FileId file_id;
};
static void on_voice_note_transcription_timeout_callback(void *voice_notes_manager_ptr, int64 transcription_id);
VoiceNote *get_voice_note(FileId file_id);
const VoiceNote *get_voice_note(FileId file_id) const;
@ -88,11 +94,16 @@ class VoiceNotesManager {
void on_voice_note_transcription_updated(FileId file_id);
void tear_down() final;
Td *td_;
ActorShared<> parent_;
FlatHashMap<FileId, unique_ptr<VoiceNote>, FileIdHash> voice_notes_;
FlatHashMap<FileId, vector<Promise<Unit>>, FileIdHash> speech_recognition_queries_;
FlatHashMap<int64, FileId> pending_voice_note_transcription_queries_;
MultiTimeout voice_note_transcription_timeout_{"VoiceNoteTranscriptionTimeout"};
FlatHashMap<FileId, FlatHashSet<FullMessageId, FullMessageIdHash>, FileIdHash> voice_note_messages_;
FlatHashMap<FullMessageId, FileId, FullMessageIdHash> message_voice_notes_;

View File

@ -424,7 +424,7 @@ class TestDownloadFile : public Task {
unlink(file.local_->path_).ignore();
}
size_t size = file.size_;
size_t size = narrow_cast<size_t>(file.size_);
Random::Xorshift128plus rnd(123);
size_t begin = 0;