【问题标题】:Powershell command for selecting audio device to output TTS to?用于选择音频设备以输出 TTS 的 Powershell 命令?
【发布时间】:2021-04-14 18:57:53
【问题描述】:

我有以下代码用于设置 TTS 并通过 powershell 发送消息:

Add-Type -AssemblyName System.speech
$speak = New-Object System.Speech.Synthesis.SpeechSynthesizer
$speak.Rate = 1
$speak.SelectVoice("Microsoft Hazel Desktop")
$speak.Volume = 50
$speak.Speak("Hello World")

如何指定我希望将其输出到哪个音频设备?它目前将其发送到任何设置为默认播放设备的设备,但我希望它可以播放到另一台设备。

我环顾四周,但只能找到有关更改播放音频设备的命令的结果,而不是向特定设备发送音频。

【问题讨论】:

    标签: powershell audio text-to-speech


    【解决方案1】:

    您可以使用GetInstalledVoices() 方法查看适合您的内容。

    $speak.GetInstalledVoices() | Select -ExpandProperty VoiceInfo | Select -ExpandProperty Name
    

    【讨论】:

    • 这不能回答我的问题
    【解决方案2】:

    Wave 输出在 vanilla .net 中有点困难,但您可以使用出色的 NAudio 库来做到这一点:

    
    Add-Type -AssemblyName System.speech
    
    # assuming NAudio.dll is downloaded and put in current folder - otherwise specify absolute path
    Add-Type -Path 'NAudio.dll';
    
    function SpeakToDevice($text, $deviceNumber = -1) {
        $speak = New-Object System.Speech.Synthesis.SpeechSynthesizer
        $speak.Rate = 1
        $speak.SelectVoice("Microsoft Hazel Desktop")
        $speak.Volume = 50;
    
        # write to memory stream
        $memstream = [System.IO.MemoryStream]::new();
        $speak.SetOutputToWaveStream($memstream);
        $speak.Speak($text);
        
        # convert to naudio stream
        $memstream.Position = 0;
        $wavStream = [NAudio.Wave.WaveFileReader]::new($memstream);
    
        # create playback event on specified device
        $wo = [NAudio.Wave.WaveOutEvent]::new();
        $wo.DeviceNumber = $deviceNumber;
        $wo.Init($wavStream);
        
        $wo.play();
    
        # wait for audio to stop
        while ($wo.PlaybackState -eq 'Playing') {
            Start-Sleep -Milliseconds 50;
        }
        
        # cleanup
        $wo.Dispose(); $wavStream.Dispose(); $memstream.Dispose();
        $speak.SetOutputToNull();
    }
    
    # enumerate through all available devices and try speaking through it
    get-range -stop ([NAudio.Wave.WaveOut]::DeviceCount - 1) | % {
        $deviceNumber = $_;
        $info = [NAudio.Wave.WaveOut]::GetCapabilities($deviceNumber);
        $name = $info.ProductName;
        Write-Host "Speaking on Device $deviceNumber ($name)"
        SpeakToDevice "Device Number $deviceNumber" $deviceNumber;
    }
    
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-25
      • 2023-03-03
      相关资源
      最近更新 更多