Build or extend speaking practice features (shadowing, dictation, listening) with HTML5 media APIs for TCT English
Use when building or extending speaking practice modes: Shadowing (A-B repeat), Dictation (type what you hear), or Listening Comprehension.
SpeakingPlaylist (Id, Title, Description, CreatedAt)
└── SpeakingVideo (Id, PlaylistId, Title, YoutubeId, Level, Topic, Duration, CreatedAt)
└── SpeakingSentence (Id, VideoId, Text, StartTime, EndTime)
UserSpeakingProgress (Id, UserId, VideoId, SentenceId, Mode, IsCompleted, UpdatedAt)
<audio> with currentTime to loop segments{ startTime, endTime, isLooping }StringComparison.OrdinalIgnoreCase in C#[HttpPost("api/speaking/{sentenceId}/progress")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> SaveSpeakingProgress(int sentenceId, [FromBody] SpeakingProgressDto dto)
{
var userId = GetCurrentUserId();
// Verify sentence exists, then upsert progress
}
.progressIYoutubeTranscriptService.ExtractTranscriptAsync(youtubeId)