Chapter 6-Create the MicrophoneManager class|Microsoft Docs
I am referring to the above document, but the following code
I have a question about private void dictationRecognizer_DictionResult (string text, ConfidenceLevel confidence)
.
Why is this function used without arguments in StartCapturingAudio() or StopCapturingAudio()
?Thank you for your cooperation.
using UnityEngine;
using UnityEngine.Windows.Speech;
public class MicrophoneManager:MonoBehavior {
// Help to access instance of this object
public static MicrophoneManager instance;
// AudioSource component, providers access to mic
private AudioSource audioSource;
// Flag indicating mic detection
private bool microphoneDetected;
// Component converting speech to text
private DictationRecognizerDictationRecognizer;
private void Awake()
{
// Set this class to have 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("Initializing...");
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.DictionResult+=DictionRecognizer_DictionResult;
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("Misleeping");
Microphone.End(null);
dictationRecognizer.DictionResult-=DictionRecognizer_DictionResult;
dictationRecognizer.Dispose();
}
/// <summary>
/// This handler is called every time the dictation detect a pause in the speech.
/// Debugging message is delivered to the Results class.
/// </summary>
private voidDictionRecognizer_DictionResult (string text, ConfidenceLevel confidence)
{
// Update UI with dictation captured
Results.instance.SetDictionResult(text);
// Start the coroutine that process the dictation through Azure
StartCoroutine (Translator.instance.TranslateWithUnityNetworking(text));
}
}
The left-hand value dictionRecognizer.DictionResult
is the event.I'm not using a function, I'm just registering to be called later.
And to subscribe to events in the program, the traditional format
dictionRecognizer.DictionResult+=newDictionRecognizer.DictionResultDelegate(DictionRecognizer_DictionResult);
Simplified formatting available in C#2.0 and later for
dictionRecognizer.DictionResult+=DictionRecognizer_DictionResult;
is used.When you read the source code, you should keep in mind that the code is the latter, but essentially the former.
Why is this function available without arguments in StartCapturingAudio() or StopCapturingAudio()?
Rather than being available, I have registered functions called from the DictionRecognizer
class in the DictionResult
event handler.
Also, if the DictionRecognizer
class notifies the recognized text as follows,
string msg="Recognized text.";
DictationResult?.Invoke(msg, ConfidenceLevel.High);
Multiple functions registered with the event handler are called.
For example,
m_DictionRecognizer=newDictionRecognizer();
m_DictionRecognizer.DictionResult+=(text, confidence)=>
{
Debug.LogFormat("Diction result1:{0}", text);
};
m_DictionRecognizer.DictionResult+=(text, confidence)=>
{
Debug.LogFormat("Diction result2:{0}", text);
};
If you register more than one function in an event handler as shown in , the log output is as follows:
Diction result1—Recognized text.
Diction result2—Recognized text.
Why are we doing this?
in the DictionRecognizer
class.
This is one of the common design patterns to minimize program coupling so that you don't know the calling function.Common Deligate Patterns
© 2024 OneMinuteCode. All rights reserved.