Мне удалось выяснить это, явно перекодировав аудио, которое я получил обратно от 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 кГц будет работать с пользовательским голосом, так что это плюс, если у вас есть звук более высокого качества.