20

以下は、PowerShellを話すようにする方法です。

Add-Type -AssemblyName System.Speech
$synthesizer = New-Object -TypeName System.Speech.Synthesis.SpeechSynthesizer
$synthesizer.Speak('Hey, I can speak!')

実は逆にやりたいです。私が話す場合、PowerShellはそれを文字に変換できます。

サウンドレコーダーで「ねえ、話せます」と言ったら、テキストに変換されますか?

可能であれば、それを達成する方法を教えてください。

4

3 に答える 3

10

でできるように見えますSystem.Speech.Recognition。PowerShellで記述された使用例も次のとおりです。

http://huddledmasses.org/control-your-pc-with-your-voice-and-powershell/

このリンクは404になったので、バックマシンの邪魔にならないように掘りました。

あなたの声であなたのPCを制御する…そしてPowerShell

2009年6月25日にJoel'Jaykul'Bennettによって

コンピューターに質問をして大声で答えてもらいたいと思ったことはありませんか?コンピューターがスタートレックエンタープライズを実行しているコンピューターに似ていて、音声クエリやコマンドに応答できるかどうか疑問に思ったことはありませんか?ZWaveまたはX10ホームオートメーションで遊んだことがあり、デバイスの音声制御が次のステップになると思いましたか?

ええと、わかりました…ライトをオンにする方法やホームオートメーションを操作する方法については説明しませんが、それが私がこの音声認識に関することを考え続ける主な理由です。居間に足を踏み入れて「コンピューター:ライトオン」と言って動作させたくないオタクは誰ですか?

代わりに、そのすべての最初のステップとして、PowerShellを使用して簡単な音声コマンド認識スクリプトを実行する方法を紹介します。これにより、作成したいPowerShellスクリプトを起動できます。次のコードは実際にはモジュールですが、スクリプトとしてドットソースすることができ、イベントにはPowerShell 2.0が必要ですが、OisinのPSEventingライブラリを使用してPowerShell1.0で動作するようにリファクタリングするのは簡単です。

$null = [Reflection.Assembly]::LoadWithPartialName("System.Speech")

## Create the two main objects we need for speech recognition and synthesis
if (!$global:SpeechModuleListener) {
    ## For XP's sake, don't create them twice...
    $global:SpeechModuleSpeaker = New-Object System.Speech.Synthesis.SpeechSynthesizer
    $global:SpeechModuleListener = New-Object System.Speech.Recognition.SpeechRecognizer
}

$script:SpeechModuleMacros = @{}
## Add a way to turn it off
$script:SpeechModuleMacros.Add("Stop Listening", {$script:listen = $false; Suspend-Listening})
$script:SpeechModuleComputerName = ${env:ComputerName}

function Update-SpeechCommands {
    #.Synopsis 
    #  Recreate the speech recognition grammar
    #.Description
    #  This parses out the speech module macros, 
    #  and recreates the speech recognition grammar and semantic results, 
    #  and then updates the SpeechRecognizer with the new grammar, 
    #  and makes sure that the ObjectEvent is registered.
    $choices = New-Object System.Speech.Recognition.Choices
    foreach ($choice in $script:SpeechModuleMacros.GetEnumerator()) {
        New-Object System.Speech.Recognition.SemanticResultValue $choice.Key, $choice.Value.ToString() |
            ForEach-Object { $choices.Add($_.ToGrammarBuilder()) }
    }

    if ($VerbosePreference -ne "SilentlyContinue") {
        $script:SpeechModuleMacros.Keys |
            ForEach-Object { Write-Host"$Computer, $_" -Fore Cyan }
    }

    $builder = New-Object System.Speech.Recognition.GrammarBuilder"$Computer, "
    $builder.Append((New-ObjectSystem.Speech.Recognition.SemanticResultKey"Commands", $choices.ToGrammarBuilder()))
    $grammar = New-Object System.Speech.Recognition.Grammar $builder
    $grammar.Name = "Power VoiceMacros"

    ## Take note of the events, but only once (make sure to remove the old one)
    Unregister-Event"SpeechModuleCommandRecognized" -ErrorAction SilentlyContinue
    $null = Register-ObjectEvent $grammar SpeechRecognized `
                -SourceIdentifier"SpeechModuleCommandRecognized" `
                -Action {iex $event.SourceEventArgs.Result.Semantics.Item("Commands").Value}

    $global:SpeechModuleListener.UnloadAllGrammars()
    $global:SpeechModuleListener.LoadGrammarAsync($grammar)
}

function Add-SpeechCommands {
    #.Synopsis
    #  Add one or more commands to the speech-recognition macros, and update the recognition
    #.Parameter CommandText
    #  The string key for the command to remove
    [CmdletBinding()]
    Param([hashtable]$VoiceMacros,[string]$Computer=$Script:SpeechModuleComputerName)

    ## Add the new macros
    $script:SpeechModuleMacros += $VoiceMacros 
    ## Update the default if they change it, so they only have to do that once.
    $script:SpeechModuleComputerName = $Computer 
    Update-SpeechCommands
}

function Remove-SpeechCommands {
    #.Synopsis
    #  Remove one or more command from the speech-recognition macros, and update the recognition
    #.Parameter CommandText
    #  The string key for the command to remove
    Param([string[]]$CommandText)
    foreach ($command in $CommandText) {
        $script:SpeechModuleMacros.Remove($Command)
    }
    Update-SpeechCommands
}

function Clear-SpeechCommands {
    #.Synopsis
    #  Removes all commands from the speech-recognition macros, and update the recognition
    #.Parameter CommandText
    #  The string key for the command to remove
    $script:SpeechModuleMacros = @{}
    ## Default value: A way to turn it off
    $script:SpeechModuleMacros.Add("Stop Listening", {Suspend-Listening})
    Update-SpeechCommands
}

function Start-Listening {
    #.Synopsis
    #  Sets the SpeechRecognizer to Enabled
    $global:SpeechModuleListener.Enabled = $true
    Say "Speech Macros are $($Global:SpeechModuleListener.State)"
    Write-Host "Speech Macros are $($Global:SpeechModuleListener.State)"
}

function Suspend-Listening {
    #.Synopsis
    #  Sets the SpeechRecognizer to Disabled
    $global:SpeechModuleListener.Enabled = $false
    Say "Speech Macros are disabled"
    Write-Host "Speech Macros are disabled"
}

function Out-Speech {
    #.Synopsis
    #  Speaks the input object
    #.Description
    #  Uses the default SpeechSynthesizer settings to speak the string representation of the InputObject
    #.Parameter InputObject
    #  The object to speak 
    #  NOTE: this should almost always be a pre-formatted string,
    #        most objects don't render to very speakable text.
    Param([Parameter(ValueFromPipeline=$true)][Alias("IO")]$InputObject)
    $null = $global:SpeechModuleSpeaker.SpeakAsync(($InputObject | Out-String))
}

function Remove-SpeechXP {
    #.Synopis
    #  Dispose of the SpeechModuleListener and SpeechModuleSpeaker
    $global:SpeechModuleListener.Dispose(); $global:SpeechModuleListener = $null
    $global:SpeechModuleSpeaker.Dispose();  $global:SpeechModuleSpeaker = $null
}

Set-Alias asc Add-SpeechCommands
Set-Alias rsc Remove-SpeechCommands
Set-Alias csc Clear-SpeechCommands
Set-Alias say Out-Speech
Set-Alias listen Start-Listener
Export-ModuleMember -Function * -Alias * -VariableSpeechModuleListener, SpeechModuleSpeaker

ここで気にする必要のある関数は基本的に1つだけです。New-VoiceCommandsです。文字列をスクリプトブロックにマップするハッシュテーブルを渡します。-Listenswitchを使用すると、これですべてです。Start-Listeningを手動で呼び出すこともできます。もちろん、コンピューターに話しやすくするためにSay関数を提供しました...

コンピュータが「リッスン」したら...名前を言うだけで、その後にコマンドの1つが続きます。誤ってスクリプトを実行しないようにするので、それが好きですが、${Env:ComputerName},必要がないと思われる場合は、GrammarBuilderの先頭から文字列を削除するか、コンピューターの名前以外の名前にハードコーディングすることができます。 「ハル、お願いします、お願いします...」や「コンピューター、お願いします」などと言いますか?

これで多くのことができます...何でも、本当に...しかし、簡単に理解できる例を示すために、私は非常に単純なことを行い、コンピューターにいくつかの基本的な質問に答えてもらいます私に話しかけてから、いくつかのコマンドを追加して、アプリまたはWebページを起動させます。

Add-SpeechCommands @{
   "What time is it?" = { Say "It is $(Get-Date -f "h:mm tt")" }
   "What day is it?"  = { Say $(Get-Date -f "dddd, MMMM dd") }
   "What's running?"  = {
      $proc = ps | sort ws -desc
      Say $("$($proc.Count) processes, including $($proc[0].name), which is using " +
            "$([int]($proc[0].ws/1mb)) megabytes of memory")
   }
} -Computer "Laptop" -Verbose 

Add-SpeechCommands @{
    "Run Notepad"= { & "C:\Programs\DevTools\Notepad++\notepad++.exe"}
}
Add-SpeechCommands @{
    "Check Gee Mail" = { Start-Process"https://mail.google.com" }
}

あなたはそれがどれほど簡単か分かりますか?「Say」を使用して任意のテキストを話すことができ(一部のテキストは他のテキストよりも良い結果が得られます)、WebデータをフェッチするHttpRestコマンド、Windows自動化用のWASPコマンド、表示するPowerBootsコマンドなど、他のPowerShellコマンドを呼び出すことができます。大きなテキストで出力するか、X10またはZWaveデバイスを制御するためのコマンドレット...ご存知ですか?

于 2012-02-20T14:24:33.853 に答える
2

音声認識はまだ実験的な技術です。いくつかの .Net フレームワークリソースがあり、も含まれています。ただし、すぐに PowerSiri が作成されるとは思わないでください。

于 2012-02-20T13:42:19.657 に答える
1

この技術は「実験的」を少し過ぎていますが、信頼性にはほど遠いものです。

Exchange は、UM の [ボイスメール プレビュー] オプションを使用してこれを行うようになりました。結果は、スピーカーに応じて、かなり良いものから陽気なものまでさまざまです.

于 2012-02-20T17:09:52.997 に答える