File size: 1,546 Bytes
fc93158
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import CoreMedia
import Foundation

public enum OutputFormat: String {
    case txt
    case srt

    public var needsAudioTimeRange: Bool {
        switch self {
        case .srt: true
        default: false
        }
    }

    public func text(for transcript: AttributedString, maxLength: Int) -> String {
        switch self {
        case .txt:
            return String(transcript.characters)
        case .srt:
            func format(_ timeInterval: TimeInterval) -> String {
                let ms = Int(timeInterval.truncatingRemainder(dividingBy: 1) * 1000)
                let s = Int(timeInterval) % 60
                let m = (Int(timeInterval) / 60) % 60
                let h = Int(timeInterval) / 60 / 60
                return String(format: "%0.2d:%0.2d:%0.2d,%0.3d", h, m, s, ms)
            }

            return transcript.sentences(maxLength: maxLength).compactMap { (sentence: AttributedString) -> (
                CMTimeRange,
                String)? in
                guard let timeRange = sentence.audioTimeRange else { return nil }
                return (timeRange, String(sentence.characters))
            }.enumerated().map { index, run in
                let (timeRange, text) = run
                return """

                \(index + 1)
                \(format(timeRange.start.seconds)) --> \(format(timeRange.end.seconds))
                \(text.trimmingCharacters(in: .whitespacesAndNewlines))

                """
            }.joined().trimmingCharacters(in: .whitespacesAndNewlines)
        }
    }
}