从PyTTS音频流编码为MP3

1 投票
2 回答
2428 浏览
提问于 2025-04-15 18:53

我在做一个把文字变成语音的项目,使用的是Python 2.5,把文字转换成音频mp3文件。

我用pyTTS这个Python的文本转语音模块,把文字变成.wav格式的音频文件(因为pyTTS不能直接生成mp3格式)。然后,我再用lame这个命令行工具把这些.wav文件转换成mp3格式。

现在,我遇到的问题是,我想在一个mp3音频文件的特定位置(两个词之间)插入一个外部的声音文件(比如警告音),或者(如果可以的话)生成一个警告音。

我有几个问题:

1) 我看到PyTTS有保存音频流到文件或内存流的功能,可以用两个函数:

tts.SpeakToWave(file, text) 或 tts.SpeakToMemory(text)

我尝试使用 tts.SpeakToMemory(text) 函数,并结合PyMedia,成功直接保存了一个mp3文件,但这个mp3文件播放时听起来像唐老鸭的声音,完全听不懂!:-) 这里有一段代码:

            params = {'id': acodec.getCodecID('mp3'), 'bitrate': 128000, 'sample_rate': 44100, 'ext': 'mp3', 'channels': 2}

            m = tts.SpeakToMemory(p.Text)
            soundBytes = m.GetData()

            enc = acodec.Encoder(params)

            frames = enc.encode(soundBytes)
            f = file("test.mp3", 'wb')
            for frame in frames:
                f.write(frame)
            f.close()

我搞不清楚问题出在哪里?!如果这个功能能正常工作,那就可以省去转换.wav文件的步骤。

2) 第二个问题是,我需要把从文本转语音模块得到的mp3音频文件和一个特定的警告音合并在一起。

当然,如果我能把文本转语音模块生成的音频内存流和警告音的流合并,然后再把整个音频内存流编码成一个mp3文件,那就太好了。

我还看到tksnack库可以合并音频,但它们不能写入mp3文件。

希望我说得清楚。:-)

非常感谢大家对我问题的回答。

Giulio

2 个回答

0

抱歉,我不能给出一个明确的答案。不过可以试试不同的方法:我建议你查看一下pymedia模块的文档,看看有没有可以设置的音质配置。

还有一点是,和wave或原始音频不同,你不能简单地把mp3格式的音频拼接在一起。无论你找到什么解决方案,你都需要在音频没有压缩(没有编码)的情况下进行拼接或混合,然后再生成mp3格式的音频。

有时候我们会觉得,把文件先录制到磁盘上再转换,而不是一步到位,感觉有点麻烦。但实际上,软件在后台就是这样做的,即使我们没有自己指定文件。如果你使用的是类Unix系统,可以创建一个FIFO特殊文件(用mkfifo命令),然后把你的.wav数据发送到那里进行编码(使用lame)。对于你的程序来说,看起来你在使用一个中间文件,但实际上并不是这样。

1

我觉得PyTTS生成的默认音频数据可能不是PCM格式的(也就是44100赫兹,立体声,16位)。你可以这样检查格式:

memStream = tts.SpeakToMemory("some text")
format = memStream.Format.GetWaveFormatEx()

...然后把它正确地交给acodec。所以你可以使用属性format.Channelsformat.BitsPerSampleformat.SamplesPerSec来查看这些信息。

至于你的第二个问题,如果这些声音的格式是一样的,你应该可以直接把它们一个接一个地传给enc.encode

撰写回答