You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PowerShell语音合成:Speak方法输出无法存入变量的问题咨询

关于PowerShell SpeechSynthesizer无法将语音存入变量的问题解答

嘿,刚好我对这个API比较熟悉,来给你拆解下问题所在和解决办法~

为什么Speak()方法无法把音频存入变量?

这完全是方法的设计逻辑导致的:

  • Speak()的核心作用是直接把合成的语音输出到系统扬声器播放,它的返回值只是一个表示播放状态的对象(比如是否成功完成),根本不是音频数据本身。你赋值给$man的其实只是这个状态信息,不是你想要的语音内容。
  • 默认情况下,SpeechSynthesizer的输出目标是系统音频设备,而不是内存或文件,所以它不会生成可被变量存储的音频数据对象。

怎么把合成的语音存入变量?

要捕获音频数据,你需要把语音合成器的输出目标改成内存流,这样就能把音频内容写入流中,再转存为变量。看下面的示例代码:

Add-Type -AssemblyName System.Speech
$speak = New-Object -TypeName System.Speech.Synthesis.SpeechSynthesizer

# 1. 创建一个内存流,用来存储合成的音频数据
$audioStream = New-Object System.IO.MemoryStream

# 2. 告诉语音合成器:把输出写到这个内存流里,而不是扬声器
$speak.SetOutputToWaveStream($audioStream)

# 3. 执行语音合成——这时候不会播放声音,而是把音频写入流
$speak.Speak("Male Voice")

# 4. 重置流的位置到开头,方便后续读取
$audioStream.Position = 0

# 5. 把流中的音频数据转为字节数组存入变量,这就是你要的内容
$audioBytes = $audioStream.ToArray()

# 可选:如果之后需要播放这个音频,或者保存为文件
# 比如用SoundPlayer播放内存流:
# $player = New-Object System.Media.SoundPlayer($audioStream)
# $player.Play()

# 最后记得把合成器的输出改回默认扬声器,方便后续直接播放
$speak.SetOutputToDefaultAudioDevice()

额外小提示

  • 如果用异步方法SpeakAsync(),记得要等待合成完成再处理内存流,不然可能会得到不完整的音频数据。
  • 捕获的字节数组可以直接保存为WAV文件,或者在程序中传递、处理,完全满足你“存入变量”的需求。

内容的提问来源于stack exchange,提问作者Sumeet Singh

火山引擎 最新活动