

[Chapter 6 - Create the MicrophoneManager class | Microsoft
Docs](https://docs.microsoft.com/en-us/windows/mixed-reality/mr-
azure-301#chapter-6--create-the-microphonemanager-class)

上記ドキュメントを参考にしているのですが、以下のコードの  
`private void DictationRecognizer_DictationResult(string text, ConfidenceLevel
confidence)` について質問です。  
この関数はなぜ `StartCapturingAudio()やStopCapturingAudio()`
中で引数無しで使用できているのでしょうか。よろしくお願いいたします。

[code]

    using UnityEngine;
    using UnityEngine.Windows.Speech;
    
    public class MicrophoneManager : MonoBehaviour {
    
        // Help to access instance of this object 
        public static MicrophoneManager instance;
    
        // AudioSource component, provides access to mic 
        private AudioSource audioSource;
    
        // Flag indicating mic detection 
        private bool microphoneDetected;
    
        // Component converting speech to text 
        private DictationRecognizer dictationRecognizer;
    
        private void Awake()
        {
            // Set this class to behave similar to singleton 
            instance = this;
        }
    
        void Start()
        {
            //Use Unity Microphone class to detect devices and setup AudioSource 
            if (Microphone.devices.Length > 0)
            {
                Results.instance.SetMicrophoneStatus("Initialising...");
                audioSource = GetComponent<AudioSource>();
                microphoneDetected = true;
            }
            else
            {
                Results.instance.SetMicrophoneStatus("No Microphone detected");
            }
        }
    
        /// <summary> 
        /// Start microphone capture. Debugging message is delivered to the Results class. 
        /// </summary> 
        public void StartCapturingAudio()
        {
            if (microphoneDetected)
            {
                // Start dictation 
                dictationRecognizer = new DictationRecognizer();
                dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;
                dictationRecognizer.Start();
    
                // Update UI with mic status 
                Results.instance.SetMicrophoneStatus("Capturing...");
            }
        }
    
        /// <summary> 
        /// Stop microphone capture. Debugging message is delivered to the Results class. 
        /// </summary> 
        public void StopCapturingAudio()
        {
            Results.instance.SetMicrophoneStatus("Mic sleeping");
            Microphone.End(null);
            dictationRecognizer.DictationResult -= DictationRecognizer_DictationResult;
            dictationRecognizer.Dispose();
        }
    
        /// <summary>
        /// This handler is called every time the Dictation detects a pause in the speech. 
        /// Debugging message is delivered to the Results class.
        /// </summary>
        private void DictationRecognizer_DictationResult(string text, ConfidenceLevel confidence)
        {
            // Update UI with dictation captured
            Results.instance.SetDictationResult(text);
    
            // Start the coroutine that process the dictation through Azure 
            StartCoroutine(Translator.instance.TranslateWithUnityNetworking(text));
        }
    }
    
[/code]


CC BY-SA 4.0
2020-01-16T20:08:24.873
62304
2020-01-17T17:13:41.860
2020-01-17T00:38:44.547
3060
30396
question
c# unity3d azure
c#の引数について


左辺値
[`dictationRecognizer.DictationResult`](https://docs.unity3d.com/ja/current/ScriptReference/Windows.Speech.DictationRecognizer.DictationResult.html)
は[イベント](https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-
guide/events/)です。関数を使用しているのではなく、後で呼び出してもらうよう登録しているだけです。  
そして[プログラムでイベントをサブスクライブするには](https://docs.microsoft.com/ja-
jp/dotnet/csharp/programming-guide/events/how-to-subscribe-to-and-unsubscribe-
from-events#to-subscribe-to-events-programmatically)で説明されているように従来から使用可能な書式

[code]

    dictationRecognizer.DictationResult += new DictationRecognizer.DictationResultDelegate(DictationRecognizer_DictationResult);
    
[/code]

に対してC# 2.0以降で使用できる簡略化された書式

[code]

    dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;
    
[/code]

が使われています。ソースコードを読む際、コード上は後者となっていますが本質的には前者であることを留意する必要があります。


CC BY-SA 4.0
2020-01-16T20:25:38.977
62305
2020-01-16T20:25:38.977
4236
62304
answer


> この関数はなぜStartCapturingAudio()やStopCapturingAudio()中で引数無しで使用できているのでしょうか。

利用できていると言うより、`DictationRecognizer` クラスから 呼び出される関数を `DictationResult`
イベントハンドラに登録しています。

そして `DictationRecognizer` クラスが 認識されたテキスト を下記のようにイベント通知すると

[code]

    string msg = "認識されたテキスト。";
    DictationResult?.Invoke(msg, ConfidenceLevel.High);
    
[/code]

イベントハンドラに登録された 複数の 関数が呼び出される仕組みです。

例えば

[code]

    m_DictationRecognizer = new DictationRecognizer();
    
    m_DictationRecognizer.DictationResult += (text, confidence) =>
    {
          Debug.LogFormat("Dictation result1: {0}", text);
    };
    
    m_DictationRecognizer.DictationResult += (text, confidence) =>
    {
          Debug.LogFormat("Dictation result2: {0}", text);
    };
    
[/code]

のように １つのイベントハンドラに複数の関数を登録した場合 下記のようにログ出力されます。

[code]

    Dictation result1: 認識されたテキスト。
    Dictation result2: 認識されたテキスト。
    
[/code]

なぜ このような事をやっているのか？ という事ですが、`DictationRecognizer` クラスで  
呼び出し先の 関数を知らなくても 呼び出しができるように プログラムの結合度を最小限にするための よくあるデザインパターンの一つです。
[デリゲートの一般的なパターン](https://docs.microsoft.com/ja-jp/dotnet/csharp/delegates-
patterns)


CC BY-SA 4.0
2020-01-17T17:04:42.983
62334
2020-01-17T17:13:41.860
2020-01-17T17:13:41.860
18851
18851
62304
answer