├── example.png
├── transcribe.xcodeproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
└── project.pbxproj
├── .github
└── workflows
│ └── swift.yml
├── Info.plist
├── .gitignore
├── README.md
└── transcribe
└── main.swift
/example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dtinth/transcribe/HEAD/example.png
--------------------------------------------------------------------------------
/transcribe.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/transcribe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/.github/workflows/swift.yml:
--------------------------------------------------------------------------------
1 | name: Swift
2 |
3 | on:
4 | push:
5 | branches: [ "main" ]
6 | pull_request:
7 | branches: [ "main" ]
8 |
9 | jobs:
10 | build:
11 |
12 | runs-on: macos-13
13 |
14 | steps:
15 | - uses: actions/checkout@v3
16 | - name: Build
17 | run: swiftc transcribe/main.swift -o transcriber
18 |
--------------------------------------------------------------------------------
/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | NSMicrophoneUsageDescription
6 | The app converts YOUR speech to text.
7 | CFBundleIdentifier
8 | dtinth.transcribe
9 | NSSpeechRecognitionUsageDescription
10 | The app converts speech to text.
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Xcode
2 | #
3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
4 |
5 | ## User settings
6 | xcuserdata/
7 |
8 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
9 | *.xcscmblueprint
10 | *.xccheckout
11 |
12 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
13 | build/
14 | DerivedData/
15 | *.moved-aside
16 | *.pbxuser
17 | !default.pbxuser
18 | *.mode1v3
19 | !default.mode1v3
20 | *.mode2v3
21 | !default.mode2v3
22 | *.perspectivev3
23 | !default.perspectivev3
24 |
25 | ## Gcc Patch
26 | /*.gcno
27 | transcriber
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # transcriber
2 |
3 | CLI tool for macOS that uses SFSpeechRecognizer to transcribe speech. The recognition result will be written to the standard output as JSON string. The input data should be sent to the standard input as **raw PCM, 16-bit signed integer, 16 kHz, mono**.
4 |
5 | 
6 |
7 | 
8 |
9 |
10 | ⚠️ 🚧 **WARNING:** 💩 code ahead 🚧 ⚠️
11 |
12 | ## HELP WANTED
13 |
14 | - There is no error handling here, sometimes it doesn’t work. I don’t know why.
15 |
16 | Some help would be appreciated.
17 |
18 | ## How to use
19 |
20 | Compile:
21 |
22 | ```
23 | swiftc -o transcriber transcribe/main.swift
24 | ```
25 |
26 | Install to `/usr/local/bin`:
27 |
28 | ```
29 | cp transcriber /usr/local/bin
30 | ```
31 |
32 | Make sure Dictation feature is enabled in your system preferences, easiest way to enable this is by enabling Siri.
33 |
34 | Then you can use it like this:
35 |
36 | ```
37 | rec -b 16 -c 1 -t raw -e signed-integer - rate 16000 | ./transcriber
38 | ```
39 |
40 | By default it will transcribe English speech.
41 |
42 | ## Change the language
43 |
44 | To change the language, you can provide a new language code as the first argument to the binary. For example, to use Thai, you can run:
45 |
46 | ```
47 | rec -b 16 -c 1 -t raw -e signed-integer - rate 16000 | ./transcriber th
48 | ```
49 |
50 | ## On-device recognition
51 |
52 | Some Mac models support on-device recognition for some language. To require on-device recognition, set the environment variable `TRANSCRIBE_ON_DEVICE_ONLY` to `1`:
53 |
54 | ```
55 | TRANSCRIBE_ON_DEVICE_ONLY=1
56 | ```
57 |
58 | The CLI will crash if the language is not supported on-device.
59 |
60 | ## Ideas
61 |
62 | - Turn this into an HTTP speech recognition server that streams out server-sent events, so other apps can integrate with it, I guess?
63 |
--------------------------------------------------------------------------------
/transcribe/main.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 | import Speech
3 | import AppKit
4 |
5 | let app = NSApplication.shared
6 |
7 | class AppDelegate: NSObject, NSApplicationDelegate {
8 | private var recognitionRequest: SFSpeechAudioBufferRecognitionRequest?
9 | private var recognitionTask: SFSpeechRecognitionTask?
10 |
11 | func applicationDidFinishLaunching(_ notification: Notification) {
12 | // get language from command line
13 | let args = CommandLine.arguments
14 | var locale = Locale(identifier: "en-US")
15 | if args.count > 1 {
16 | locale = Locale(identifier: args[1])
17 | }
18 |
19 | let speechRecognizer = SFSpeechRecognizer(locale: locale)
20 | SFSpeechRecognizer.requestAuthorization({ (authStatus: SFSpeechRecognizerAuthorizationStatus) in
21 | if authStatus != .authorized {
22 | fatalError("Speech recognition authorization not granted.")
23 | }
24 | self.recognitionRequest = SFSpeechAudioBufferRecognitionRequest()
25 |
26 | guard let guardedSpeechRecognizer = speechRecognizer else { fatalError("Unable to create a SpeechRecognizer object") }
27 | guard let recognitionRequest = self.recognitionRequest else { fatalError("Unable to create a SFSpeechAudioBufferRecognitionRequest object") }
28 | recognitionRequest.shouldReportPartialResults = true
29 | recognitionRequest.addsPunctuation = true
30 | if let onDeviceOnly = ProcessInfo.processInfo.environment["TRANSCRIBE_ON_DEVICE_ONLY"] {
31 | if onDeviceOnly == "1" {
32 | recognitionRequest.requiresOnDeviceRecognition = true
33 | }
34 | }
35 | self.recognitionTask = guardedSpeechRecognizer.recognitionTask(with: recognitionRequest) { result, error in
36 | var isFinal = false
37 | if let result = result {
38 | isFinal = result.isFinal
39 | var segmentsArray: [[Any]] = []
40 | for segment in result.bestTranscription.segments {
41 | let segmentDict: [Any] = [
42 | segment.substringRange.location,
43 | segment.substringRange.length,
44 | segment.confidence,
45 | segment.timestamp,
46 | segment.duration,
47 | ]
48 | segmentsArray.append(segmentDict)
49 | }
50 | let notification: [String: Any] = [
51 | "text": result.bestTranscription.formattedString,
52 | "segments": segmentsArray,
53 | "isFinal": result.isFinal,
54 | ]
55 | let jsonData = try! JSONSerialization.data(withJSONObject: notification)
56 | if let jsonString = String(data: jsonData, encoding: String.Encoding.utf8) {
57 | print(jsonString)
58 | fflush(stdout)
59 | }
60 | }
61 | if error != nil || isFinal {
62 | self.recognitionRequest = nil
63 | self.recognitionTask = nil
64 | if let error = error {
65 | fatalError(String(describing: error))
66 | }
67 | app.terminate(self)
68 | }
69 | }
70 | self.readAudioFromStandardInput()
71 | })
72 | }
73 |
74 | func readAudioFromStandardInput() {
75 | let stdinFileDescriptor = FileHandle.standardInput.fileDescriptor
76 | let ioChannel = DispatchIO(type: .stream, fileDescriptor: stdinFileDescriptor, queue: DispatchQueue.main) { (error) in
77 | if error != 0 {
78 | print("Error reading audio from standard input: \(error)")
79 | }
80 | }
81 | ioChannel.setLimit(lowWater: 1)
82 | ioChannel.setInterval(interval: .milliseconds(100))
83 | ioChannel.read(offset: 0, length: Int.max, queue: DispatchQueue.main) { (done, data, error) in
84 | if let data = data, !data.isEmpty {
85 | let format = AVAudioFormat(commonFormat: .pcmFormatInt16, sampleRate: 16000, channels: 1, interleaved: false)
86 | let audioBuffer = AVAudioPCMBuffer(pcmFormat: format!, frameCapacity: AVAudioFrameCount(data.count / 2))!
87 | audioBuffer.frameLength = audioBuffer.frameCapacity
88 | let audioBufferPointer = audioBuffer.int16ChannelData![0]
89 | data.withUnsafeBytes { bufferPointer in
90 | audioBufferPointer.initialize(from: bufferPointer, count: data.count / 2)
91 | }
92 | self.recognitionRequest?.append(audioBuffer)
93 | }
94 |
95 | if done {
96 | // Mark the end of the audio stream.
97 | self.recognitionRequest?.endAudio()
98 | }
99 | }
100 | ioChannel.resume()
101 | }
102 | }
103 |
104 | let delegate = AppDelegate()
105 | app.delegate = delegate
106 | app.run()
107 |
--------------------------------------------------------------------------------
/transcribe.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 55;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | F841ACB4270320DB00A449A6 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = F841ACB3270320DB00A449A6 /* main.swift */; };
11 | F841ACBD270321C300A449A6 /* Speech.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F841ACBC270321C300A449A6 /* Speech.framework */; platformFilter = maccatalyst; };
12 | F841ACBE27032CD400A449A6 /* Info.plist in CopyFiles */ = {isa = PBXBuildFile; fileRef = F841ACBA2703213000A449A6 /* Info.plist */; };
13 | /* End PBXBuildFile section */
14 |
15 | /* Begin PBXCopyFilesBuildPhase section */
16 | F841ACAE270320DB00A449A6 /* CopyFiles */ = {
17 | isa = PBXCopyFilesBuildPhase;
18 | buildActionMask = 12;
19 | dstPath = "";
20 | dstSubfolderSpec = 16;
21 | files = (
22 | F841ACBE27032CD400A449A6 /* Info.plist in CopyFiles */,
23 | );
24 | runOnlyForDeploymentPostprocessing = 0;
25 | };
26 | /* End PBXCopyFilesBuildPhase section */
27 |
28 | /* Begin PBXFileReference section */
29 | F841ACB0270320DB00A449A6 /* transcribe */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = transcribe; sourceTree = BUILT_PRODUCTS_DIR; };
30 | F841ACB3270320DB00A449A6 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; };
31 | F841ACBA2703213000A449A6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
32 | F841ACBC270321C300A449A6 /* Speech.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Speech.framework; path = System/Library/Frameworks/Speech.framework; sourceTree = SDKROOT; };
33 | /* End PBXFileReference section */
34 |
35 | /* Begin PBXFrameworksBuildPhase section */
36 | F841ACAD270320DB00A449A6 /* Frameworks */ = {
37 | isa = PBXFrameworksBuildPhase;
38 | buildActionMask = 2147483647;
39 | files = (
40 | F841ACBD270321C300A449A6 /* Speech.framework in Frameworks */,
41 | );
42 | runOnlyForDeploymentPostprocessing = 0;
43 | };
44 | /* End PBXFrameworksBuildPhase section */
45 |
46 | /* Begin PBXGroup section */
47 | F841ACA7270320DB00A449A6 = {
48 | isa = PBXGroup;
49 | children = (
50 | F841ACBA2703213000A449A6 /* Info.plist */,
51 | F841ACB2270320DB00A449A6 /* transcribe */,
52 | F841ACB1270320DB00A449A6 /* Products */,
53 | F841ACBB270321C300A449A6 /* Frameworks */,
54 | );
55 | sourceTree = "";
56 | };
57 | F841ACB1270320DB00A449A6 /* Products */ = {
58 | isa = PBXGroup;
59 | children = (
60 | F841ACB0270320DB00A449A6 /* transcribe */,
61 | );
62 | name = Products;
63 | sourceTree = "";
64 | };
65 | F841ACB2270320DB00A449A6 /* transcribe */ = {
66 | isa = PBXGroup;
67 | children = (
68 | F841ACB3270320DB00A449A6 /* main.swift */,
69 | );
70 | path = transcribe;
71 | sourceTree = "";
72 | };
73 | F841ACBB270321C300A449A6 /* Frameworks */ = {
74 | isa = PBXGroup;
75 | children = (
76 | F841ACBC270321C300A449A6 /* Speech.framework */,
77 | );
78 | name = Frameworks;
79 | sourceTree = "";
80 | };
81 | /* End PBXGroup section */
82 |
83 | /* Begin PBXNativeTarget section */
84 | F841ACAF270320DB00A449A6 /* transcribe */ = {
85 | isa = PBXNativeTarget;
86 | buildConfigurationList = F841ACB7270320DB00A449A6 /* Build configuration list for PBXNativeTarget "transcribe" */;
87 | buildPhases = (
88 | F841ACAC270320DB00A449A6 /* Sources */,
89 | F841ACAD270320DB00A449A6 /* Frameworks */,
90 | F841ACAE270320DB00A449A6 /* CopyFiles */,
91 | );
92 | buildRules = (
93 | );
94 | dependencies = (
95 | );
96 | name = transcribe;
97 | productName = transcribe;
98 | productReference = F841ACB0270320DB00A449A6 /* transcribe */;
99 | productType = "com.apple.product-type.tool";
100 | };
101 | /* End PBXNativeTarget section */
102 |
103 | /* Begin PBXProject section */
104 | F841ACA8270320DB00A449A6 /* Project object */ = {
105 | isa = PBXProject;
106 | attributes = {
107 | BuildIndependentTargetsInParallel = 1;
108 | LastSwiftUpdateCheck = 1300;
109 | LastUpgradeCheck = 1300;
110 | TargetAttributes = {
111 | F841ACAF270320DB00A449A6 = {
112 | CreatedOnToolsVersion = 13.0;
113 | };
114 | };
115 | };
116 | buildConfigurationList = F841ACAB270320DB00A449A6 /* Build configuration list for PBXProject "transcribe" */;
117 | compatibilityVersion = "Xcode 13.0";
118 | developmentRegion = en;
119 | hasScannedForEncodings = 0;
120 | knownRegions = (
121 | en,
122 | Base,
123 | );
124 | mainGroup = F841ACA7270320DB00A449A6;
125 | productRefGroup = F841ACB1270320DB00A449A6 /* Products */;
126 | projectDirPath = "";
127 | projectRoot = "";
128 | targets = (
129 | F841ACAF270320DB00A449A6 /* transcribe */,
130 | );
131 | };
132 | /* End PBXProject section */
133 |
134 | /* Begin PBXSourcesBuildPhase section */
135 | F841ACAC270320DB00A449A6 /* Sources */ = {
136 | isa = PBXSourcesBuildPhase;
137 | buildActionMask = 2147483647;
138 | files = (
139 | F841ACB4270320DB00A449A6 /* main.swift in Sources */,
140 | );
141 | runOnlyForDeploymentPostprocessing = 0;
142 | };
143 | /* End PBXSourcesBuildPhase section */
144 |
145 | /* Begin XCBuildConfiguration section */
146 | F841ACB5270320DB00A449A6 /* Debug */ = {
147 | isa = XCBuildConfiguration;
148 | buildSettings = {
149 | ALWAYS_SEARCH_USER_PATHS = NO;
150 | CLANG_ANALYZER_NONNULL = YES;
151 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
152 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
153 | CLANG_CXX_LIBRARY = "libc++";
154 | CLANG_ENABLE_MODULES = YES;
155 | CLANG_ENABLE_OBJC_ARC = YES;
156 | CLANG_ENABLE_OBJC_WEAK = YES;
157 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
158 | CLANG_WARN_BOOL_CONVERSION = YES;
159 | CLANG_WARN_COMMA = YES;
160 | CLANG_WARN_CONSTANT_CONVERSION = YES;
161 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
162 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
163 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
164 | CLANG_WARN_EMPTY_BODY = YES;
165 | CLANG_WARN_ENUM_CONVERSION = YES;
166 | CLANG_WARN_INFINITE_RECURSION = YES;
167 | CLANG_WARN_INT_CONVERSION = YES;
168 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
169 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
170 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
171 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
172 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
173 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
174 | CLANG_WARN_STRICT_PROTOTYPES = YES;
175 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
176 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
177 | CLANG_WARN_UNREACHABLE_CODE = YES;
178 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
179 | COPY_PHASE_STRIP = NO;
180 | DEBUG_INFORMATION_FORMAT = dwarf;
181 | ENABLE_STRICT_OBJC_MSGSEND = YES;
182 | ENABLE_TESTABILITY = YES;
183 | GCC_C_LANGUAGE_STANDARD = gnu11;
184 | GCC_DYNAMIC_NO_PIC = NO;
185 | GCC_NO_COMMON_BLOCKS = YES;
186 | GCC_OPTIMIZATION_LEVEL = 0;
187 | GCC_PREPROCESSOR_DEFINITIONS = (
188 | "DEBUG=1",
189 | "$(inherited)",
190 | );
191 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
192 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
193 | GCC_WARN_UNDECLARED_SELECTOR = YES;
194 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
195 | GCC_WARN_UNUSED_FUNCTION = YES;
196 | GCC_WARN_UNUSED_VARIABLE = YES;
197 | MACOSX_DEPLOYMENT_TARGET = 11.3;
198 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
199 | MTL_FAST_MATH = YES;
200 | ONLY_ACTIVE_ARCH = YES;
201 | SDKROOT = macosx;
202 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
203 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
204 | };
205 | name = Debug;
206 | };
207 | F841ACB6270320DB00A449A6 /* Release */ = {
208 | isa = XCBuildConfiguration;
209 | buildSettings = {
210 | ALWAYS_SEARCH_USER_PATHS = NO;
211 | CLANG_ANALYZER_NONNULL = YES;
212 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
213 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
214 | CLANG_CXX_LIBRARY = "libc++";
215 | CLANG_ENABLE_MODULES = YES;
216 | CLANG_ENABLE_OBJC_ARC = YES;
217 | CLANG_ENABLE_OBJC_WEAK = YES;
218 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
219 | CLANG_WARN_BOOL_CONVERSION = YES;
220 | CLANG_WARN_COMMA = YES;
221 | CLANG_WARN_CONSTANT_CONVERSION = YES;
222 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
223 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
224 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
225 | CLANG_WARN_EMPTY_BODY = YES;
226 | CLANG_WARN_ENUM_CONVERSION = YES;
227 | CLANG_WARN_INFINITE_RECURSION = YES;
228 | CLANG_WARN_INT_CONVERSION = YES;
229 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
230 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
231 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
232 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
233 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
234 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
235 | CLANG_WARN_STRICT_PROTOTYPES = YES;
236 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
237 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
238 | CLANG_WARN_UNREACHABLE_CODE = YES;
239 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
240 | COPY_PHASE_STRIP = NO;
241 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
242 | ENABLE_NS_ASSERTIONS = NO;
243 | ENABLE_STRICT_OBJC_MSGSEND = YES;
244 | GCC_C_LANGUAGE_STANDARD = gnu11;
245 | GCC_NO_COMMON_BLOCKS = YES;
246 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
247 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
248 | GCC_WARN_UNDECLARED_SELECTOR = YES;
249 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
250 | GCC_WARN_UNUSED_FUNCTION = YES;
251 | GCC_WARN_UNUSED_VARIABLE = YES;
252 | MACOSX_DEPLOYMENT_TARGET = 11.3;
253 | MTL_ENABLE_DEBUG_INFO = NO;
254 | MTL_FAST_MATH = YES;
255 | SDKROOT = macosx;
256 | SWIFT_COMPILATION_MODE = wholemodule;
257 | SWIFT_OPTIMIZATION_LEVEL = "-O";
258 | };
259 | name = Release;
260 | };
261 | F841ACB8270320DB00A449A6 /* Debug */ = {
262 | isa = XCBuildConfiguration;
263 | buildSettings = {
264 | CODE_SIGN_STYLE = Automatic;
265 | MACOSX_DEPLOYMENT_TARGET = 13.0;
266 | PRODUCT_NAME = "$(TARGET_NAME)";
267 | SWIFT_VERSION = 5.0;
268 | };
269 | name = Debug;
270 | };
271 | F841ACB9270320DB00A449A6 /* Release */ = {
272 | isa = XCBuildConfiguration;
273 | buildSettings = {
274 | CODE_SIGN_STYLE = Automatic;
275 | MACOSX_DEPLOYMENT_TARGET = 13.0;
276 | PRODUCT_NAME = "$(TARGET_NAME)";
277 | SWIFT_VERSION = 5.0;
278 | };
279 | name = Release;
280 | };
281 | /* End XCBuildConfiguration section */
282 |
283 | /* Begin XCConfigurationList section */
284 | F841ACAB270320DB00A449A6 /* Build configuration list for PBXProject "transcribe" */ = {
285 | isa = XCConfigurationList;
286 | buildConfigurations = (
287 | F841ACB5270320DB00A449A6 /* Debug */,
288 | F841ACB6270320DB00A449A6 /* Release */,
289 | );
290 | defaultConfigurationIsVisible = 0;
291 | defaultConfigurationName = Release;
292 | };
293 | F841ACB7270320DB00A449A6 /* Build configuration list for PBXNativeTarget "transcribe" */ = {
294 | isa = XCConfigurationList;
295 | buildConfigurations = (
296 | F841ACB8270320DB00A449A6 /* Debug */,
297 | F841ACB9270320DB00A449A6 /* Release */,
298 | );
299 | defaultConfigurationIsVisible = 0;
300 | defaultConfigurationName = Release;
301 | };
302 | /* End XCConfigurationList section */
303 | };
304 | rootObject = F841ACA8270320DB00A449A6 /* Project object */;
305 | }
306 |
--------------------------------------------------------------------------------