【问题标题】:How to avoid Pygame changing female voice into male如何避免 Pygame 将女声变成男声
【发布时间】:2019-01-20 16:40:11
【问题描述】:

我正在尝试播放女性的音频文件,使用 python 中的 pygame 库用印地语说话。当我手动单击音频文件并收听它时,它是一个女性声音,但是当我通过下面的脚本播放它时,我得到一个男性声音。我猜它正在将女性频率转换为男性频率。为什么会这样以及如何避免?

注意:我在 Raspberry Pi 上使用 Raspbian。

这是音频文件的链接:https://drive.google.com/open?id=18pLBoCMxWZzB-RO3qqVmi0zREgJckb3M

我的编码:

import pygame.time
from pygame.mixer import *
pre_init()
init()
filename = 'speech.wav'
music.load(filename)
music.play()
while pygame.mixer.music.get_busy():
    pygame.time.Clock().tick(10)

【问题讨论】:

  • 听起来难以置信。音频对我来说是女性。采样率是多少?我隐约猜测您正在以 22 kHz 播放 44 kHz 文件,而降低的频率使它听起来像男声。
  • 是的,我们只是播放较慢的音频,大约慢了 2 倍 - 这意味着三重奏是正确的。试试pygame.mixer.init(frequency=32000)(您的音频文件是 32000 Hz,而不是 22 或 44)

标签: python audio pygame audio-player frequency-analysis


【解决方案1】:
import pygame.time
from pygame.mixer import *
pre_init()
init(frequency=32000)
filename = 'speech.wav'
music.load(filename)
music.play()
while pygame.mixer.music.get_busy():
    pygame.time.Clock().tick(10)

pygame.mixer.init() 采用frequency 参数。由于播放器默认为22050,因此播放将以慢动作播放 - 使其听起来不同。您可以通过手动更改速度来规避这种情况,或者您可以从music.load() 获取实际速度,元数据应该在文件中。

否则,只需执行ffmpeg -i speech.wav,您就会在底部看到正确的频率。

要更改音频文件的频率以匹配相同的频率,您可以使用 ffmpeg 重新编码文件。现在,我不是 ffmpeg 的魔术师 - 但只是大致如下:

ffmpeg -i speech.wav -af asetrate="32000*1.38125,atempo=1/1.38125" output.wav

或使用 Audacity 或其他人推荐的东西:https://superuser.com/questions/292833/how-to-change-audio-frequency

在播放器上更改频率的第二个选项是在每个媒体文件之后调用pygame.mixer.quit(),并使用与您的新文件匹配的新频率重新启动它。或者最后,阅读文档,看看是否可以在已经初始化的混音器实例上更改频率播放。这超出了我的知识范围。我只知道你原来的根本问题是什么:)

【讨论】:

  • 如果我们有多个具有不同频率的文件并且我们想一个接一个地播放它们怎么办?
  • @user9181286 你有三个选项。最简单的是,重新编码音频文件以具有匹配的频率。这将使您以最快的速度前进。第二个是在每个剪辑之后重新启动媒体播放器(init()pygame.mixer.quit() 在每个媒体的末尾)。第三个是调查并查看媒体句柄是否支持对频率的实例更改。我只涉足Pyglet,而不是Pygame,所以我不确定这是否可能。阅读文档,或尝试music.frequency=32000pygame.mixer.freqency=32000(使用import pygame.mixer 而不是from...
猜你喜欢
  • 2012-02-12
  • 1970-01-01
  • 2021-04-21
  • 2011-03-04
  • 2015-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-09
相关资源
最近更新 更多