「こんにちは、ジャック」と言って、AndroidAPPの一部の機能を起動したいと思います。私の知る限り、「こんにちは、ジャック」などの特定の音声を認識する「フレーズスポッティング」という技術があります。しかし、私は「フレーズスポッティング」を実装する考えがありません。
誰かもっとアイデアや提案がありますか?
ありがとう。
「こんにちは、ジャック」と言って、AndroidAPPの一部の機能を起動したいと思います。私の知る限り、「こんにちは、ジャック」などの特定の音声を認識する「フレーズスポッティング」という技術があります。しかし、私は「フレーズスポッティング」を実装する考えがありません。
誰かもっとアイデアや提案がありますか?
ありがとう。
最も簡単でリソース効率の良い方法は、キーワード スポッティング用に動的タイム ワーピング DTW を実装することです。
http://en.wikipedia.org/wiki/Dynamic_time_warping
http://www.purduecal.edu/ece/WSEAS.pdf
CMUSphinx ツールキットを使用して MFCC 機能を抽出できます。これにより、それらの実装に多くの時間を節約できます。
まず、この単純なアプローチをお勧めします。
以下のクラスのように、必要なキーワードに一致する単純なセットを使用することから始めます。
public class WordMatcher
{
private Set<String> words;
public static final int NOT_IN = -1;
public WordMatcher(String... wordsIn)
{
this(Arrays.asList(wordsIn));
}
public WordMatcher(List<String> wordsIn)
{
//care about order so we can execute isInAt
words = new LinkedHashSet<String>(wordsIn);
}
public Set<String> getWords()
{
return words;
}
public boolean isIn(String word)
{
return words.contains(word);
}
public boolean isIn(String [] wordsIn)
{
boolean wordIn = false;
for (String word : wordsIn)
{
if (isIn(word))
{
wordIn = true;
break;
}
}
return wordIn;
}
次のように認識結果を処理します。
@Override
protected void
onActivityResult(int requestCode, int resultCode, Intent data)
{
WordMatcher matchHello = new WordMatcher("hello");
WordMatcher matchJack = new WordMatcher("jack");
if (requestCode == VOICE_RECOGNITION_REQUEST_CODE)
{
if (resultCode == RESULT_OK)
{
List<String> heard =
data.
getStringArrayListExtra
(RecognizerIntent.EXTRA_RESULTS);
for (String oneResult : heard)
{
if (matchHello.isIn(oneResult.split(" ")) && matchJack.isIn(oneResult.split(" "))
{
//SUCCESS!! do something here
}
}
}
else
{
Log.d(TAG, "error code: " + resultCode);
}
}
super.onActivityResult(requestCode, resultCode, data);
}
次に、それが失敗した場合は、 Soundexなどの「サウンドのような」マッチングアルゴリズムを導入します。
また、ダイアログを生成するRecognizerIntentを使用するのではなく、SpeechRecognizerクラスを直接使用してバックグラウンドで音声認識を実行することを検討することもできます。