私は、口頭でコマンドを発行できるマイクをアパートに設置するという個人的なプロジェクトに取り組んでいます。これを実現するために、私は Microsoft Speech API を使用してきました。具体的には、C# の System.Speech.Recognition の RecognitionEngine を使用しています。次のように文法を構築します。
// validCommands is a Choices object containing all valid command strings
// recognizer is a RecognitionEngine
GrammarBuilder builder = new GrammarBuilder(recognitionSystemName);
builder.Append(validCommands);
recognizer.SetInputToDefaultAudioDevice();
recognizer.LoadGrammar(new Grammar(builder));
recognizer.RecognizeAsync(RecognizeMode.Multiple);
// etc ...
これは、実際にコマンドを与える場合にはかなりうまくいくようです。私のコマンドの 1 つをまだ誤認していません。残念ながら、ランダムな会話をコマンドとして拾う傾向もあります! コマンドChoicesオブジェクトの前に「名前」(認識システム名) を付けることで、これを改善しようとしました。奇妙なことに、これは役に立たないようです。あらかじめ決められた一連のコマンド フレーズに制限しているので、音声が文字列ではないかどうかを検出できると考えていたでしょう。私の推測では、すべてのサウンドがコマンドであると想定し、コマンド セットから最適なものを選択していると思われます。このシステムを改善して、このシステムに向けられていない会話がトリガーされないようにするためのアドバイスは非常に役に立ちます。
編集:名前認識エンジンを別の SpeechRecognitionEngine に移動しましたが、精度はひどいです。精度を調べるために書いたテストコードを次に示します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Speech.Recognition;
namespace RecognitionAccuracyTest
{
class RecognitionAccuracyTest
{
static int recogcount;
[STAThread]
static void Main()
{
recogcount = 0;
System.Console.WriteLine("Beginning speech recognition accuracy test.");
SpeechRecognitionEngine recognizer;
recognizer = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("en-US"));
recognizer.SetInputToDefaultAudioDevice();
recognizer.LoadGrammar(new Grammar(new GrammarBuilder("Octavian")));
recognizer.SpeechHypothesized += new EventHandler<SpeechHypothesizedEventArgs>(recognizer_SpeechHypothesized);
recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(recognizer_SpeechRecognized);
recognizer.RecognizeAsync(RecognizeMode.Multiple);
while (true) ;
}
static void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
System.Console.WriteLine("Recognized @ " + e.Result.Confidence);
try
{
if (e.Result.Audio != null)
{
System.IO.FileStream stream = new System.IO.FileStream("audio" + ++recogcount + ".wav", System.IO.FileMode.Create);
e.Result.Audio.WriteToWaveStream(stream);
stream.Close();
}
}
catch (Exception) { }
}
static void recognizer_SpeechHypothesized(object sender, SpeechHypothesizedEventArgs e)
{
System.Console.WriteLine("Hypothesized @ " + e.Result.Confidence);
}
}
}
名前が "Octavian" の場合、"Octopus"、"Octagon"、"Volkswagen"、"Wow, really?" などを認識します。関連するオーディオ クリップの違いがはっきりと聞こえます。これをひどくしないようにするためのアイデアは素晴らしいでしょう。