Как создать простую панель диктовки в Delphi2009 + Vista - PullRequest
1 голос
/ 30 апреля 2010

код не так уж полон ..

  private
{ Private declarations }
SpSharedRecoContext1 : TSpSharedRecoContext;
fMyGrammar : ISpeechRecoGrammar;
procedure SpSharedRecoContext1Recognition(ASender: TObject; StreamNumber: Integer;
                                                            StreamPosition: OleVariant;
                                                            RecognitionType: SpeechRecognitionType;
                                                            const Result: ISpeechRecoResult);
procedure SpSharedRecoContext1Hypothesis(ASender: TObject; StreamNumber: Integer;
                                                           StreamPosition: OleVariant;
                                                           const Result: ISpeechRecoResult);
procedure TForm1.FormCreate(Sender: TObject);    
begin    
  SpSharedRecoContext1 := TSpSharedRecoContext.Create(self);    
  SpSharedRecoContext1.OnHypothesis := SpSharedRecoContext1Hypothesis;    
  SpSharedRecoContext1.OnRecognition :=SpSharedRecoContext1Recognition;    
  fMyGrammar := SpSharedRecoContext1.CreateGrammar(0);    
  fMyGrammar.DictationSetState(SGDSActive);    
end;    

procedure TForm1.SpSharedRecoContext1Recognition(ASender: TObject; StreamNumber: Integer;
                                                                StreamPosition: OleVariant;
                                                                RecognitionType: SpeechRecognitionType;
                                                                const Result: ISpeechRecoResult);    
begin    
  Memo1.Text := Result.PhraseInfo.GetText(0,-1,true);    
end;    

procedure TForm1.SpSharedRecoContext1Hypothesis(ASender: TObject; StreamNumber: Integer;
                                                               StreamPosition: OleVariant;
                                                               const Result: ISpeechRecoResult);    
begin    
  Memo1.Text := Result.PhraseInfo.GetText(0,-1,true);    
end;  

Моя проблема, была ли голосовая команда vista-OS перехватит мою программу. Если я говорю «START», вместо того, чтобы писать «start» на memo1, нажмите «Пуск» на моем рабочем столе. или что нибудь команда, как START CANCEL EDIT DELETE SELECT и т. д., пожалуйста, помогите ..... извините за мой английский

Ответы [ 2 ]

2 голосов
/ 01 мая 2010

Вам необходимо использовать внутрипроцессный распознаватель, а не совместно используемый распознаватель. Посмотрите на объект SpInprocRecoContext.

В частности, вам также необходимо установить свойство AudioInput распознавателя, чтобы распознаватель inproc знал, откуда взять звук.

Полностью проработанный пример простой диктовки является частью Windows 7 или Windows Vista SDK - после установки он находится в $ (WindowsSdkDir) \ Samples \ winui \ speech \ simpledictation.

Примеры на C ++, но вы должны использовать его в качестве отправной точки.

1 голос
/ 05 июня 2012

Казалось бы, полезный бит кода:

HRESULT hr = S_OK;
CComPtr<ISpRecognizer> cpRecoEngine;
hr = cpRecoEngine.CoCreateInstance(CLSID_SpInprocRecognizer);

if( SUCCEEDED( hr ) )
{
    hr = cpRecoEngine->CreateRecoContext( &m_cpRecoCtxt );
}


// Set recognition notification for dictation
if (SUCCEEDED(hr))
{
    hr = m_cpRecoCtxt->SetNotifyWindowMessage( hDlg, WM_RECOEVENT, 0, 0 );
}


if (SUCCEEDED(hr))
{
    // This specifies which of the recognition events are going to trigger notifications.
    // Here, all we are interested in is the beginning and ends of sounds, as well as
    // when the engine has recognized something
    const ULONGLONG ullInterest = SPFEI(SPEI_RECOGNITION);
    m_cpRecoCtxt->SetInterest(ullInterest, ullInterest);
}

// create default audio object
CComPtr<ISpAudio> cpAudio;
SpCreateDefaultObjectFromCategoryId(SPCAT_AUDIOIN, &cpAudio);

// set the input for the engine
cpRecoEngine->SetInput(cpAudio, TRUE);
hr = cpRecoEngine->SetRecoState( SPRST_ACTIVE );

Но как бы мы перевели это на Delphi?

...