Move transcription update subscription to TranscriptionManager.
This commit is contained in:
parent
1cdb210ed1
commit
ab39c96b2c
@ -14,14 +14,6 @@
|
|||||||
|
|
||||||
namespace td {
|
namespace td {
|
||||||
|
|
||||||
TranscriptionManager::TranscriptionManager(Td *td, ActorShared<> parent) : td_(td), parent_(std::move(parent)) {
|
|
||||||
load_trial_parameters();
|
|
||||||
}
|
|
||||||
|
|
||||||
void TranscriptionManager::tear_down() {
|
|
||||||
parent_.reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
void TranscriptionManager::TrialParameters::update_left_tries() {
|
void TranscriptionManager::TrialParameters::update_left_tries() {
|
||||||
if (cooldown_until_ <= G()->unix_time()) {
|
if (cooldown_until_ <= G()->unix_time()) {
|
||||||
cooldown_until_ = 0;
|
cooldown_until_ = 0;
|
||||||
@ -88,6 +80,32 @@ bool operator==(const TranscriptionManager::TrialParameters &lhs, const Transcri
|
|||||||
lhs.left_tries_ == rhs.left_tries_ && lhs.cooldown_until_ == rhs.cooldown_until_;
|
lhs.left_tries_ == rhs.left_tries_ && lhs.cooldown_until_ == rhs.cooldown_until_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TranscriptionManager::TranscriptionManager(Td *td, ActorShared<> parent) : td_(td), parent_(std::move(parent)) {
|
||||||
|
load_trial_parameters();
|
||||||
|
|
||||||
|
pending_audio_transcription_timeout_.set_callback(on_pending_audio_transcription_timeout_callback);
|
||||||
|
pending_audio_transcription_timeout_.set_callback_data(static_cast<void *>(td_));
|
||||||
|
}
|
||||||
|
|
||||||
|
void TranscriptionManager::tear_down() {
|
||||||
|
parent_.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TranscriptionManager::on_pending_audio_transcription_timeout_callback(void *td, int64 transcription_id) {
|
||||||
|
if (G()->close_flag()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
CHECK(td != nullptr);
|
||||||
|
if (!static_cast<Td *>(td)->auth_manager_->is_authorized()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto transcription_manager = static_cast<Td *>(td)->transcription_manager_.get();
|
||||||
|
send_closure_later(transcription_manager->actor_id(transcription_manager),
|
||||||
|
&TranscriptionManager::on_pending_audio_transcription_failed, transcription_id,
|
||||||
|
Status::Error(500, "Timeout expired"));
|
||||||
|
}
|
||||||
|
|
||||||
string TranscriptionManager::get_trial_parameters_database_key() {
|
string TranscriptionManager::get_trial_parameters_database_key() {
|
||||||
return "speech_recognition_trial";
|
return "speech_recognition_trial";
|
||||||
}
|
}
|
||||||
@ -153,6 +171,50 @@ TranscriptionManager::TrialParameters::get_update_speech_recognition_trial_objec
|
|||||||
cooldown_until_);
|
cooldown_until_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TranscriptionManager::subscribe_to_transcribed_audio_updates(int64 transcription_id,
|
||||||
|
TranscribedAudioHandler on_update) {
|
||||||
|
CHECK(transcription_id != 0);
|
||||||
|
if (pending_audio_transcriptions_.count(transcription_id) != 0) {
|
||||||
|
on_pending_audio_transcription_failed(transcription_id,
|
||||||
|
Status::Error(500, "Receive duplicate speech recognition identifier"));
|
||||||
|
}
|
||||||
|
bool is_inserted = pending_audio_transcriptions_.emplace(transcription_id, std::move(on_update)).second;
|
||||||
|
CHECK(is_inserted);
|
||||||
|
pending_audio_transcription_timeout_.set_timeout_in(transcription_id, AUDIO_TRANSCRIPTION_TIMEOUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TranscriptionManager::on_update_transcribed_audio(
|
||||||
|
telegram_api::object_ptr<telegram_api::updateTranscribedAudio> &&update) {
|
||||||
|
auto it = pending_audio_transcriptions_.find(update->transcription_id_);
|
||||||
|
if (it == pending_audio_transcriptions_.end()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// flags_, dialog_id_ and message_id_ must not be used
|
||||||
|
if (!update->pending_) {
|
||||||
|
auto on_update = std::move(it->second);
|
||||||
|
pending_audio_transcriptions_.erase(it);
|
||||||
|
pending_audio_transcription_timeout_.cancel_timeout(update->transcription_id_);
|
||||||
|
on_update(std::move(update));
|
||||||
|
} else {
|
||||||
|
it->second(std::move(update));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TranscriptionManager::on_pending_audio_transcription_failed(int64 transcription_id, Status &&error) {
|
||||||
|
if (G()->close_flag()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
auto it = pending_audio_transcriptions_.find(transcription_id);
|
||||||
|
if (it == pending_audio_transcriptions_.end()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
auto on_update = std::move(it->second);
|
||||||
|
pending_audio_transcriptions_.erase(it);
|
||||||
|
pending_audio_transcription_timeout_.cancel_timeout(transcription_id);
|
||||||
|
|
||||||
|
on_update(std::move(error));
|
||||||
|
}
|
||||||
|
|
||||||
void TranscriptionManager::get_current_state(vector<td_api::object_ptr<td_api::Update>> &updates) const {
|
void TranscriptionManager::get_current_state(vector<td_api::object_ptr<td_api::Update>> &updates) const {
|
||||||
if (!td_->auth_manager_->is_authorized() || td_->auth_manager_->is_bot()) {
|
if (!td_->auth_manager_->is_authorized() || td_->auth_manager_->is_bot()) {
|
||||||
return;
|
return;
|
||||||
|
@ -7,10 +7,16 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "td/telegram/td_api.h"
|
#include "td/telegram/td_api.h"
|
||||||
|
#include "td/telegram/telegram_api.h"
|
||||||
|
|
||||||
#include "td/actor/actor.h"
|
#include "td/actor/actor.h"
|
||||||
|
#include "td/actor/MultiTimeout.h"
|
||||||
|
|
||||||
#include "td/utils/common.h"
|
#include "td/utils/common.h"
|
||||||
|
#include "td/utils/FlatHashMap.h"
|
||||||
|
#include "td/utils/Status.h"
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
namespace td {
|
namespace td {
|
||||||
|
|
||||||
@ -22,11 +28,21 @@ class TranscriptionManager final : public Actor {
|
|||||||
|
|
||||||
void on_update_trial_parameters(int32 weekly_number, int32 duration_max, int32 cooldown_until);
|
void on_update_trial_parameters(int32 weekly_number, int32 duration_max, int32 cooldown_until);
|
||||||
|
|
||||||
|
using TranscribedAudioHandler =
|
||||||
|
std::function<void(Result<telegram_api::object_ptr<telegram_api::updateTranscribedAudio>>)>;
|
||||||
|
void subscribe_to_transcribed_audio_updates(int64 transcription_id, TranscribedAudioHandler on_update);
|
||||||
|
|
||||||
|
void on_update_transcribed_audio(telegram_api::object_ptr<telegram_api::updateTranscribedAudio> &&update);
|
||||||
|
|
||||||
void get_current_state(vector<td_api::object_ptr<td_api::Update>> &updates) const;
|
void get_current_state(vector<td_api::object_ptr<td_api::Update>> &updates) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
static constexpr int32 AUDIO_TRANSCRIPTION_TIMEOUT = 60;
|
||||||
|
|
||||||
void tear_down() final;
|
void tear_down() final;
|
||||||
|
|
||||||
|
static void on_pending_audio_transcription_timeout_callback(void *td, int64 transcription_id);
|
||||||
|
|
||||||
static string get_trial_parameters_database_key();
|
static string get_trial_parameters_database_key();
|
||||||
|
|
||||||
void load_trial_parameters();
|
void load_trial_parameters();
|
||||||
@ -37,6 +53,8 @@ class TranscriptionManager final : public Actor {
|
|||||||
|
|
||||||
td_api::object_ptr<td_api::updateSpeechRecognitionTrial> get_update_speech_recognition_trial_object() const;
|
td_api::object_ptr<td_api::updateSpeechRecognitionTrial> get_update_speech_recognition_trial_object() const;
|
||||||
|
|
||||||
|
void on_pending_audio_transcription_failed(int64 transcription_id, Status &&error);
|
||||||
|
|
||||||
struct TrialParameters {
|
struct TrialParameters {
|
||||||
int32 weekly_number_ = 0;
|
int32 weekly_number_ = 0;
|
||||||
int32 duration_max_ = 0;
|
int32 duration_max_ = 0;
|
||||||
@ -60,6 +78,9 @@ class TranscriptionManager final : public Actor {
|
|||||||
ActorShared<> parent_;
|
ActorShared<> parent_;
|
||||||
|
|
||||||
TrialParameters trial_parameters_;
|
TrialParameters trial_parameters_;
|
||||||
|
|
||||||
|
FlatHashMap<int64, TranscribedAudioHandler> pending_audio_transcriptions_;
|
||||||
|
MultiTimeout pending_audio_transcription_timeout_{"PendingAudioTranscriptionTimeout"};
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
@ -68,6 +68,7 @@
|
|||||||
#include "td/telegram/telegram_api.h"
|
#include "td/telegram/telegram_api.h"
|
||||||
#include "td/telegram/telegram_api.hpp"
|
#include "td/telegram/telegram_api.hpp"
|
||||||
#include "td/telegram/ThemeManager.h"
|
#include "td/telegram/ThemeManager.h"
|
||||||
|
#include "td/telegram/TranscriptionManager.h"
|
||||||
#include "td/telegram/Usernames.h"
|
#include "td/telegram/Usernames.h"
|
||||||
#include "td/telegram/WebPagesManager.h"
|
#include "td/telegram/WebPagesManager.h"
|
||||||
|
|
||||||
@ -257,9 +258,6 @@ class GetPtsUpdateQuery final : public Td::ResultHandler {
|
|||||||
UpdatesManager::UpdatesManager(Td *td, ActorShared<> parent) : td_(td), parent_(std::move(parent)) {
|
UpdatesManager::UpdatesManager(Td *td, ActorShared<> parent) : td_(td), parent_(std::move(parent)) {
|
||||||
last_pts_save_time_ = last_qts_save_time_ = Time::now() - 2 * MAX_PTS_SAVE_DELAY;
|
last_pts_save_time_ = last_qts_save_time_ = Time::now() - 2 * MAX_PTS_SAVE_DELAY;
|
||||||
|
|
||||||
pending_audio_transcription_timeout_.set_callback(on_pending_audio_transcription_timeout_callback);
|
|
||||||
pending_audio_transcription_timeout_.set_callback_data(static_cast<void *>(td_));
|
|
||||||
|
|
||||||
if (!td_->auth_manager_->is_authorized() || !td_->auth_manager_->is_bot()) {
|
if (!td_->auth_manager_->is_authorized() || !td_->auth_manager_->is_bot()) {
|
||||||
skipped_postponed_updates_after_start_ = 0;
|
skipped_postponed_updates_after_start_ = 0;
|
||||||
}
|
}
|
||||||
@ -452,20 +450,6 @@ void UpdatesManager::fill_gap(void *td, const char *source) {
|
|||||||
updates_manager->get_difference("fill_gap");
|
updates_manager->get_difference("fill_gap");
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdatesManager::on_pending_audio_transcription_timeout_callback(void *td, int64 transcription_id) {
|
|
||||||
if (G()->close_flag()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
CHECK(td != nullptr);
|
|
||||||
if (!static_cast<Td *>(td)->auth_manager_->is_authorized()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto updates_manager = static_cast<Td *>(td)->updates_manager_.get();
|
|
||||||
send_closure_later(updates_manager->actor_id(updates_manager), &UpdatesManager::on_pending_audio_transcription_failed,
|
|
||||||
transcription_id, Status::Error(500, "Timeout expired"));
|
|
||||||
}
|
|
||||||
|
|
||||||
void UpdatesManager::get_difference(const char *source) {
|
void UpdatesManager::get_difference(const char *source) {
|
||||||
if (G()->close_flag() || !td_->auth_manager_->is_authorized()) {
|
if (G()->close_flag() || !td_->auth_manager_->is_authorized()) {
|
||||||
return;
|
return;
|
||||||
@ -2291,32 +2275,6 @@ void UpdatesManager::on_data_reloaded() {
|
|||||||
schedule_data_reload();
|
schedule_data_reload();
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdatesManager::subscribe_to_transcribed_audio_updates(int64 transcription_id, TranscribedAudioHandler on_update) {
|
|
||||||
CHECK(transcription_id != 0);
|
|
||||||
if (pending_audio_transcriptions_.count(transcription_id) != 0) {
|
|
||||||
on_pending_audio_transcription_failed(transcription_id,
|
|
||||||
Status::Error(500, "Receive duplicate speech recognition identifier"));
|
|
||||||
}
|
|
||||||
bool is_inserted = pending_audio_transcriptions_.emplace(transcription_id, std::move(on_update)).second;
|
|
||||||
CHECK(is_inserted);
|
|
||||||
pending_audio_transcription_timeout_.set_timeout_in(transcription_id, AUDIO_TRANSCRIPTION_TIMEOUT);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UpdatesManager::on_pending_audio_transcription_failed(int64 transcription_id, Status &&error) {
|
|
||||||
if (G()->close_flag()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
auto it = pending_audio_transcriptions_.find(transcription_id);
|
|
||||||
if (it == pending_audio_transcriptions_.end()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
auto on_update = std::move(it->second);
|
|
||||||
pending_audio_transcriptions_.erase(it);
|
|
||||||
pending_audio_transcription_timeout_.cancel_timeout(transcription_id);
|
|
||||||
|
|
||||||
on_update(std::move(error));
|
|
||||||
}
|
|
||||||
|
|
||||||
void UpdatesManager::on_pending_updates(vector<tl_object_ptr<telegram_api::Update>> &&updates, int32 seq_begin,
|
void UpdatesManager::on_pending_updates(vector<tl_object_ptr<telegram_api::Update>> &&updates, int32 seq_begin,
|
||||||
int32 seq_end, int32 date, double receive_time, Promise<Unit> &&promise,
|
int32 seq_end, int32 date, double receive_time, Promise<Unit> &&promise,
|
||||||
const char *source) {
|
const char *source) {
|
||||||
@ -4327,19 +4285,7 @@ void UpdatesManager::on_update(tl_object_ptr<telegram_api::updateSavedRingtones>
|
|||||||
}
|
}
|
||||||
|
|
||||||
void UpdatesManager::on_update(tl_object_ptr<telegram_api::updateTranscribedAudio> update, Promise<Unit> &&promise) {
|
void UpdatesManager::on_update(tl_object_ptr<telegram_api::updateTranscribedAudio> update, Promise<Unit> &&promise) {
|
||||||
auto it = pending_audio_transcriptions_.find(update->transcription_id_);
|
td_->transcription_manager_->on_update_transcribed_audio(std::move(update));
|
||||||
if (it == pending_audio_transcriptions_.end()) {
|
|
||||||
return promise.set_value(Unit());
|
|
||||||
}
|
|
||||||
// flags_, dialog_id_ and message_id_ must not be used
|
|
||||||
if (!update->pending_) {
|
|
||||||
auto on_update = std::move(it->second);
|
|
||||||
pending_audio_transcriptions_.erase(it);
|
|
||||||
pending_audio_transcription_timeout_.cancel_timeout(update->transcription_id_);
|
|
||||||
on_update(std::move(update));
|
|
||||||
} else {
|
|
||||||
it->second(std::move(update));
|
|
||||||
}
|
|
||||||
promise.set_value(Unit());
|
promise.set_value(Unit());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,10 +127,6 @@ class UpdatesManager final : public Actor {
|
|||||||
|
|
||||||
static int32 get_update_edit_message_pts(const telegram_api::Updates *updates_ptr, MessageFullId message_full_id);
|
static int32 get_update_edit_message_pts(const telegram_api::Updates *updates_ptr, MessageFullId message_full_id);
|
||||||
|
|
||||||
using TranscribedAudioHandler =
|
|
||||||
std::function<void(Result<telegram_api::object_ptr<telegram_api::updateTranscribedAudio>>)>;
|
|
||||||
void subscribe_to_transcribed_audio_updates(int64 transcription_id, TranscribedAudioHandler on_update);
|
|
||||||
|
|
||||||
void get_difference(const char *source);
|
void get_difference(const char *source);
|
||||||
|
|
||||||
void schedule_get_difference(const char *source);
|
void schedule_get_difference(const char *source);
|
||||||
@ -156,7 +152,6 @@ class UpdatesManager final : public Actor {
|
|||||||
static constexpr double UPDATE_APPLY_WARNING_TIME = 0.25;
|
static constexpr double UPDATE_APPLY_WARNING_TIME = 0.25;
|
||||||
static constexpr bool DROP_PTS_UPDATES = false;
|
static constexpr bool DROP_PTS_UPDATES = false;
|
||||||
static constexpr const char *AFTER_GET_DIFFERENCE_SOURCE = "after get difference";
|
static constexpr const char *AFTER_GET_DIFFERENCE_SOURCE = "after get difference";
|
||||||
static constexpr int32 AUDIO_TRANSCRIPTION_TIMEOUT = 60;
|
|
||||||
|
|
||||||
friend class OnUpdate;
|
friend class OnUpdate;
|
||||||
|
|
||||||
@ -271,9 +266,6 @@ class UpdatesManager final : public Actor {
|
|||||||
double get_difference_start_time_ = 0; // time from which we started to get difference without success
|
double get_difference_start_time_ = 0; // time from which we started to get difference without success
|
||||||
int32 get_difference_retry_count_ = 0;
|
int32 get_difference_retry_count_ = 0;
|
||||||
|
|
||||||
FlatHashMap<int64, TranscribedAudioHandler> pending_audio_transcriptions_;
|
|
||||||
MultiTimeout pending_audio_transcription_timeout_{"PendingAudioTranscriptionTimeout"};
|
|
||||||
|
|
||||||
struct SessionInfo {
|
struct SessionInfo {
|
||||||
uint64 update_count = 0;
|
uint64 update_count = 0;
|
||||||
double first_update_time = 0.0;
|
double first_update_time = 0.0;
|
||||||
@ -383,8 +375,6 @@ class UpdatesManager final : public Actor {
|
|||||||
|
|
||||||
static void fill_gap(void *td, const char *source);
|
static void fill_gap(void *td, const char *source);
|
||||||
|
|
||||||
static void on_pending_audio_transcription_timeout_callback(void *td, int64 transcription_id);
|
|
||||||
|
|
||||||
void repair_pts_gap();
|
void repair_pts_gap();
|
||||||
|
|
||||||
void on_get_pts_update(int32 pts, telegram_api::object_ptr<telegram_api::updates_Difference> difference_ptr);
|
void on_get_pts_update(int32 pts, telegram_api::object_ptr<telegram_api::updates_Difference> difference_ptr);
|
||||||
@ -441,8 +431,6 @@ class UpdatesManager final : public Actor {
|
|||||||
|
|
||||||
static vector<tl_object_ptr<telegram_api::Update>> *get_updates(telegram_api::Updates *updates_ptr);
|
static vector<tl_object_ptr<telegram_api::Update>> *get_updates(telegram_api::Updates *updates_ptr);
|
||||||
|
|
||||||
void on_pending_audio_transcription_failed(int64 transcription_id, Status &&error);
|
|
||||||
|
|
||||||
bool is_acceptable_user(UserId user_id) const;
|
bool is_acceptable_user(UserId user_id) const;
|
||||||
|
|
||||||
bool is_acceptable_chat(ChatId chat_id) const;
|
bool is_acceptable_chat(ChatId chat_id) const;
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
#include "td/telegram/Td.h"
|
#include "td/telegram/Td.h"
|
||||||
#include "td/telegram/td_api.h"
|
#include "td/telegram/td_api.h"
|
||||||
#include "td/telegram/telegram_api.h"
|
#include "td/telegram/telegram_api.h"
|
||||||
#include "td/telegram/UpdatesManager.h"
|
#include "td/telegram/TranscriptionManager.h"
|
||||||
|
|
||||||
#include "td/actor/actor.h"
|
#include "td/actor/actor.h"
|
||||||
|
|
||||||
@ -252,7 +252,7 @@ void VideoNotesManager::on_transcribed_audio_update(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (is_initial) {
|
if (is_initial) {
|
||||||
td_->updates_manager_->subscribe_to_transcribed_audio_updates(
|
td_->transcription_manager_->subscribe_to_transcribed_audio_updates(
|
||||||
transcription_id, [actor_id = actor_id(this),
|
transcription_id, [actor_id = actor_id(this),
|
||||||
file_id](Result<telegram_api::object_ptr<telegram_api::updateTranscribedAudio>> r_update) {
|
file_id](Result<telegram_api::object_ptr<telegram_api::updateTranscribedAudio>> r_update) {
|
||||||
send_closure(actor_id, &VideoNotesManager::on_transcribed_audio_update, file_id, false,
|
send_closure(actor_id, &VideoNotesManager::on_transcribed_audio_update, file_id, false,
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#include "td/telegram/Td.h"
|
#include "td/telegram/Td.h"
|
||||||
#include "td/telegram/td_api.h"
|
#include "td/telegram/td_api.h"
|
||||||
#include "td/telegram/telegram_api.h"
|
#include "td/telegram/telegram_api.h"
|
||||||
#include "td/telegram/UpdatesManager.h"
|
#include "td/telegram/TranscriptionManager.h"
|
||||||
|
|
||||||
#include "td/utils/buffer.h"
|
#include "td/utils/buffer.h"
|
||||||
#include "td/utils/logging.h"
|
#include "td/utils/logging.h"
|
||||||
@ -216,7 +216,7 @@ void VoiceNotesManager::on_transcribed_audio_update(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (is_initial) {
|
if (is_initial) {
|
||||||
td_->updates_manager_->subscribe_to_transcribed_audio_updates(
|
td_->transcription_manager_->subscribe_to_transcribed_audio_updates(
|
||||||
transcription_id, [actor_id = actor_id(this),
|
transcription_id, [actor_id = actor_id(this),
|
||||||
file_id](Result<telegram_api::object_ptr<telegram_api::updateTranscribedAudio>> r_update) {
|
file_id](Result<telegram_api::object_ptr<telegram_api::updateTranscribedAudio>> r_update) {
|
||||||
send_closure(actor_id, &VoiceNotesManager::on_transcribed_audio_update, file_id, false,
|
send_closure(actor_id, &VoiceNotesManager::on_transcribed_audio_update, file_id, false,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user