Я использую NAudio, чтобы попытаться преобразовать wav-файлы Linear16 PCM, которые поступают из стороннего API-интерфейса Text-to-Speech API, в 8-битную 8-килограммовую MULAW G711, которая будет работать в качестве приглашения телефонии. Использование методов, описанных в документации авторов библиотеки и некоторых публикаций о переполнении стека, и, в частности, следуя предложению выполнить двухэтапное преобразование.
dynamic foo = JsonConvert.DeserializeObject<dynamic>(result);
byte[] decoded = Convert.FromBase64String(foo.audioContent.ToString());
WaveFormat newFormat = new WaveFormat(8000, 16, 1);
WaveFormat mulaw = WaveFormat.CreateMuLawFormat(8000, 1);
using (MemoryStream mem = new MemoryStream(decoded))
using (WaveFileReader reader = new WaveFileReader(mem))
using (var conversionStream = new WaveFormatConversionStream(newFormat, reader))
using (var convStream2 = new WaveFormatConversionStream(mulaw, conversionStream))
{
WaveFileWriter.CreateWaveFile("voiceprompt_downsample_8bit-8khz.wav", convStream2);
File.WriteAllBytes("voiceprompt_raw.wav", decoded);
}
К сожалению, результирующее качество звука преобразованного файла довольно сильно ухудшилось (чего и следовало ожидать). Однако, если я возьму тот же исходный файл, который запускаю с помощью кода выше, и отправлю его в конвертер по адресу g711.org и выберу «BroadWorks Classic (8Khz, Mono, u-law)» результирующий звук звучит намного лучше (особенно обратите внимание, что в некоторых наших подсказках он не обрезает / не сжимает буквы S в таких словах, как «доступ» и «пароль»).
Я подтвердил, что оба аудиофайла (тот, который я конвертирую с помощью NAudio, и тот, который я сгенерировал с помощью g711.org), воспроизводятся в соответствии с запросами нашей системы телефонии.
Хотите знать, есть ли у кого-нибудь опыт работы с NAudio какие-либо предложения о том, что я могу сделать по-другому в NAudio, чтобы получить выходное качество преобразованного файла, совпадающее с тем, что я получаю с сайта g711.org?