Skip to content

Commit b127ab2

Browse files
committed
Clean up some things from the Speech demo. (#1214)
1 parent 311c2ac commit b127ab2

File tree

4 files changed

+22
-34
lines changed

4 files changed

+22
-34
lines changed

Examples/SpeechRecognition/SpeechRecognition/SpeechClient/Client.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import Speech
44

55
struct SpeechClient {
66
var finishTask: () -> Effect<Never, Never>
7-
var recognitionTask: (SFSpeechAudioBufferRecognitionRequest) -> Effect<Action, Error>
7+
var recognitionTask: (SFSpeechAudioBufferRecognitionRequest) -> Effect<SpeechRecognitionResult, Error>
88
var requestAuthorization: () -> Effect<SFSpeechRecognizerAuthorizationStatus, Never>
99

1010
enum Action: Equatable {

Examples/SpeechRecognition/SpeechRecognition/SpeechClient/Live.swift

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,11 @@ extension SpeechClient {
1919
recognitionTask: { request in
2020
Effect { subscriber, lifetime in
2121
let speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: "en-US"))!
22-
let speechRecognizerDelegate = SpeechRecognizerDelegate(
23-
availabilityDidChange: { available in
24-
subscriber.send(value: .availabilityDidChange(isAvailable: available))
25-
}
26-
)
27-
speechRecognizer.delegate = speechRecognizerDelegate
28-
2922
let cancellable = AnyDisposable {
3023
audioEngine?.stop()
3124
inputNode?.removeTap(onBus: 0)
3225
recognitionTask?.cancel()
3326
_ = speechRecognizer
34-
_ = speechRecognizerDelegate
3527
}
3628

3729
lifetime += cancellable
@@ -50,7 +42,7 @@ extension SpeechClient {
5042
recognitionTask = speechRecognizer.recognitionTask(with: request) { result, error in
5143
switch (result, error) {
5244
case let (.some(result), _):
53-
subscriber.send(value: .taskResult(SpeechRecognitionResult(result)))
45+
subscriber.send(value: SpeechRecognitionResult(result))
5446
case (_, .some):
5547
subscriber.send(error: .taskError)
5648
case (.none, .none):

Examples/SpeechRecognition/SpeechRecognition/SpeechRecognition.swift

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ struct AppState: Equatable {
1919
enum AppAction: Equatable {
2020
case dismissAuthorizationStateAlert
2121
case recordButtonTapped
22-
case speech(Result<SpeechClient.Action, SpeechClient.Error>)
22+
case speech(Result<SpeechRecognitionResult, SpeechClient.Error>)
2323
case speechRecognizerAuthorizationStatusResponse(SFSpeechRecognizerAuthorizationStatus)
2424
}
2525

@@ -50,10 +50,7 @@ let appReducer = Reducer<AppState, AppAction, AppEnvironment> { state, action, e
5050
.fireAndForget()
5151
}
5252

53-
case let .speech(.success(.availabilityDidChange(isAvailable))):
54-
return .none
55-
56-
case let .speech(.success(.taskResult(result))):
53+
case let .speech(.success(result)):
5754
state.transcribedText = result.bestTranscription.formattedString
5855
if result.isFinal {
5956
return environment.speechClient.finishTask()
@@ -188,30 +185,29 @@ extension SpeechClient {
188185
"""
189186
var text = ""
190187

191-
return .run { subscriber in
192-
return Timer.publish(every: 0.33, on: .main, in: .default)
193-
.autoconnect()
194-
.prefix { _ in !finalText.isEmpty && isRunning }
195-
.sink { _ in
188+
return Effect { subscriber, lifetime in
189+
let disposable = Effect.timer(interval: .milliseconds(330), on: QueueScheduler.main)
190+
.take(while: { _ in !finalText.isEmpty && isRunning })
191+
.startWithValues { _ in
196192
let word = finalText.prefix { $0 != " " }
197193
finalText.removeFirst(word.count)
198194
if finalText.first == " " {
199195
finalText.removeFirst()
200196
}
201197
text += word + " "
202198
subscriber.send(
203-
.taskResult(
204-
.init(
205-
bestTranscription: .init(
206-
formattedString: text,
207-
segments: []
208-
),
209-
isFinal: false,
210-
transcriptions: []
211-
)
199+
value: .init(
200+
bestTranscription: .init(
201+
formattedString: text,
202+
segments: []
203+
),
204+
isFinal: false,
205+
transcriptions: []
212206
)
213207
)
214208
}
209+
210+
lifetime += disposable
215211
}
216212
},
217213
requestAuthorization: {

Examples/SpeechRecognition/SpeechRecognitionTests/SpeechRecognitionTests.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import XCTest
55
@testable import SpeechRecognition
66

77
class SpeechRecognitionTests: XCTestCase {
8-
let recognitionTaskSubject = Signal<SpeechClient.Action, SpeechClient.Error>.pipe()
8+
let recognitionTaskSubject = Signal<SpeechRecognitionResult, SpeechClient.Error>.pipe()
99

1010
func testDenyAuthorization() {
1111
var speechClient = SpeechClient.unimplemented
@@ -96,13 +96,13 @@ class SpeechRecognitionTests: XCTestCase {
9696
$0.speechRecognizerAuthorizationStatus = .authorized
9797
}
9898

99-
self.recognitionTaskSubject.input.send(value: .taskResult(result))
100-
store.receive(.speech(.success(.taskResult(result)))) {
99+
self.recognitionTaskSubject.input.send(value: result)
100+
store.receive(.speech(.success(result))) {
101101
$0.transcribedText = "Hello"
102102
}
103103

104-
self.recognitionTaskSubject.input.send(value: .taskResult(finalResult))
105-
store.receive(.speech(.success(.taskResult(finalResult)))) {
104+
self.recognitionTaskSubject.input.send(value: finalResult)
105+
store.receive(.speech(.success(finalResult))) {
106106
$0.transcribedText = "Hello world"
107107
}
108108
}

0 commit comments

Comments
 (0)