1

我要发展,应支持语音到文本和文本到语音应用程序,文本到语音和语音到文本识别 - >自我 - 识别正在发生

我)语音到文本 - 程序 - 我有使用语音框架语音到文本,每当我打开一个应用程序,如果我开始说话,应用程序应该识别语音,并应该将语音转换为文本。这是工作

ii)文本到语音 - 过程 - 我有使用AVFoundation和MediaPlayer库如果用户按下播放按钮,它应该将文本,即任何出现在屏幕上的语音转换为语音。现在开始工作。

这里是现在面临 在处理文本到语音的问题,语音识别识别播放语音和文本中重新打印的话。

例 - 如果我说“你好早安”它是在文本框中打印,然后,如果我按下播放按钮,它在播放语音你好早上好,但在这个时候讲话文本中识别认识到这一点的声音,我意思是自我认同,它的打印“你好早安您好早安

我想停止语音到文本过程,同时处理文本到语音

对于这一点,我已经停止语音识别要求,而玩讲话 这里是代码,

@implementation ViewController 
{ 
SFSpeechAudioBufferRecognitionRequest *recognitionRequest; 
SFSpeechRecognitionTask *recognitionTask; 
AVAudioEngine *audioEngine; 
NSMutableArray *speechStringsArray; 
BOOL SpeechToText; 
NSString* resultString; 
NSString *str ; 
NSString *searchString; 
NSString *textToSpeak; 
} 

- (void)viewDidLoad { 
[super viewDidLoad]; 

//Speech To Text **** 

speechStringsArray = [[NSMutableArray alloc]init]; 

// Initialize background audio session 
NSError *error = NULL; 
AVAudioSession *session = [AVAudioSession sharedInstance]; 
[session setCategory:AVAudioSessionCategoryPlayback error:&error]; 
if(error) { 
    NSLog(@"@error: %@", error); 
} 
[session setActive:YES error:&error]; 
if (error) { 
    NSLog(@"@error: %@", error); 
} 

// Enabled remote controls 
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 

// Voice setup 
self.voicePicker.delegate = self; 
self.voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"en-us"]; 
self.voices = [NSMutableArray arrayWithObjects: 
       @{@"voice" : @"en-us", @"label" : @"American English (Female)"}, 
       @{@"voice" : @"en-au", @"label" : @"Australian English (Female)"}, 
       @{@"voice" : @"en-gb", @"label" : @"British English (Male)"}, 
       @{@"voice" : @"en-ie", @"label" : @"Irish English (Female)"}, 
       @{@"voice" : @"en-za", @"label" : @"South African English (Female)"}, 
       nil]; 

// Synthesizer setup 
self.synthesizer = [[AVSpeechSynthesizer alloc] init]; 
self.synthesizer.delegate = self; 

// UITextView delegate 
self.textView.delegate = self; 

// This notifcation is generated from the AppDelegate applicationDidBecomeActive method to make sure that if the play or pause button is updated in the background then the button will be updated in the toolbar 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateToolbar) name:@"updateToolbar" object:nil]; 
    } 


-(void)viewDidAppear:(BOOL)animated 
{ 

self.speechRecognizer = [[SFSpeechRecognizer alloc]initWithLocale:[NSLocale localeWithLocaleIdentifier:@"en-US en-UK"]]; 

self.speechRecognizer.delegate = self; 
audioEngine = [[AVAudioEngine alloc]init]; 
[SFSpeechRecognizer requestAuthorization:^(SFSpeechRecognizerAuthorizationStatus authStatus) { 
    switch (authStatus) { 
     case SFSpeechRecognizerAuthorizationStatusAuthorized: 
      //User gave access to speech recognition 
      NSLog(@"Authorized"); 

      [self start_record]; 

      break; 

     case SFSpeechRecognizerAuthorizationStatusDenied: 
      //User denied access to speech recognition 
      NSLog(@"AuthorizationStatusDenied"); 

      break; 

     case SFSpeechRecognizerAuthorizationStatusRestricted: 
      //Speech recognition restricted on this device 
      NSLog(@"AuthorizationStatusRestricted"); 

      break; 

     case SFSpeechRecognizerAuthorizationStatusNotDetermined: 
      //Speech recognition not yet authorized 

      break; 

     default: 
      NSLog(@"Default"); 
      break; 
    } 
}]; 

//MARK : Interface Builder Actions 

    } 

****编码增加的速度和间距****

- (IBAction)handleSpeedStepper:(UIStepper *)sender 
    { 
double speedValue = self.speedStepper.value; 
[self.speedValueLabel setText:[NSString stringWithFormat:@"%.1f", speedValue]]; 
    } 

    - (IBAction)handlePitchStepper:(UIStepper *)sender 
    { 
double pitchValue = self.pitchStepper.value; 
[self.pitchValueLabel setText:[NSString stringWithFormat:@"%.1f", pitchValue]]; 
    } 

//播放按钮,文本到语音 - (IBAction为)handlePlayPauseButton:(的UIBarButtonItem *)发件人 {

if (self.synthesizer.speaking && !self.synthesizer.paused) { 
    if (self.pauseSettingSegmentedControl.selectedSegmentIndex == 0) { 
     // Stop immediately 
     [self.synthesizer pauseSpeakingAtBoundary:AVSpeechBoundaryImmediate]; 
    } 
    else { 
     // Stop at end of current word 
     [self.synthesizer pauseSpeakingAtBoundary:AVSpeechBoundaryWord]; 

    } 
    [self updateToolbarWithButton:@"play"]; 
    } 
    else if (self.synthesizer.paused) { 
    [self.synthesizer continueSpeaking]; 
    [self updateToolbarWithButton:@"pause"]; 
    } 
    else { 
    [self speakUtterance]; 
    [self updateToolbarWithButton:@"pause"]; 
    } 
    } 

//用于语音到文本方法- (无效){START_RECORD

NSError * outError; 
    AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 
    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&outError]; 

    [audioSession setMode:AVAudioSessionModeMeasurement error:&outError]; 
    [audioSession setActive:YES withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&outError]; 
recognitionRequest = [[SFSpeechAudioBufferRecognitionRequest alloc]init]; 
AVAudioInputNode *inputNode = audioEngine.inputNode; 

    if (recognitionRequest == nil) { 
    NSLog(@"Unable to created a SFSpeechAudioBufferRecognitionRequest object"); 
    } 
    if (inputNode == nil) { 
    NSLog(@"Audio engine has no input node ");} 

    //configure request so that results are returned before audio recording is finished 
    [recognitionRequest setShouldReportPartialResults:YES]; 
    // A recognition task represents a speech recognition session. 
    //We keep a reference to the task so that it can be cancelled . 


    recognitionTask = [self.speechRecognizer recognitionTaskWithRequest:recognitionRequest resultHandler:^(SFSpeechRecognitionResult * result, NSError * error1) { 

    BOOL isFinal = false; 

    if ((result = result)) { 


     NSString *speech = result.bestTranscription.formattedString; 
     NSLog(@"the speech:%@",speech); 

     // coding for fixing append string issue 
     for (int i = 0 ;i <speechStringsArray.count;i++) 
     { 

      str = [speechStringsArray objectAtIndex:i]; 

      NSRange range = [speech rangeOfString:str options:NSCaseInsensitiveSearch]; 
      NSLog(@"found: %@", (range.location != NSNotFound) ? @"Yes" : @"No"); 

      if (range.location != NSNotFound) { 

       resultString = [speech stringByReplacingCharactersInRange:range withString:@""]; 

       speech = resultString; 

       NSLog(@" the result is : %@",resultString); 

      } 

     } 

     //specific functions - space for second word 
     if (resultString.length>0) { 

      self.textView.text = [NSString stringWithFormat:@"%@%@",self.textView.text,resultString]; 


       [speechStringsArray addObject:resultString];  } 

     //specific function space for first word -Working fine 
     else 
     { 
      [speechStringsArray addObject:speech]; 
       self.textView.text = speech; 

      } 


     } 

     NSLog(@" array %@",speechStringsArray); 


     isFinal = result.isFinal; 

    } 


    if (error1 != nil || isFinal) { 

     [audioEngine stop]; 
     [inputNode removeTapOnBus:0]; 
     recognitionRequest = nil; 
     recognitionTask = nil; 

     [self start_record]; 

     }}]; 

     AVAudioFormat *recordingFormat = [inputNode outputFormatForBus:0]; 
     [inputNode installTapOnBus:0 bufferSize:1024 format:recordingFormat block:^(AVAudioPCMBuffer * _Nonnull buffer, AVAudioTime * _Nonnull when){ 
     [recognitionRequest appendAudioPCMBuffer:buffer];} 
]; 
     NSError *error1; 
     [audioEngine prepare]; 
     [audioEngine startAndReturnError:&error1];} 

     - (void)speakUtterance 
     { 
     NSLog(@"speakUtterance"); 
     didStartSpeaking = NO; 
     textToSpeak = [NSString stringWithFormat:@"%@", self.textView.text]; 
     AVSpeechUtterance *utterance = [[AVSpeechUtterance alloc] initWithString:textToSpeak]; 
     utterance.rate = self.speedStepper.value; 
     utterance.pitchMultiplier = self.pitchStepper.value; 
     utterance.voice = self.voice; 
     [self.synthesizer speakUtterance:utterance]; 
     [self displayBackgroundMediaFields]; 
     } 

     - (void)displayBackgroundMediaFields 
     { 
     MPMediaItemArtwork *artwork = [[MPMediaItemArtwork alloc] initWithImage:[UIImage imageNamed:@"Play"]]; 

     NSDictionary *info = @{ MPMediaItemPropertyTitle: self.textView.text, 
         MPMediaItemPropertyAlbumTitle: @"TextToSpeech App", 
         MPMediaItemPropertyArtwork: artwork}; 

     [MPNowPlayingInfoCenter defaultCenter].nowPlayingInfo = info; 
     } 

     - (void)updateToolbar 
     { 
     if (self.synthesizer.speaking && !self.synthesizer.paused) { 
     [self updateToolbarWithButton:@"pause"]; 
     } 
     else { 
    [self updateToolbarWithButton:@"play"]; 
    }} 

    - (void)updateToolbarWithButton:(NSString *)buttonType 
    { 

    //stopping the speech to text process 
    if (audioEngine.isRunning) { 

    [audioEngine stop]; 

    [recognitionRequest endAudio]; 

} 



    NSLog(@"updateToolbarWithButton: %@", buttonType); 
    UIBarButtonItem *audioControl; 
    if ([buttonType isEqualToString:@"play"]) { 
    // Play 
    audioControl = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemPlay target:self action:@selector(handlePlayPauseButton:)]; 
    } 
    else { 
    // Pause 
    audioControl = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemPause target:self action:@selector(handlePlayPauseButton:)]; 
    } 
    UIBarButtonItem *flexibleItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; 

    [self.toolbar setItems:@[flexibleItem, audioControl, flexibleItem]]; 
    } 

    - (void)remoteControlReceivedWithEvent:(UIEvent *)receivedEvent 
    { 
    NSLog(@"receivedEvent: %@", receivedEvent); 
    if (receivedEvent.type == UIEventTypeRemoteControl) { 
    switch (receivedEvent.subtype) { 
    case UIEventSubtypeRemoteControlPlay: 
      NSLog(@"UIEventSubtypeRemoteControlPlay"); 
      if (self.synthesizer.speaking) { 
       [self.synthesizer continueSpeaking]; 
      } 
      else { 
       [self speakUtterance]; 
      } 
      break; 

      case UIEventSubtypeRemoteControlPause: 
      NSLog(@"pause - UIEventSubtypeRemoteControlPause"); 

      if (self.pauseSettingSegmentedControl.selectedSegmentIndex == 0) { 
       // Pause immediately 
       [self.synthesizer pauseSpeakingAtBoundary:AVSpeechBoundaryImmediate]; 
      } 
      else { 
       // Pause at end of current word 
       [self.synthesizer pauseSpeakingAtBoundary:AVSpeechBoundaryWord]; 
      } 
      break; 

     case UIEventSubtypeRemoteControlTogglePlayPause: 
      if (self.synthesizer.paused) { 
       NSLog(@"UIEventSubtypeRemoteControlTogglePlayPause"); 
       [self.synthesizer continueSpeaking]; 
      } 
      else { 
       NSLog(@"UIEventSubtypeRemoteControlTogglePlayPause"); 
       if (self.pauseSettingSegmentedControl.selectedSegmentIndex == 0)     { 
        // Pause immediately 
        [self.synthesizer pauseSpeakingAtBoundary:AVSpeechBoundaryImmediate]; 
       } 
       else { 
        // Pause at end of current word 
        [self.synthesizer pauseSpeakingAtBoundary:AVSpeechBoundaryWord]; 
       } 
       } 
       break; 

     case UIEventSubtypeRemoteControlNextTrack: 
      NSLog(@"UIEventSubtypeRemoteControlNextTrack - appropriate for playlists"); 
      break; 

     case UIEventSubtypeRemoteControlPreviousTrack: 
      NSLog(@"UIEventSubtypeRemoteControlPreviousTrack - appropriatefor playlists"); 
      break; 

     default: 
      break; 
     }  
     } 
     } 

编译标志UIPickerViewDelegate方法

  - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView 
      { 
      return 1; 
      } 

      - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 
      { 
      return self.voices.count; 
      } 

      - (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view 
      { 
      UILabel *rowLabel = [[UILabel alloc] init]; 
      NSDictionary *voice = [self.voices objectAtIndex:row]; 
      rowLabel.text = [voice objectForKey:@"label"]; 
      return rowLabel; 
      } 

      - (void)pickerView:(UIPickerView *)pickerView didSelectRow: (NSInteger)row inComponent:(NSInteger)component 
      { 
      NSDictionary *voice = [self.voices objectAtIndex:row]; 
      NSLog(@"new picker voice selected with label: %@", [voice objectForKey:@"label"]); 
      self.voice = [AVSpeechSynthesisVoice voiceWithLanguage:[voice objectForKey:@"voice"]]; 
      } 

编译标志SpeechSynthesizerDelegate方法

 - (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didFinishSpeechUtterance:(AVSpeechUtterance *)utterance 
     { 
     // This is a workaround of a bug. When we change the voice the first time the speech utterence is set fails silently. We check that the method willSpeakRangeOfSpeechString is called and set didStartSpeaking to YES there. If this method is not called (silent fail) then we simply request to speak again. 
     if (!didStartSpeaking) { 
      [self speakUtterance]; 

     } 
     else { 
     [self updateToolbarWithButton:@"play"]; 

     NSLog(@"the text are:%@",self.textView.text); 

     }} 

     - (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer willSpeakRangeOfSpeechString:(NSRange)characterRange utterance:(AVSpeechUtterance *)utterance 
     { 
didStartSpeaking = YES; 
//[self setTextViewTextWithColoredCharacterRange:characterRange]; 

     } 

     #pragma mark UITextViewDelegate Methods 

     - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { 

     if([text isEqualToString:@"\n"]) { 
     [textView resignFirstResponder]; 
     return NO; 
     } 

     return YES; 
     } 
+0

您好agal Sivamanoj先生请让我知道如何音频文本转换目标c –

回答

1

不要初始化所有在viewDidLoad中的事。当您点击按钮将文本转换为语音时,那时将语音转换为文本转换对象为零,并且将该委托设置为零。反之亦然。

+0

感谢@尼莱什Jha,我得到错误像** TextToSpeech [2069:915956] ***由于未捕获的异常'com终止应用程序。 apple.coreaudio.avfaudio',原因是:'所需条件为false:NULL!= engine'**,在停止语音引擎时,我已将识别对象设置为无 –

+0

请帮我做到这一点。 –

+0

在停止引擎之前你是否设置了对象零? – Nilesh