0

個人プロジェクトのアプリに音声認識を追加する必要があります。

iOS 組み込みの音声認識フレームワークが必要です。高速で正確であり、連絡先の名前やその他の自分に関する情報も認識できるからです。

これまでのところ、iOS 8 での音声認識用のヘッダーを含むフレームワークを見つけたと思います: SAObjects.framework Github のヘッダーを取得し、Xcode プロジェクトに正常に追加しました。これまでに試したヘッダーは次のとおりです。

<SAObjects/SASRecognition.h>
<SAObjects/SASStartSpeechDictation.h>
<SAObjects/SASSpeechRecognized.h>

しかし、私は彼らと一緒に働く方法がわかりません。たとえば、これらは音声認識を起動できる 2 つの方法です。

SASStartSpeechDictation *object1 = [SASStartSpeechDictation startSpeechDictation];

SASSpeechRecognized *object2 = [SASSpeechRecognized speechRecognized];

ただし、デバッグすると、これらのオブジェクトのいずれにも文字列が見つかりません。したがって、明らかに何かが間違っています。たぶん、通知オブザーバーを設定する必要がありますか?

もう 1 つの解決策は、ディクテーションを (キーボードを使用して) 非表示のテキスト フィールド (キーボードを表示せずに) に開始することです。慣れている場合は、ジェイルブレイクされたデバイスのアクティベーター アクションと同様です。しかし、キーボードのディクテーションを開始できるメソッドや、それを見つけるためのアクティベーター アクションのソース コードは見つかりませんでした。

多分誰かがこれらのことを実験して、私に助けを与えることができますか?

この質問についてさらに情報が必要な場合は教えてください:)

どうもありがとう!

4

1 に答える 1

0

だから、私は自分で答えを見つけることができました。幸いなことに、役に立つコードを含む Github リポジトリを見つけました: https://github.com/erica/useful-things

私が見つけたコードは、appstore unsafe pack/DictationHelperディレクトリの下にあります。このコードは、UIDictationController を使用して Dictation を開始および停止し、テキスト値を取得するのに役立ちます。もちろん、テキストフィールドなしで...

重要:これを機能させるには、UIKit フレームワークのヘッダーを取得し、フレームワークをターゲットにリンクして、それらをプロジェクトにインポートする必要があります。

ただし、サンプル コードは特定の期間のみ話すことができるため、コードを少し変更しました。ボタンを押して話すのを止める必要がありました。これは、将来に興味を持つ可能性のある人のために、変更されたコードです。

DicationHelper.h:

/*

 Erica Sadun, http://ericasadun.com

 NOT APP STORE SAFE BUT HANDY
 Siri-ready devices only. Will not work in simulator.

 Example:

 [SpeechHelper speakModalString:@"Please say something"];
 [[DictationHelper sharedInstance] dictateWithDuration:5.0f completion:^(NSString *dictationString) {
 if (dictationString)
 NSLog(@"You said:'%@'", dictationString);
 else
 NSLog(@"No response");}];

 //-> OR: (My modification)


 [SpeechHelper speakModalString:@"Please say something"];
 [[DictationHelper sharedInstance] startDictation:0 completion:^(NSString *dictationString) {
 if (dictationString)
 NSLog(@"You said:'%@'", dictationString);
 else
 NSLog(@"No response");}];

 // Then you need to call this to stop the Dictation: [[DictationHelper sharedInstance] stopDictation]

 */

#import <UIKit/UIKit.h>
//#import <Foundation/Foundation.h>

extern NSString *const DictationStringResults;

typedef void (^DictationBlock)(NSString *dictationString);

@interface DictationHelper : NSObject
+ (instancetype) sharedInstance;
- (void) dictateWithDuration: (CGFloat) duration;
- (void) dictateWithDuration: (CGFloat) duration completion:(DictationBlock) completionBlock;

-(void) startDictation:(CGFloat) whatever completion:(DictationBlock) completionBlock;
-(void) stopDictationWithFallback;

@property (nonatomic, readonly) BOOL inUse;
@end

DictationHelper.m

/*

 Erica Sadun, http://ericasadun.com

 NOT APP STORE SAFE BUT HANDY
 Siri-ready devices only. Will not work in simulator.

 */


#import "DictationHelper.h"
#define MAKELIVE(_CLASSNAME_)   Class _CLASSNAME_ = NSClassFromString((NSString *)CFSTR(#_CLASSNAME_));

NSString *const DictationStringResults = @"Dictation String Results";

static DictationHelper *sharedInstance = nil;

@class UIDictationController;

@interface UIDictationController
+ (UIDictationController *) sharedInstance;
- (void) startDictation;
- (void) stopDictation;
- (void) preheatIfNecessary;
@end;

@interface DictationHelper () <UITextFieldDelegate>
@end

@implementation DictationHelper
{
    UITextField *secretTextField;
    id dictationController;
    DictationBlock completion;
    BOOL handled;
}

- (void) preheat
{
    if (!secretTextField)
    {
        secretTextField = [[UITextField alloc] initWithFrame:CGRectZero];
        UIWindow *window = [[UIApplication sharedApplication] keyWindow];
        [window addSubview:secretTextField];
        secretTextField.inputView = [[UIView alloc] init];
        secretTextField.delegate = self;
    }

    if (!dictationController)
    {
        MAKELIVE(UIDictationController);
        dictationController = [UIDictationController sharedInstance];
        [dictationController preheatIfNecessary];
    }
}

+ (instancetype) sharedInstance
{
    if (!sharedInstance)
    {
        sharedInstance = [[self alloc] init];
        [sharedInstance preheat];
    }
    return sharedInstance;
}


- (BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSString *tftext = textField.text;
    tftext = [tftext stringByReplacingCharactersInRange:range withString:string];
    [[NSNotificationCenter defaultCenter] postNotificationName:DictationStringResults object:tftext];

    if (completion) completion(tftext);

    // Treat this dictation as handled
    handled = YES;
    _inUse = NO;
    completion = nil;

    // Resign first responder
    [textField resignFirstResponder];

    return YES;
}

- (void) fallback
{
    // 1. Test completion
    if (!completion) return;

    // 2. Check for handled
    if (handled)
    {
        _inUse = NO;
        handled = NO;
        return;
    }

    // 3. Assume the dictation didn't work
    completion(nil);

    // 4. Reset everything
    handled = NO;
    _inUse = NO;
    completion = nil;

    // 5. Resign first responder
    [secretTextField resignFirstResponder];
}

-(void) startDictation:(CGFloat) whatever completion:(DictationBlock) completionBlock{
    if (completionBlock) completion = completionBlock;

    if (_inUse)
    {
        NSLog(@"Error: Dictation Helper already in use");
        return;
    }

    _inUse = YES;
    handled = NO;

    secretTextField.text = @"";
    [secretTextField becomeFirstResponder];

    [[UIDevice currentDevice] playInputClick];
    [dictationController startDictation];
}

- (void) dictateWithDuration: (CGFloat) numberOfSeconds
{
    if (_inUse)
    {
        NSLog(@"Error: Dictation Helper already in use");
        return;
    }

    _inUse = YES;
    handled = NO;

    secretTextField.text = @"";
    [secretTextField becomeFirstResponder];

    [[UIDevice currentDevice] playInputClick];
    [dictationController startDictation];
    [self performSelector:@selector(stopDictation) withObject:nil afterDelay:numberOfSeconds];
    [self performSelector:@selector(fallback) withObject:nil afterDelay:numberOfSeconds + 1.0f];
}

- (void) dictateWithDuration: (CGFloat) duration completion:(DictationBlock) completionBlock
{
    if (completionBlock) completion = completionBlock;
    [self dictateWithDuration:duration];
}

- (void) stopDictation
{
    [dictationController stopDictation];
}

- (void) stopDictationWithFallback
{
    [self performSelector:@selector(stopDictation) withObject:nil afterDelay:0.0];
    [self performSelector:@selector(fallback) withObject:nil afterDelay:1.0f];
}

@end

#undef MAKELIVE
于 2015-10-11T16:40:17.513 に答える