У меня есть приложение для преобразования текста в речь, которое генерирует аудиопоток (необработанные данные) с частотой дискретизации 22 кГц.
У меня есть USB-SoundCard, которые поддерживают только 44 кГц.
С моим asound.conf я могу без проблем воспроизводить wav-файлы, которые содержат аудиопоток 22 кГц и 44 кГц.
Мое приложение использует alsa-libs и устанавливает частоту дискретизации устройства.
В этом случае только 44 кГц будет успешным, потому что аппаратное обеспечение поддерживает только эту частоту дискретизации. Но теперь, когда я записываю сгенерированный аудиопоток в alsa, это звучит неправильно, потому что сэмплеры не совпадают. Аудиопоток (необработанные данные) не содержит никакой информации заголовка, поэтому я думаю, что alsa не использует плагин для преобразования сэмплирования. Alsa не знаю, что поток имеет другую частоту дискретизации
Теперь у меня вопрос, как правильно сказать alsa, что сгенерированный аудиопоток имеет другую частоту дискретизации, поэтому плагин alsa преобразует его.
Следующий код работает на USB SoundCard только с sampleRate = 44100, в противном случае произошла ошибка (-22, неверные параметры).
void initAlsa()
{
const char* name = "default";
alsaAudio = true;
writeRiffAtClose = false;
int err = snd_pcm_open (&alsaPlaybackHandle, name, SND_PCM_STREAM_PLAYBACK, 0);
if (err < 0)
throw TtsException({"Alsa: cannot open playback audio device ", name, " (" , snd_strerror (err), ")"}, 0);
sampleRate = 44100;
err = snd_pcm_set_params(alsaPlaybackHandle, // pcm PCM handle
SND_PCM_FORMAT_S16_LE, // format required PCM format
SND_PCM_ACCESS_RW_INTERLEAVED, // access required PCM access
2, // channels required PCM channels (Stereo)
sampleRate, // rate required sample rate in Hz
1, // soft_resample 0 = disallow alsa-lib resample stream, 1 = allow resampling
250000); /* 0.25sec */ // latency required overall latency in us
if (err < 0)
throw TtsException({"Alsa: cannot set parameters (" , err, " = " , snd_strerror(err), ") on ", name}, 0);
LOG_DEBUG("Alsa audio initialized");
}
Другой способ, я вручную преобразую частоту дискретизации, прежде чем положить ее в alsa, но я думаю: почему бы не использовать alsa-plugin.
У меня нет возможности получить аудио поток 44 кГц от tts-engine (это другое программное обеспечение).
Или существует другой способ, которого я не вижу?
С наилучшими пожеланиями.
Задача ещё не решена.