Powershell может говорить, но может ли он писать, если я говорю?

Ниже приводится способ заставить powershell говорить.

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

На самом деле я хотел бы сделать противоположное. Если я говорю, могу ли он преобразовать его в буквы.

Если я скажу в своем звукозаписывающем устройстве "Эй, я могу говорить", он преобразуется в текст?

Если возможно, посоветуйте мне, как его достичь?

Ответы

Ответ 1

Похоже, вы можете с System.Speech.Recognition. Вот пример использования в PowerShell:

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

Эта ссылка прошла 404, поэтому я выкопал ее с обратной стороны машины.

управляйте своим ПК голосом... и PowerShell

Джоэл 'Jaykul' Bennett 25-Jun-2009

Вы когда-нибудь хотели уметь задавать вопросы о своем компьютере и отвечать на него вслух? Вы когда-нибудь задумывались, может ли ваш компьютер больше походить на тех, кто работает в Star Trek Enterprise, отвечая на голосовые запросы и команды? вы играли с домашней автоматизацией ZWave или X10 и считали, что управление голосом на ваших устройствах станет очевидным следующим шагом?

Хорошо, хорошо... Я не собираюсь показывать вам, как включать свет или работать с домашней автоматикой, - но это главное, что заставляет меня задуматься над этим материалом для распознавания голоса. Какой выродка не хочет ходить в гостиную и говорить "Компьютер: светится" и работать?

Вместо этого, в качестве первого шага ко всему этому, позвольте мне показать вам, как использовать PowerShell для создания простых скриптов распознавания голосовой команды... которые могут запускать любой PowerShell script, который вы хотите написать! Следующий код действительно является модулем, хотя вы можете просто указать его как script, и для этого действительно нужен PowerShell 2.0, хотя было бы тривиально реорганизовать его для работы с PowerShell 1.0 с использованием библиотеки Oisins PSEventing.

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

## Create the two main objects we need for speech recognition and synthesis
if(!$Global:SpeechModuleListener){## For XP sake, don't create them twice...
   $Global:SpeechModuleSpeaker =new-objectSystem.Speech.Synthesis.SpeechSynthesizer
   $Global:SpeechModuleListener =new-objectSystem.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-objectSystem.Speech.Recognition.Choices
   foreach($choice in$Script:SpeechModuleMacros.GetEnumerator()){
      New-ObjectSystem.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-ObjectSystem.Speech.Recognition.GrammarBuilder"$Computer, "
   $builder.Append((New-ObjectSystem.Speech.Recognition.SemanticResultKey"Commands", 
                                                         $choices.ToGrammarBuilder()))
   $grammar = new-objectSystem.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

В основном это одна из функций, о которых вам нужно беспокоиться: New-VoiceCommands. Вы передаете ему хеш-таблицу, которая отображает строки в скриптовые блоки, и если вы используете -Listenswitch, то все, что там есть. Вы также можете вручную вызвать Start-Listening, и, конечно же, Ive предоставил функцию Say, чтобы упростить работу компьютера...

Как только компьютер "прослушивает"... вы просто произносите его имя, а затем одну из своих команд. Мне это нравится, потому что это гарантирует, что я не запускаю сценарии случайно, но вы можете удалить строку ${Env:ComputerName}, с начала GrammarBuilder, если вы считаете, что это не необходимо, или вы можете жестко скопировать его на что-то другое, кроме имени вашего компьютера, например, "Хэл, пожалуйста, я прошу тебя..." или "Компьютер, пожалуйста" или что-то еще. 

Вы можете многое сделать с этим... что-нибудь, действительно... но, чтобы дать вам пример, который вы можете легко понять, я собираюсь сделать что-то очень простое, и мой компьютер просто ответит на несколько основных вопросов, обратившись назад для меня, а затем добавьте несколько команд, чтобы запустить приложение или веб-страницу.

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 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" } }

Вы понимаете, насколько это легко? Вы можете использовать "Говорить", чтобы говорить любой текст (хотя sometext получит лучшие результаты, чем другие), и вы можете вызывать любые другие команды powershell, включая команды HttpRest для извлечения веб-данных или команды WASP для автоматизации Windows или команды PowerBoots для отображения вывод в большом тексте или командлеты для управления устройствами X10 или ZWave... вы знаете, что угодно 

Ответ 2

Распознавание речи по-прежнему является экспериментальной технологией. Есть некоторые .Net framework ресурсы, даже с пример, Не ожидайте создания PowerShiri в ближайшее время.

Ответ 3

Технология немного прошлая "экспериментальная", но она далека от надежной.

Exchange делает это сейчас с опцией "Предварительный просмотр голосовой почты" в единой системе обмена сообщениями. Результаты могут варьироваться от довольно хороших до веселых, в зависимости от динамика.