Skip to content

Commit 306d33d

Browse files
authored
Merge pull request #18 from yeoleobun/interrupt
Fix: fix and optimizing interruption event
2 parents 2b36cb7 + 2f9543f commit 306d33d

6 files changed

Lines changed: 28 additions & 30 deletions

File tree

src/event.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -102,13 +102,11 @@ pub enum SessionEvent {
102102
#[serde(rename = "trackId")]
103103
track_id: String,
104104
timestamp: u64,
105-
position: u64, // current playback position at the time of interruption
106-
},
107-
OnInterrupt {
108-
subtitle: String,
109-
position: u32,
110-
total_duration: u32, // ms
111-
current: u32, // current timestamp of total_duration
105+
subtitle: Option<String>, // current tts text
106+
position: Option<u32>, // word index in subtitle
107+
#[serde(rename = "totalDuration")]
108+
total_duration: u32, // whole tts duration
109+
current: u32, // elapsed time since start of tts
112110
},
113111
AsrFinal {
114112
#[serde(rename = "trackId")]

src/handler/tests/webrtc_test.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -562,11 +562,12 @@ async fn test_tts_interrupt_with_config(tts_config: SynthesisOption, text: &str)
562562
.await
563563
.unwrap();
564564
}
565-
SessionEvent::OnInterrupt {
565+
SessionEvent::Interruption {
566566
subtitle,
567567
position,
568568
total_duration,
569569
current,
570+
..
570571
} => {
571572
interrupted_clone.store(true, Ordering::Relaxed);
572573
info!(

src/media/track/tts.rs

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,8 @@ impl Track for TtsTrack {
173173
let synthesize_done = Arc::new(AtomicBool::new(false));
174174
let synthesize_done_clone = synthesize_done.clone();
175175
let session_id = self.session_id.clone();
176+
let current_text = Arc::new(Mutex::new(None));
177+
let current_text_clone = current_text.clone();
176178
let subtitles = Arc::new(Mutex::new(Vec::<TTSSubtitle>::new()));
177179
let subtitles_clone = subtitles.clone();
178180
let total_audio_len = Arc::new(AtomicUsize::new(0));
@@ -181,6 +183,10 @@ impl Track for TtsTrack {
181183
let mut last_play_id = None;
182184
while let Some(command) = command_rx.recv().await {
183185
let text = command.text;
186+
{
187+
let mut current_text = current_text_clone.lock().await;
188+
*current_text = Some(text.clone());
189+
}
184190
let play_id = command.play_id;
185191
let mut option = command.option;
186192
if option.speaker.is_none() {
@@ -230,7 +236,6 @@ impl Track for TtsTrack {
230236
let duration = bytes_size_to_duration(audio.len(), sample_rate);
231237
total_audio_len_clone.store(audio.len(), Ordering::Relaxed);
232238
subtitles.push(TTSSubtitle::new(
233-
&text,
234239
0,
235240
duration,
236241
0,
@@ -438,26 +443,26 @@ impl Track for TtsTrack {
438443
let remaining_size = buffer.lock().await.len() * 2;
439444
debug!(session_id, "total_size: {} remaining_size: {}", total_size, remaining_size);
440445
let sended_size = total_size - remaining_size;
441-
let mut text = "".into();
442-
let mut position = 0;
443-
let mut current = bytes_size_to_duration(sended_size, sample_rate);
444-
let total_duration = bytes_size_to_duration(total_size, sample_rate);
446+
let text = current_text.lock().await.take();
447+
let mut position = None;
448+
let current = bytes_size_to_duration(sended_size, sample_rate);
449+
let total_duration = bytes_size_to_duration(total_size, sample_rate);
445450
let subtitles = subtitles.lock().await;
446-
debug!("subtitles: {:?}", subtitles);
447451
for subtitle in subtitles.iter().rev() {
448452
if subtitle.begin_time <= current {
449-
text = subtitle.text.clone();
450-
position = subtitle.begin_index;
451-
current = subtitle.begin_time;
453+
position = Some(subtitle.begin_index);
452454
break;
453455
}
454456
}
455-
let _ = event_sender_clone.send(SessionEvent::OnInterrupt {
457+
let event = SessionEvent::Interruption {
458+
track_id: track_id.clone(),
459+
timestamp: crate::get_timestamp(),
456460
subtitle: text,
457461
position,
458462
total_duration,
459463
current,
460-
});
464+
};
465+
let _ = event_sender_clone.send(event);
461466
}
462467
}
463468
event_sender_clone

src/synthesis/aliyun.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -233,20 +233,18 @@ impl AliyunTTSState {
233233
self.text
234234
.chars()
235235
.enumerate()
236-
.position(|(i, _)| i == usage as usize)
236+
.position(|(i, _)| i >= usage as usize)
237237
.unwrap_or(default as usize) as u32
238238
}
239239

240240
fn move_forward(&mut self, current_usage: u32) -> Vec<TTSSubtitle> {
241-
let subtitle = self.text[self.last_usage as usize..current_usage as usize].to_string();
242241
let begin_index = self.usage_to_index(self.last_usage, 0);
243242
let end_index = self.usage_to_index(current_usage, self.text.len() as u32);
244243
let begin_time = self.size_to_time(self.last_size);
245244
let end_time = self.size_to_time(self.current_size);
246245
self.last_size = self.current_size;
247246
self.last_usage = current_usage;
248247
vec![TTSSubtitle::new(
249-
&subtitle,
250248
begin_time,
251249
end_time,
252250
begin_index,

src/synthesis/mod.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -119,23 +119,20 @@ pub enum TTSEvent {
119119
#[allow(dead_code)]
120120
#[derive(Debug)]
121121
pub struct TTSSubtitle {
122-
pub text: String,
123122
pub begin_time: u32,
124123
pub end_time: u32,
125124
pub begin_index: u32,
126-
end_index: u32,
125+
pub end_index: u32,
127126
}
128127

129128
impl TTSSubtitle {
130129
pub fn new(
131-
text: &str,
132130
begin_time: u32,
133131
end_time: u32,
134132
begin_index: u32,
135133
end_index: u32,
136134
) -> Self {
137135
Self {
138-
text: text.to_string(),
139136
begin_time,
140137
end_time,
141138
begin_index,

src/synthesis/tencent_cloud.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ struct WebSocketResult {
3939
#[derive(Debug, Deserialize)]
4040
#[serde(rename_all = "PascalCase")]
4141
struct Subtitle {
42-
text: String,
4342
begin_time: u32,
4443
end_time: u32,
4544
begin_index: u32,
@@ -49,7 +48,6 @@ struct Subtitle {
4948
impl From<&Subtitle> for TTSSubtitle {
5049
fn from(subtitle: &Subtitle) -> Self {
5150
TTSSubtitle::new(
52-
&subtitle.text,
5351
subtitle.begin_time,
5452
subtitle.end_time,
5553
subtitle.begin_index,
@@ -197,9 +195,10 @@ impl TencentCloudTtsClient {
197195

198196
if response.code != 0 {
199197
return Some(Err(anyhow!(
200-
"Tencent TTS faild, Session: {}, error: {}",
198+
"Tencent TTS faild, Session: {}, error: {}, text: {}",
201199
session_id,
202-
response.message
200+
response.message,
201+
text
203202
)));
204203
}
205204

0 commit comments

Comments
 (0)