Microsoft Speech і потокове аудіо

image

Стало цікаво, наскільки добре Microsoft Speech вміє розпізнавати мову. У якості джерела для розпізнавання я вирішив взяти аудіопотік переговорів поліції з сайту youarelistening.to.

Існує два неймспейса System.Speech і Microsoft.Speech. Як я зрозумів, щоб використовувати Microsoft.Speech, необхідно встановити Microsoft Speech Platform Runtime і Microsoft Speech Platform SDK. А System.Speech вже є в останніх версіях .NET Framework.

Будемо використовувати System.Speech, оскільки в цьому випадку підтримується диктування, а в випадку Microsoft.Speech — ні.

Ще нам знадобиться бібліотека для роботи зі звуком NAudio. Там є приклад Mp3StreamingDemo, який вміє працювати з потоковим аудіо. Він нам і потрібен. Створюємо свій проект. З MP3StreamingPanel перетягуємо до себе метод StreamMp3 і все, що йому потрібно. Додаємо посилання на NAudio.

У нашому класі створюємо метод StartStreaming, який запустить StreamMp3 в окремому потоці:

public void StartStreaming()
{
playbackState = StreamingPlaybackState.Buffering;
bufferedWaveProvider = null;
ThreadPool.QueueUserWorkItem(StreamMp3, "http://relay.broadcastify.com:80/949398448"); 
}

Конструктор нашого класу буде створювати і конфігурувати SpeechRecognitionEngine, як граматики будемо використовувати переваги:

private bool completed = true;
readonly SpeechRecognitionEngine sre = new SpeechRecognitionEngine();

public Recognition()
{
var grammarBuilder = new GrammarBuilder();
grammarBuilder.Culture = new CultureInfo("en-Gb");
grammarBuilder.AppendDictation();

var grammar = new Grammar(grammarBuilder);

grammar.Enabled = true;
sre.LoadGrammar(grammar);
sre.BabbleTimeout = TimeSpan.FromHours(1);
sre.EndSilenceTimeout = TimeSpan.FromSeconds(10);
sre.InitialSilenceTimeout = TimeSpan.FromSeconds(10);
sre.SpeechRecognized += sre_SpeechRecognized;
sre.RecognizeCompleted += sre_RecognizeCompleted;
}

Дані з буфера копіюємо в MemoryStream, який передаємо в SetInputToAudioStream. Тут необхідно правильно задати параметри формату аудіо. Метод SetInputToWaveStream у мене не заробив.

public void Recognize()
{
var size = bufferedWaveProvider.BufferLength;
byte[] bytes = new byte[size];
bufferedWaveProvider.Read(bytes, 0, size);
using (var ms = new MemoryStream(bytes))
{
sre.SetInputToAudioStream(ms, new SpeechAudioFormatInfo(
bufferedWaveProvider.WaveFormat.SampleRate, AudioBitsPerSample.Шістнадцять, AudioChannel.Mono));

sre.RecognizeAsync(RecognizeMode.Multiple);
while (!completed)
{
Thread.Sleep(333);
}
}
}

void sre_RecognizeCompleted(object sender, RecognizeCompletedEventArgs e)
{
Debug.WriteLine("Finished");
completed = true;
}

private static void sre_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
Console.WriteLine(e.Result.Text);
}

Маніпуляції з прапором completed і циклом з Thread.Sleep я взяв до документації Speech API. З якоїсь причини без цього циклу розпізнавання не відбувається.

Тепер залишилося модифікувати метод запозичений StreamMp3. Як тільки буфер майже заповнений, зчитуємо з нього дані:

if (IsBufferNearlyFull)
{
Debug.WriteLine("Buffer getting full, taking a break");
if (completed)
{
completed = false;
Recognize();
}
Thread.Sleep(200);
}

І можна запускати:

private static void Main(string[] args)
{
var recognition = new Recognition();
recognition.StartStreaming();
Console.ReadKey();
}

Звичайно ж, на виході виходить повна околесица:

Результати роботи розпізнаванняthe Canadian an engineer by the IRA at the corner Michio politically inclined to
it and
regarded
it can i've had it in feeling
her have her had had
had
her her
her
in any category goalkeeper were: he cheekily nobody will include adequate real e
ye cannot
any attempt at her home in a holiday party had other E. are currently ensure tha
t lead about one it may take it nine
but lineup plenty alignment in a the manager Graeme
there get them into productive
all the legal
definitely likely telling it like legally were quickly added
a that when flying ability in immediately daylight
building unlucky in Allied
initiative commissioner cutting minister Jan fifteen along the who had failed
the effect it has to lead England manager Clive be clinging
the Italian Italian open
the relational for transplant
partner new-line
there that they are likely to alive plans but new-line
Eddie then entitling and it didn't go
in bed aware that their campaign locally in between and thirteen children ultima
te
a enabling info about an agenda implied sugary inundated with an
it entailed million any luckily a
English allowed her
lineker nine editor the twentieth brutality in any that nine treated like at
there are
all she unclear whether he'll but nine point overhauled understanding complain a
bout it because frankly and that
it is essential either a touchline do you play ланаркшір acute illness cover t
he
the but for their life under scrutiny lucky old enough virtually getting off lig
htly down to that internal it changed
near the relief of light Latino fondly

Висновки:
  • Поліцейську хвилю розпізнає дуже погано
  • При цьому працює досить швидко, буфер не встигає заповнюватися
  • System.Speech немає підтримки російської мови. Вона є в Microsoft.Speech, але там немає підтримки диктування

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.