我有一个文本到语音应用程序,它生成一个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音频流(这是另一个软件) .

还是存在另一种方式,我没有看到?

最好的祝福 .