├── 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 | ![Example screenshot](example.png) 6 | 7 | ![image](https://github.com/dtinth/transcribe/assets/193136/c1cd073b-fd3c-4829-84ff-a2df39d194a6) 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 | --------------------------------------------------------------------------------