我有一个文本到语音应用程序,它生成一个22kHz采样率的音频流(原始数据) .
我有一个仅支持44kHz的USB-SoundCard .
使用我的asound.conf,我可以播放包含22kHz和44kHz音频流的wav文件而不会出现问题 .
我的应用程序使用alsa-libs并设置设备的采样率 . 在这种情况下,只有44kHz会成功,因为硬件仅支持此采样率 . 但现在,当我将生成的音频流写入alsa时,听起来是错误的,因为采样率不匹配 . 音频流(原始数据)不包含任何 Headers 信息,所以我认为alsa不使用任何插件zu转换采样率 . Alsa不知道流有不同的采样率
我现在的问题是,告诉alsa的正确方法是,生成的音频流具有不同的采样率,因此alsa-plugin会对其进行转换 .
以下代码仅适用于带有sampleRate = 44100的USB SoundCard,否则会发生错误(-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 .
我没有选择从tts-engine获取44kHz音频流(这是另一个软件) .
还是存在另一种方式,我没有看到?
最好的祝福 .