ALSA — преобразование частоты дискретизации

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

Или существует другой способ, которого я не вижу?

С наилучшими пожеланиями.

2

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]