MS Cognitive пользовательский образец отправки голосовых данных с возвратом данных «Только формат RIFF (WAV) принимается. Проверьте формат ваших аудиофайлов». - PullRequest
0 голосов
/ 04 января 2019

Просто проверяю, чтобы убедиться, что это должно поддерживаться. На странице здесь сказано, что вы должны иметь возможность использовать любой файл PCM с частотой не менее 16 кГц. Я пытаюсь сегментировать более длинный wav-файл в высказываниях с помощью NAudio, и я могу сгенерировать файлы, но все данные обучения, которые я отправляю, возвращаются с ошибкой обработки "Принимается только формат RIFF (WAV). Проверьте формат ваших аудио файлов. " Аудио файлы - это 16-битные PCM, моно, 44 кГц wav-файлы, и все они младше 60 лет. Есть ли другое ограничение на формат файла, который я мог бы пропустить? WAV-файлы имеют действительный заголовок RIFF (проверено, что байты существуют).

1 Ответ

0 голосов
/ 10 января 2019

Мне удалось выяснить это, явно перекодировав аудио, которое я получил обратно от SpeechRecognizer. Определенно не эффективное решение, но это был просто взлом, чтобы проверить все. Вот код для справки (поместите его в Recognizer.Recognized):

string rawResult = ea.Result.ToString();  //can get access to raw value this way.
Regex r = new Regex(@".*Offset"":(\d*),.*");
UInt64 offset = Convert.ToUInt64(r?.Match(rawResult)?.Groups[1]?.Value);
r = new Regex(@".*Duration"":(\d*),.*");
UInt64 duration = Convert.ToUInt64(r?.Match(rawResult)?.Groups[1]?.Value);

//create segment files
File.AppendAllText($@"{path}\{fileName}\{fileName}.txt", $"{segmentNumber}\t{ea.Result.Text}\r\n");

//offset and duration are in 100ns units
WaveFileReader w = new WaveFileReader(v);
long totalDurationInMs = w.SampleCount / w.WaveFormat.SampleRate * 1000;  //total length of the file
ulong offsetInMs = offset / 10000;  //convert from 100ns intervals to ms
ulong durationInMs = duration / 10000;
long bytesPerMilliseconds = w.WaveFormat.AverageBytesPerSecond / 1000;
w.Position = bytesPerMilliseconds * (long)offsetInMs;
long bytesToRead = bytesPerMilliseconds * (long)durationInMs;
byte[] buffer = new byte[bytesToRead];
int bytesRead = w.Read(buffer, 0, (int)bytesToRead);
string wavFileName = $@"{path}\{fileName}\{segmentNumber}.wav";
string tempFileName = wavFileName + ".tmp";
WaveFileWriter wr = new WaveFileWriter(tempFileName, w.WaveFormat);
wr.Write(buffer, 0, bytesRead);
wr.Close();

//this is probably really inefficient, but it's also the simplest way to get things in the right format.  It's a prototype-deal with it...
WaveFileReader r2 = new WaveFileReader(tempFileName);
//from other project
var desiredOutputFormat = new WaveFormat(16000, 16, 1);
using (var converter = new WaveFormatConversionStream(desiredOutputFormat, r2))
{
    WaveFileWriter.CreateWaveFile(wavFileName, converter);
}

segmentNumber++;

Это разбивает входной файл на отдельные файлы за ход и добавляет расшифровку стенограмм ходов в текстовый файл, используя имена файлов.

Хорошей новостью является то, что это дало «действительный» набор данных, и я смог создать из него голос. Плохая новость заключается в том, что голосовой шрифт создает почти неразборчивый звук, который я собираюсь объяснить комбинацией использования машинно-транскрибируемых сэмплов наряду с нерегулярными перерывами в поворотах и, возможно, шумным звуком. Я могу посмотреть, можно ли что-нибудь сделать, чтобы улучшить точность, отредактировав вручную несколько файлов, но я по крайней мере хотел бы опубликовать здесь ответ на случай, если у кого-то еще возникнет такая же проблема.

Кроме того, похоже, что PCM с частотой 16 кГц и 44 кГц будет работать с пользовательским голосом, так что это плюс, если у вас есть звук более высокого качества.

...