语音¶
影片代码
import manimgx as m
class VoiceHero(m.Scene):
def construct(self) -> None:
square = m.MathTex("x^2", font_size=96).shift(2 * m.LEFT)
derivative = m.MathTex("2x", font_size=96).shift(2 * m.RIGHT)
arrow = m.Arrow(square.get_right(), derivative.get_left(), buff=0.4)
script = m.Text(
"The derivative of [x squared] is [two x].", font_size=32
).to_edge(m.DOWN)
self.add(square, script)
self.play(m.Indicate(square))
self.play(m.GrowArrow(arrow), m.Write(derivative))
self.wait()
say 用场景的语音说出一行,并在它说话时播放动画。将每个动画的词语放在方括号中,并按相同顺序给出动画:每个从它的第一个词开始。场景等待直到该行结束,因此各行不会重叠;改变词语,动画跟随新词语。
场景的语音通过文本转语音服务说话。ManimGX 将它说的内容保存在场景文件旁边名为 voice/ 的文件夹中,因此场景无需服务即可再次渲染,并且只有改变的行再次发送给它。语音说的内容成为视频的字幕。
say
¶
朗读一段脚本,在其被朗读时播放动画;场景等待二者完成。
用方括号标记动画所属的词:给定的动画按顺序在括号标记的词期间播放,每个
在其词开始时开始,持续其词的朗读时长,或其自身运行时间(取较长者;空的
[] 在其所在处开始一个)。无括号时,动画在整个语音期间播放。括号不被
朗读。
script要朗读的内容,每个动画对应一个括号区间(或无)。
*animations动画,每个区间一个。
voice朗读者;默认为场景的
voice。
返回 该语音,带有其各词及朗读时刻。
源码
manimgx\scene.py
speech
¶
场景的语音为 text 所说的内容,但不播放。
朗读一次后保存在场景文件旁的 voice/ 中(以文本命名),因此场景再次
渲染时不再朗读;用你自己相同内容的录音替换其中文件,即可改用该录音。
播放该语音、添加它(add_sound:它在场景
继续时朗读),或读取其 words。
text要朗读的内容。
voice朗读者;默认为场景的
voice。
返回 该语音。
源码
manimgx\scene.py
Speech
¶
语音:一种知道自己说什么以及每个词何时被说出的声音。
语音由一个 voice 返回。它像任何声音一样播放;Scene.say
还按其词语为动画计时。
source音频:文件的路径、文件的字节或采样点。
text它说了什么。
words每个词及其被说出的时间,如果 voice 知道;否则从 音频中估算。
rate采样点的速率;仅用于采样点。
源码
manimgx\audio\sound.py
words
¶
其词语,按顺序排列,以及每个词被说出的时间(以从其开始的秒数为单位): voice 提供的,或从音频中估算的;裁剪或变速会随 音频移动它们。
源码
manimgx\audio\sound.py
语音¶
ManimGX 提供的语音是 fal.ai 的:m.voices.Fal,附带你选择的模型及其设置。你的编辑器显示每个模型的设置。
Fal
¶
在场景类中定义一个声音:
voice = m.voices.Fal(
"fal-ai/minimax/speech-2.8-hd",
voice_setting={"voice_id": "Calm_Woman", "speed": 1.1},
)
fal.ai 上的文本转语音模型,作为声音使用:Fal(model, **settings),其中
settings 为该模型自身的设置(默认模型为
ElevenV3)。
model模型在 fal 上的 ID。
keyfal 的 API 密钥;默认取
FAL_KEY。
模型的设置。
源码
manimgx\audio\fal.py
模型¶
ElevenV3
¶
ElevenLabs 的 Eleven v3(fal-ai/elevenlabs/tts/eleven-v3)的设置,该模型会为
其单词计时。其文本可携带音频标签:[whispers]、[laughs]、[excited]……
voiceElevenLabs 声音库中某个声音的名称或 ID:Aria、Roger、Sarah、Laura、Charlie、 George、Callum、River、Liam、Charlotte、Alice、Matilda、Will、Jessica、Eric、Chris、 Brian、Daniel、Lily、Bill……(默认 "Rachel")。
stability声音的稳定程度,从 0(富有表现力)到 1(稳定)(默认 0.5)。
language_code语言,以 ISO 639-1 代码表示("en"、"de"……)(默认:文本自身的语言)。
apply_text_normalization数字等内容在朗读前是否拼读出来(默认 "auto":由模型自行判断)。
voice
¶
ElevenLabs 声音库中某个声音的名称或 ID:Aria、Roger、Sarah、Laura、Charlie、 George、Callum、River、Liam、Charlotte、Alice、Matilda、Will、Jessica、Eric、Chris、 Brian、Daniel、Lily、Bill……(默认 "Rachel")。
stability
¶
声音的稳定程度,从 0(富有表现力)到 1(稳定)(默认 0.5)。
language_code
¶
语言,以 ISO 639-1 代码表示("en"、"de"……)(默认:文本自身的语言)。
apply_text_normalization
¶
数字等内容在朗读前是否拼读出来(默认 "auto":由模型自行判断)。
MiniMax
¶
MiniMax Speech 2.8 HD(fal-ai/minimax/speech-2.8-hd)的设置。其文本可携带
停顿 <#0.5#>(以秒为单位)以及感叹词:(laughs)、(sighs)、(coughs)、
(clears throat)、(gasps)、(sniffs)、(groans)、(yawns)。
voice_setting声音及其说话方式(
MiniMaxVoice)。audio_setting生成的音频(
MiniMaxAudio)。language_boost模型所关注的一种语言或方言(默认:无)。
normalization_setting如何均衡响度 (
MiniMaxLoudness)。voice_modify如何改变声音本身(
MiniMaxTimbre)。pronunciation_dict如何读特定词语 (
MiniMaxPronunciation)。
voice_setting
¶
声音及其说话方式(MiniMaxVoice)。
audio_setting
¶
生成的音频(MiniMaxAudio)。
language_boost
¶
模型所关注的一种语言或方言(默认:无)。
normalization_setting
¶
如何均衡响度
(MiniMaxLoudness)。
voice_modify
¶
如何改变声音本身(MiniMaxTimbre)。
pronunciation_dict
¶
如何读特定词语
(MiniMaxPronunciation)。
MiniMaxVoice
¶
一个 MiniMax 声音及其说话方式。
voice_id声音:Wise_Woman、Friendly_Person、Inspirational_girl、Deep_Voice_Man、Calm_Woman、 Casual_Guy、Lively_Girl、Patient_Man、Young_Knight、Determined_Man、Lovely_Girl、 Decent_Boy、Imposing_Manner、Elegant_Man、Abbess、Sweet_Girl_2、Exuberant_Girl,或 克隆声音的 ID(默认 "Wise_Woman")。
speed语速,从 0.5 到 2(默认 1)。
vol音量,从 0.01 到 10(默认 1)。
pitch音高,以半音为单位,从 -12 到 12(默认 0)。
emotion说话时带有的情绪(默认:按文本语气而定)。
english_normalization英文数字是否朗读得更仔细、稍慢一些(默认 False)。
voice_id
¶
声音:Wise_Woman、Friendly_Person、Inspirational_girl、Deep_Voice_Man、Calm_Woman、 Casual_Guy、Lively_Girl、Patient_Man、Young_Knight、Determined_Man、Lovely_Girl、 Decent_Boy、Imposing_Manner、Elegant_Man、Abbess、Sweet_Girl_2、Exuberant_Girl,或 克隆声音的 ID(默认 "Wise_Woman")。
speed
¶
语速,从 0.5 到 2(默认 1)。
vol
¶
音量,从 0.01 到 10(默认 1)。
pitch
¶
音高,以半音为单位,从 -12 到 12(默认 0)。
emotion
¶
说话时带有的情绪(默认:按文本语气而定)。
english_normalization
¶
英文数字是否朗读得更仔细、稍慢一些(默认 False)。
MiniMaxAudio
¶
MiniMaxLoudness
¶
MiniMax 如何均衡音频响度。
enabled是否启用(默认 True)。
target_loudness目标响度,以 LUFS 为单位,从 -70 到 -10(默认 -18)。
target_range响度范围,以 LU 为单位,从 0 到 20(默认 8)。
target_peak最高峰值,以 dBTP 为单位,从 -3 到 0(默认 -0.5)。
MiniMaxTimbre
¶
MiniMaxPronunciation
¶
MiniMax 如何读特定词语。
tone_list每个词及其发音:
"text/(pronunciation)"(中文声调 1 到 5:"燕少飞/(yan4)(shao3)(fei1)")。
tone_list
¶
每个词及其发音:"text/(pronunciation)"(中文声调 1 到 5:
"燕少飞/(yan4)(shao3)(fei1)")。
Gemini
¶
Google 的 Gemini 3.8 Flash TTS(google/gemini-3.8-flash-tts)的设置。其文本可
携带发声事件:<laugh>、<sigh>。
voice声音(默认 "Kore")。
style_instructions以文字描述如何朗读,例如:"Warm and unhurried, like a patient teacher."(默认: 无)。
Inworld
¶
Qwen
¶
阿里巴巴的 Qwen3-TTS 1.7B(fal-ai/qwen-3-tts/text-to-speech/1.7b)的设置。
voice声音(默认:由模型决定)。
language语言(默认 "Auto":文本自身的语言)。
prompt以文字描述如何朗读(而非朗读什么内容)(默认:无)。
speaker_voice_embedding_file_url克隆声音:由
fal-ai/qwen-3-tts/clone-voice生成的说话人嵌入的 URL;它会覆盖voice和prompt(默认:无)。reference_text克隆声音的录音所朗读的内容,有助于让合成声音更像原声(默认:无)。
temperature朗读的变化程度,大于 0 且不超过 1(默认 0.9)。
top_k采样:从 k 个最可能的声音中采样(默认 50)。
top_p采样:从累计概率达到 p 的最可能的声音中采样,0 到 1(默认 1)。
repetition_penalty避免自我重复的强度(默认 1.05)。
subtalker_dosample第二阶段是否进行采样(默认 True)。
subtalker_temperature第二阶段的温度,0 到 1(默认 0.9)。
subtalker_top_k第二阶段的 top k(默认 50)。
subtalker_top_p第二阶段的 top p,0 到 1(默认 1)。
max_new_tokens生成声音的上限,以其编解码器的 token 数为单位,1 到 8192(此处默认 8192:fal 自身的默认值 200 可能会把长句截断)。
voice
¶
声音(默认:由模型决定)。
language
¶
语言(默认 "Auto":文本自身的语言)。
prompt
¶
以文字描述如何朗读(而非朗读什么内容)(默认:无)。
speaker_voice_embedding_file_url
¶
克隆声音:由 fal-ai/qwen-3-tts/clone-voice 生成的说话人嵌入的 URL;它会覆盖
voice 和 prompt(默认:无)。
reference_text
¶
克隆声音的录音所朗读的内容,有助于让合成声音更像原声(默认:无)。
temperature
¶
朗读的变化程度,大于 0 且不超过 1(默认 0.9)。
top_k
¶
采样:从 k 个最可能的声音中采样(默认 50)。
top_p
¶
采样:从累计概率达到 p 的最可能的声音中采样,0 到 1(默认 1)。
repetition_penalty
¶
避免自我重复的强度(默认 1.05)。
subtalker_dosample
¶
第二阶段是否进行采样(默认 True)。
subtalker_temperature
¶
第二阶段的温度,0 到 1(默认 0.9)。
subtalker_top_k
¶
第二阶段的 top k(默认 50)。
subtalker_top_p
¶
第二阶段的 top p,0 到 1(默认 1)。
max_new_tokens
¶
生成声音的上限,以其编解码器的 token 数为单位,1 到 8192(此处默认 8192:fal 自身的默认值 200 可能会把长句截断)。
字幕¶
add_subcaption
¶
为影片添加字幕:content 从现在起加 offset 开始显示,持续
duration 秒。
影片的 captions 持有它,连同其语音的字幕;
manimgx render 将其作为字幕写入视频旁。
content字幕的文本。
duration显示时长,以秒为单位。
offset距现在多久后开始,以秒为单位。
源码
manimgx\scene.py
自定义语音¶
语音是从文本到 Speech 的任意函数:一种知道它的词语以及每个词何时说出的声音。任何文本转语音服务都可以成为一个语音。
Word
¶
timed
¶
text 的词语,由 voice 对其定时片段按顺序计时(其字符
或其标记):每个词从其第一个字母所在片段的开始到
其最后一个字母所在片段的结束。若片段未拼出文本的字母
(voice 将 "2" 说成 "two")则为空:其词语随后被估算。
源码
manimgx\audio\sound.py
estimate
¶
text 中每个词在 samples 中被说出的时间,估算得出:音频的发声跨度
按词语的字母数分配给各词,逗号或句号后的停顿会获得更多份额。
源码
manimgx\audio\sound.py
cached
¶
voice 为 text 说出的内容:说出一次,然后保存在 folder 中,作为其音频和
一个包含其词语的 JSON,以文本以及 voice 和文本的摘要命名。
音频可以被替换(相同词语的录音,引擎能读取的任何格式, 同名文件下):其词语随后从它重新计时。
源码
manimgx\audio\sound.py