我有一个文本转语音应用程序,它可以生成22kHz采样率的音频流(原始数据)。
我有一个仅支持44kHz的USB-SoundCard。
使用我的asound.conf,我可以播放包含22kHz和44kHz音频流的wav文件,而不会出现问题。
我的应用程序使用alsa-libs并设置设备的采样率。 在这种情况下,只有44kHz会成功,因为硬件仅支持此采样率。但现在,当我将生成的音频流写入alsa时,听起来是错误的,因为采样率不匹配。音频流(原始数据)不包含任何标题信息,所以我认为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音频流(这是另一款软件)。
或者以另一种方式存在,我看不到?
最好的问候。