2

こんにちは、ビジュアルベーシックで、コンピューターでの生活に役立つ音声認識システムを作成しようとしています。私はアシスタントのジャービスに電話しました。このプロジェクトでは、system.speech.dll をインポートしました。そして今、このエラーを受け取っています:

フォームの作成中にエラーが発生しました。詳細については、Exception.InnerException を参照してください。エラー: 文法の言語が音声認識エンジンの言語と一致しません。

これが私のコードです

Imports System.Speech.Recognition
Imports System.Speech.Recognition.SrgsGrammar
Imports System.Runtime.InteropServices 'For Monitor Command

Public Class Form1
    'This object represents the Speech recognition engine
    Private recognizer As SpeechRecognizer
    Dim QuestionEvent As String

    Public Sub New()

        InitializeComponent() ' This call is required by the Windows Form Designer.

        recognizer = New SpeechRecognizer() ' Add any initialization after the InitializeComponent() call.

        AddHandler recognizer.SpeechDetected, AddressOf recognizer_SpeechDetected 'this event is raised when the user begins to speak

        AddHandler recognizer.SpeechRecognitionRejected, AddressOf recognizer_SpeechRecognitionRejected 'this is raised when spoken words are not recognized as compliant to our grammar rules

        AddHandler recognizer.SpeechRecognized, AddressOf recognizer_SpeechRecognized 'this is raised when the application correctly recognizes spoken words


        'The rule is that each choice in the first Append method can be combined with each word specified
        'in the second method.
        Dim grammar As New GrammarBuilder()
        grammar.Append(New Choices(System.IO.File.ReadAllLines("Commands.txt")))

        'A grammar must be loaded into the engine. This is possible by loading an object or an xml file
        recognizer.LoadGrammar(New Grammar(grammar))


    End Sub

    Private Sub recognizer_SpeechRecognized(ByVal sender As Object, ByVal e As SpeechRecognizedEventArgs)
        Dim Jarvis = CreateObject("sapi.spvoice")
        Select e.Result.Text.ToUpper

            'GREETINGS
            Case Is = "HELLO JARVIS"
                Jarvis.Speak("Hello sir")
            Case Is = "GOODBYE JARVIS"
                Jarvis.Speak("Until next time")
                Me.Close()

                'DATE / TIME / WEATHER
            Case Is = "WHAT TIME IS IT"
                Jarvis.Speak(Format(Now, "Short Time"))
            Case Is = "HOWS THE WEATHER"
                System.Diagnostics.Process.Start("https://www.google.com/webhp?sourceid=chrome-instant&ion=1&ie=UTF-8#output=search&sclient=psy-ab&q=weather&oq=&gs_l=&pbx=1&bav=on.2,or.r_cp.r_qf.&bvm=bv.47008514,d.eWU&fp=6c7f8a5fed4db490&biw=1366&bih=643&ion=1&pf=p&pdl=300")
                Jarvis.Speak("Searching for local weather")


                'WEBSITES
            Case Is = "RUN FACEBOOK"
                System.Diagnostics.Process.Start("http://www.facebook.com")
            Case Is = "RUN GOOGLE"
                System.Diagnostics.Process.Start("http://www.google.com")
            Case Is = "RUN YAHOO"
                System.Diagnostics.Process.Start("http://www.yahoo.com")
            Case Is = "RUN PANDORA"
                System.Diagnostics.Process.Start("http://www.pandora.com")
            Case Is = "RUN THE PIRATE BAY"
                System.Diagnostics.Process.Start("http://www.thepiratebay.se")
            Case Is = "RUN YOUTUBE"
                System.Diagnostics.Process.Start("http://www.youtube.com")

                'MISCELLANEOUS
            Case Is = "SHOW COMMANDS"
                lbCommands.Visible = True
                Jarvis.speak("Here we are")
            Case Is = "HIDE COMMANDS"
                lbCommands.Visible = False
                Jarvis.speak("Very well")
            Case Is = "OPEN DISK DRIVE"
                Dim oWMP = CreateObject("WMPlayer.OCX.7")
                Dim CDROM = oWMP.cdromCollection
                If CDROM.Count = 2 Then
                    CDROM.Item(1).Eject()
                    Jarvis.speak("Its now open")
                End If
            Case Is = "MONITOR OFF"
                SendMessage(Me.Handle.ToInt32(), WM_SYSCOMMAND, SC_MONITORPOWER, 2)
                Jarvis.Speak("I'll just close my eyes for a minute")
        End Select
    End Sub
    'LABEL DETECT / REJECT
    Private Sub recognizer_SpeechDetected(ByVal sender As Object, ByVal e As SpeechDetectedEventArgs)

        Label1.ForeColor = Color.Green : Label1.BackColor = Color.Transparent : Label1.Text = "Speech engine has detected that you spoke something"
    End Sub
    Private Sub recognizer_SpeechRecognitionRejected(ByVal sender As Object, ByVal e As SpeechRecognitionRejectedEventArgs)

        Label1.ForeColor = Color.Red : Label1.BackColor = Color.Transparent : Label1.Text = ("Sorry but the " & e.Result.Text & " phrase could not be recognized")

    End Sub

    'LOADS THE COMMANDS INTO AN ARRAY AND LISTBOX
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim Commands() As String = System.IO.File.ReadAllLines("Commands.txt")
        For i As Integer = 0 To Commands.Count - 1
            lbCommands.Items.Add(Commands(i))
        Next
    End Sub

    'HIDES COMMANDS LIST BOX
    Private Sub lbCommands_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lbCommands.SelectedIndexChanged
        lbCommands.Visible = False
    End Sub

    'FOR MONITOR COMMAND
    Public WM_SYSCOMMAND As Integer = &H112
    Public SC_MONITORPOWER As Integer = &HF170
    <DllImport("user32.dll")> _
    Private Shared Function SendMessage(ByVal hWnd As Integer, ByVal hMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    End Function

End Class

このコード行が原因でエラーが発生していますがrecognizer.LoadGrammar(New Grammar(grammar))、行を修正する方法がわかりません

エラー画像はこちら

どんな助けでも大歓迎です。ありがとう。

4

3 に答える 3

0

注意: CultureInfoのパラメーターを含むSpeechRecognitionEngine型のオブジェクトの構築と、 Grammarオブジェクトのカルチャ プロパティが同じである必要があります。たとえば、両方のオブジェクトに「en-US」を使用して、説明されている同じ例外を獲得しました。しかし、ドイツ語の環境で両方のオブジェクトに「en-GB」を使用したため、プログラムは期待どおりに動作します! そのため、最初に許可されたカルチャを検出すると役立つ場合があります。私の見解では、>> Thread.CurrentThread.CurrentCulture << の操作を避けることができ、SpeechRecognitionEngineと、許可された/インストールされたカルチャを持つGrammarオブジェクトの適切な設定に焦点を当てる必要があります。

于 2014-10-09T19:27:58.833 に答える
0

私が別のフォーラムに参加したように。友達のコンピューターでも同じ問題が発生しました。だから私はこれを作りました(すべてのコードが本当に長いので、これはコードの一部です):

...
RecognizerInfo recognizerInfo = null;

foreach (RecognizerInfo ri in SpeechRecognitionEngine.InstalledRecognizers())
{
   if ((ri.Culture.TwoLetterISOLanguageName.Equals("en")) && (recognizerInfo == null))
   {
      recognizerInfo = ri;
      break;
   }

}

SpeechRecognitionEngine SpeachRecognition = new SpeechRecognitionEngine(recognizerInfo);

GrammarBuilder gb = new GrammarBuilder(startLiserninFraze);
gb.Culture = recognizerInfo.Culture;
grammar = new Grammar(gb);
SpeachRecognition.RequestRecognizerUpdate();
SpeachRecognition.LoadGrammar(grammar);
SpeachRecognition.SpeechRecognized += SpeachRecognition_SpeechRecognized;
SpeachRecognition.SetInputToDefaultAudioDevice();
SpeachRecognition.RecognizeAsync(RecognizeMode.Multiple);
...

したがって、これは機能するはずです。私の友人の PC は、「en」または「eng」の 2 つのインスタンスをサポートしていました。理由はわかりません。したがって、コードは最初のものを選択します。インターネットでいくつかのコードの平和を見つけました。これのいくつかは私が作成したものです。

 SpeachRecognition.SpeechRecognized += SpeachRecognition_SpeechRecognized;

すべてが認識されたときにイベントを作成するように作られています。次のように入力します。

SpeechRecognition.SpeechRecognized +=

TABボタンを数回押します。コードの最後に、次のようなものが生成されます。

void SpeachRecognition_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
   {
       //then will be some line that you need to replace with your code
   }

これが役立つことを願っています。:)

あなたのオプションはより短いです。しかし、それを入力した後、sintesyzer がインストールされていないか、VS 2013 を実行しているときに言語が利用できないという別のエラーが発生しました。コード リリース バージョンを削除した後、VS から実行したときに同じエラーが発生しましたが、エクスプローラーからは問題ありません。その理由を知っている人はいますか?

于 2014-08-15T17:28:48.080 に答える