libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
transcript.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
13#include <cstdint>
14#include <promeki/datastream.h>
15#include <promeki/datatype.h>
16#include <promeki/error.h>
17#include <promeki/list.h>
18#include <promeki/namespace.h>
19#include <promeki/result.h>
20#include <promeki/sharedptr.h>
21#include <promeki/string.h>
22#include <promeki/timestamp.h>
23
24PROMEKI_NAMESPACE_BEGIN
25
26class JsonObject;
27class Metadata;
28struct TranscriptImpl; // Pimpl — defined in transcript.cpp.
29struct TranscriptListImpl; // Pimpl — defined in transcript.cpp.
30
66class TranscriptWord {
67 public:
68 PROMEKI_DATATYPE(TranscriptWord, DataTypeTranscriptWord, 1)
69
70
71 using List = ::promeki::List<TranscriptWord>;
72
74 TranscriptWord() = default;
75
86 TranscriptWord(String text, TimeStamp start, TimeStamp end, float confidence = 1.0f)
87 : _text(std::move(text)), _start(start), _end(end), _confidence(confidence) {}
88
90 const String &text() const { return _text; }
91
93 const TimeStamp &start() const { return _start; }
94
96 const TimeStamp &end() const { return _end; }
97
99 float confidence() const { return _confidence; }
100
102 TimeStamp::Duration duration() const { return _end.value() - _start.value(); }
103
104 void setText(String v) { _text = std::move(v); }
105 void setStart(const TimeStamp &v) { _start = v; }
106 void setEnd(const TimeStamp &v) { _end = v; }
107 void setConfidence(float v) { _confidence = v; }
108
109 bool operator==(const TranscriptWord &o) const {
110 return _text == o._text && _start == o._start && _end == o._end
111 && _confidence == o._confidence;
112 }
113 bool operator!=(const TranscriptWord &o) const { return !(*this == o); }
114
116 JsonObject toJson() const;
117
119 String toString() const;
120
122 Error writeToStream(DataStream &s) const;
123
125 template <uint32_t V> static Result<TranscriptWord> readFromStream(DataStream &s);
126
127 private:
128 String _text;
129 TimeStamp _start;
130 TimeStamp _end;
131 float _confidence = 1.0f;
132};
133
135DataStream &operator<<(DataStream &stream, const TranscriptWord &word);
136
138DataStream &operator>>(DataStream &stream, TranscriptWord &word);
139
196class Transcript {
197 public:
198 PROMEKI_DATATYPE(Transcript, DataTypeTranscript, 1)
199
200
201 Transcript();
202
204 explicit Transcript(TranscriptWord::List words);
205
214 Transcript(TranscriptWord::List words, String speaker, String language, float confidence, bool partial);
215
216 Transcript(const Transcript &);
217 Transcript(Transcript &&) noexcept;
218 ~Transcript();
219 Transcript &operator=(const Transcript &);
220 Transcript &operator=(Transcript &&) noexcept;
221
222 // -- Read-only accessors ----------------------------------
223
225 const TranscriptWord::List &words() const;
226
228 const String &speaker() const;
229
231 const String &language() const;
232
234 float confidence() const;
235
246 bool partial() const;
247
249 const Metadata &metadata() const;
250
251 // -- Derived fields ---------------------------------------
252
259 const String &text() const;
260
265 TimeStamp start() const;
266
271 TimeStamp end() const;
272
274 TimeStamp::Duration duration() const;
275
277 bool isEmpty() const;
278
279 // -- CoW mutators -----------------------------------------
280
281 void setWords(TranscriptWord::List v);
282 void appendWord(TranscriptWord w);
283 void setSpeaker(String v);
284 void setLanguage(String v);
285 void setConfidence(float v);
286 void setPartial(bool v);
287 void setMetadata(Metadata v);
288
289 // -- Comparison + diagnostics -----------------------------
290
291 bool operator==(const Transcript &o) const;
292 bool operator!=(const Transcript &o) const { return !(*this == o); }
293
295 JsonObject toJson() const;
296
298 String toString() const;
299
309 Error writeToStream(DataStream &s) const;
310
312 template <uint32_t V> static Result<Transcript> readFromStream(DataStream &s);
313
314 private:
315 SharedPtr<TranscriptImpl> _d;
316};
317
318// ============================================================================
319// TranscriptList
320// ============================================================================
321
346class TranscriptList {
347 public:
348 TranscriptList();
349 explicit TranscriptList(List<Transcript> entries);
350 TranscriptList(const TranscriptList &);
351 TranscriptList(TranscriptList &&) noexcept;
352 ~TranscriptList();
353 TranscriptList &operator=(const TranscriptList &);
354 TranscriptList &operator=(TranscriptList &&) noexcept;
355
356 // -- Size / access ----------------------------------------
357
358 size_t size() const;
359 bool isEmpty() const;
360
362 const Transcript &at(size_t i) const;
363
365 const Transcript &operator[](size_t i) const;
366
367 // -- Mutators (CoW) ---------------------------------------
368
371 void append(const Transcript &t);
372
374 void clear();
375
377 void sortByStart();
378
380 void reserve(size_t n);
381
382 // -- Search helpers ---------------------------------------
383
389 int64_t findActiveAt(const TimeStamp &t) const;
390
396 int64_t findNextAfter(const TimeStamp &t) const;
397
398 // -- Raw access -------------------------------------------
399
401 const List<Transcript> &entries() const;
402
403 // -- Comparison + diagnostics -----------------------------
404
405 bool operator==(const TranscriptList &o) const;
406 bool operator!=(const TranscriptList &o) const { return !(*this == o); }
407
409 JsonObject toJson() const;
410
412 String toString() const;
413
414 private:
415 SharedPtr<TranscriptListImpl> _d;
416};
417
418PROMEKI_NAMESPACE_END
419
420#endif // PROMEKI_ENABLE_PROAV