diff --git a/keyBoard/Class/AiTalk/VM/ASRStreamClient.m b/keyBoard/Class/AiTalk/VM/ASRStreamClient.m index 218fb8a..06c33cd 100644 --- a/keyBoard/Class/AiTalk/VM/ASRStreamClient.m +++ b/keyBoard/Class/AiTalk/VM/ASRStreamClient.m @@ -32,7 +32,7 @@ } - (void)dealloc { - [self cancel]; + [self cancelInternal]; } #pragma mark - Public Methods diff --git a/keyBoard/Class/AiTalk/VM/DeepgramStreamingManager.m b/keyBoard/Class/AiTalk/VM/DeepgramStreamingManager.m index 4658813..e4991e5 100644 --- a/keyBoard/Class/AiTalk/VM/DeepgramStreamingManager.m +++ b/keyBoard/Class/AiTalk/VM/DeepgramStreamingManager.m @@ -52,8 +52,9 @@ static NSString *const kDeepgramStreamingManagerErrorDomain = _audioCapture = [[AudioCaptureManager alloc] init]; _audioCapture.delegate = self; - _client = [[DeepgramWebSocketClient alloc] init]; - _client.delegate = self; + /// 不需要自己处理音频转文本,改为录音结束把文件传递给后端 +// _client = [[DeepgramWebSocketClient alloc] init]; +// _client.delegate = self; _serverURL = @"wss://api.deepgram.com/v1/listen"; _encoding = @"linear16"; @@ -81,7 +82,7 @@ static NSString *const kDeepgramStreamingManagerErrorDomain = - (void)dealloc { [self removeNotifications]; - [self disconnect]; + [self disconnectInternal]; } - (void)start { @@ -203,21 +204,25 @@ static NSString *const kDeepgramStreamingManagerErrorDomain = - (void)disconnect { dispatch_async(self.stateQueue, ^{ - if (self.streaming) { - [self.audioCapture stopCapture]; - self.streaming = NO; - } - [self.pendingFrames removeAllObjects]; - self.pendingStart = NO; - self.keepConnection = NO; - self.shouldReconnectOnForeground = NO; - [self.client disableAudioSending]; - [self stopKeepAlive]; - [self.client disconnect]; - [self.audioSession deactivateSession]; + [self disconnectInternal]; }); } +- (void)disconnectInternal { + if (self.streaming) { + [self.audioCapture stopCapture]; + self.streaming = NO; + } + [self.pendingFrames removeAllObjects]; + self.pendingStart = NO; + self.keepConnection = NO; + self.shouldReconnectOnForeground = NO; + [self.client disableAudioSending]; + [self stopKeepAlive]; + [self.client disconnect]; + [self.audioSession deactivateSession]; +} + #pragma mark - AudioCaptureManagerDelegate - (void)audioCaptureManagerDidOutputPCMFrame:(NSData *)pcmFrame { diff --git a/keyBoard/Class/AiTalk/VM/DeepgramWebSocketClient.m b/keyBoard/Class/AiTalk/VM/DeepgramWebSocketClient.m index a9ec157..fb400a8 100644 --- a/keyBoard/Class/AiTalk/VM/DeepgramWebSocketClient.m +++ b/keyBoard/Class/AiTalk/VM/DeepgramWebSocketClient.m @@ -40,7 +40,7 @@ static NSString *const kDeepgramWebSocketClientErrorDomain = } - (void)dealloc { - [self disconnect]; + [self disconnectInternal]; } #pragma mark - Public Methods @@ -124,14 +124,14 @@ static NSString *const kDeepgramWebSocketClientErrorDomain = - (void)finish { NSLog(@"[DeepgramWebSocketClient] Sending CloseStream"); - [self sendJSON:@{ @"type" : @"CloseStream" }]; + [self sendJSON:@{@"type" : @"CloseStream"}]; } - (void)sendKeepAlive { if (!self.connected || !self.webSocketTask) { return; } - [self sendJSON:@{ @"type" : @"KeepAlive" }]; + [self sendJSON:@{@"type" : @"KeepAlive"}]; } - (void)enableAudioSending { @@ -165,24 +165,24 @@ static NSString *const kDeepgramWebSocketClientErrorDomain = [self upsertQueryItemWithName:@"model" value:self.model items:items]; [self upsertQueryItemWithName:@"language" value:self.language items:items]; - [self upsertQueryItemWithName:@"punctuate" - value:(self.punctuate ? @"true" : @"false") - items:items]; + [self + upsertQueryItemWithName:@"punctuate" + value:(self.punctuate ? @"true" : @"false")items:items]; [self upsertQueryItemWithName:@"smart_format" - value:(self.smartFormat ? @"true" : @"false") - items:items]; + value:(self.smartFormat ? @"true" : @"false")items + :items]; [self upsertQueryItemWithName:@"interim_results" - value:(self.interimResults ? @"true" : @"false") - items:items]; + value:(self.interimResults ? @"true" : @"false")items + :items]; [self upsertQueryItemWithName:@"encoding" value:self.encoding items:items]; [self upsertQueryItemWithName:@"sample_rate" - value:[NSString stringWithFormat:@"%.0f", - self.sampleRate] - items:items]; + value:[NSString + stringWithFormat:@"%.0f", self.sampleRate] + items:items]; [self upsertQueryItemWithName:@"channels" - value:[NSString stringWithFormat:@"%d", self.channels] - items:items]; + value:[NSString stringWithFormat:@"%d", self.channels] + items:items]; components.queryItems = items; return components.URL; @@ -220,9 +220,8 @@ static NSString *const kDeepgramWebSocketClientErrorDomain = return; } - NSString *jsonString = - [[NSString alloc] initWithData:jsonData - encoding:NSUTF8StringEncoding]; + NSString *jsonString = [[NSString alloc] initWithData:jsonData + encoding:NSUTF8StringEncoding]; if (!jsonString) { [self reportErrorWithMessage:@"Failed to encode JSON message"]; return; @@ -231,13 +230,12 @@ static NSString *const kDeepgramWebSocketClientErrorDomain = dispatch_async(self.networkQueue, ^{ NSURLSessionWebSocketMessage *message = [[NSURLSessionWebSocketMessage alloc] initWithString:jsonString]; - [self.webSocketTask - sendMessage:message - completionHandler:^(NSError *_Nullable error) { - if (error) { - [self reportError:error]; - } - }]; + [self.webSocketTask sendMessage:message + completionHandler:^(NSError *_Nullable error) { + if (error) { + [self reportError:error]; + } + }]; }); } @@ -307,14 +305,15 @@ static NSString *const kDeepgramWebSocketClientErrorDomain = } NSArray *alternatives = channel[@"alternatives"]; - if (![alternatives isKindOfClass:[NSArray class]] || alternatives.count == 0) { + if (![alternatives isKindOfClass:[NSArray class]] || + alternatives.count == 0) { return; } NSDictionary *firstAlt = alternatives.firstObject; NSString *transcript = firstAlt[@"transcript"] ?: @""; - BOOL isFinal = [json[@"is_final"] boolValue] || - [json[@"speech_final"] boolValue]; + BOOL isFinal = + [json[@"is_final"] boolValue] || [json[@"speech_final"] boolValue]; if (transcript.length == 0) { return; @@ -364,11 +363,10 @@ static NSString *const kDeepgramWebSocketClientErrorDomain = } - (void)reportErrorWithMessage:(NSString *)message { - NSError *error = [NSError errorWithDomain:kDeepgramWebSocketClientErrorDomain - code:-1 - userInfo:@{ - NSLocalizedDescriptionKey : message ?: @"" - }]; + NSError *error = + [NSError errorWithDomain:kDeepgramWebSocketClientErrorDomain + code:-1 + userInfo:@{NSLocalizedDescriptionKey : message ?: @""}]; [self reportError:error]; } @@ -376,8 +374,8 @@ static NSString *const kDeepgramWebSocketClientErrorDomain = self.connected = NO; dispatch_async(dispatch_get_main_queue(), ^{ - if ([self.delegate respondsToSelector:@selector - (deepgramClientDidDisconnect:)]) { + if ([self.delegate + respondsToSelector:@selector(deepgramClientDidDisconnect:)]) { [self.delegate deepgramClientDidDisconnect:error]; } }); @@ -391,7 +389,8 @@ static NSString *const kDeepgramWebSocketClientErrorDomain = self.connected = YES; NSLog(@"[DeepgramWebSocketClient] Connected"); dispatch_async(dispatch_get_main_queue(), ^{ - if ([self.delegate respondsToSelector:@selector(deepgramClientDidConnect)]) { + if ([self.delegate + respondsToSelector:@selector(deepgramClientDidConnect)]) { [self.delegate deepgramClientDidConnect]; } }); @@ -404,8 +403,7 @@ static NSString *const kDeepgramWebSocketClientErrorDomain = if (!self.webSocketTask) { return; } - NSLog(@"[DeepgramWebSocketClient] Closed with code: %ld", - (long)closeCode); + NSLog(@"[DeepgramWebSocketClient] Closed with code: %ld", (long)closeCode); [self notifyDisconnect:nil]; [self disconnectInternal]; } diff --git a/keyBoard/Class/AiTalk/VM/VoiceChatStreamingManager.m b/keyBoard/Class/AiTalk/VM/VoiceChatStreamingManager.m index ad078f7..f068b93 100644 --- a/keyBoard/Class/AiTalk/VM/VoiceChatStreamingManager.m +++ b/keyBoard/Class/AiTalk/VM/VoiceChatStreamingManager.m @@ -55,7 +55,7 @@ static NSString *const kVoiceChatStreamingManagerErrorDomain = } - (void)dealloc { - [self disconnect]; + [self disconnectInternal]; } - (void)setServerURL:(NSString *)serverURL { @@ -102,17 +102,21 @@ static NSString *const kVoiceChatStreamingManagerErrorDomain = - (void)disconnect { dispatch_async(self.stateQueue, ^{ - if (self.streaming) { - [self.audioCapture stopCapture]; - self.streaming = NO; - } - [self.webSocketClient disableAudioSending]; - [self.webSocketClient disconnect]; - [self.audioSession deactivateSession]; - self.sessionId = nil; + [self disconnectInternal]; }); } +- (void)disconnectInternal { + if (self.streaming) { + [self.audioCapture stopCapture]; + self.streaming = NO; + } + [self.webSocketClient disableAudioSending]; + [self.webSocketClient disconnect]; + [self.audioSession deactivateSession]; + self.sessionId = nil; +} + #pragma mark - Private Methods - (void)startInternal { diff --git a/keyBoard/Class/AiTalk/VM/VoiceChatWebSocketClient.m b/keyBoard/Class/AiTalk/VM/VoiceChatWebSocketClient.m index dcb194a..27e4ba6 100644 --- a/keyBoard/Class/AiTalk/VM/VoiceChatWebSocketClient.m +++ b/keyBoard/Class/AiTalk/VM/VoiceChatWebSocketClient.m @@ -35,7 +35,7 @@ static NSString *const kVoiceChatWebSocketClientErrorDomain = } - (void)dealloc { - [self disconnect]; + [self disconnectInternal]; } #pragma mark - Public Methods