Sommario:
- Passaggio 1: hardware
- Passo 2:
- Fase 3: Programmazione - Rilevamento della voce
- Fase 4: Programação - Exibir Previsão Do Tempo
- Fase 5: Programmazione - Exibir Notícias
- Fase 6: Conclusione
Video: Espelho Magico: 6 Passi
2025 Autore: John Day | [email protected]. Ultima modifica: 2025-01-12 07:31
Neste Instructables mostramos como criar um protótipo de um espelho inteligente que projeta informaçes de clima e notícias, utilizzando comandi di voz.
Embora seja o projeto de um espelho, não houve como utilizar um devido a contratempos.
Passaggio 1: hardware
Dragonboard 410c
Scheda audio mezzanino
Passo 2:
Per una programmazione per l'utilizzo di Visual Studio Community 2017, e una lingua c#. Un'interfaccia grafica per l'utilizzo dell'editor XAML per Visual Studio.
Fase 3: Programmazione - Rilevamento della voce
O primeiro passo, foi trabalhar com a detecção de voz. A placa Audio Mezzanine Board è possibile integrare microfoni, che foram utilizados per un rilevamento. No Visual Studio, utilizza una biblioteca Windows. Media. SpeechRecognition para decodificatore a voz.
Foi utilizado o método encontrado aqui para a inicialização da detecção de voz, que é mostrado também abaixo.
private async void InicializaVoz() { var idioma = new Windows. Globalization. Language("en-US"); Riconoscitore vocale = new Riconoscitore vocale (idioma); riconoscimento. StateChanged += RecognizerStateChanged; riconoscimento. ContinuousRecognitionSession. ResultGenerated += RecognizerResultGenerated; string nomefile = String. Format(SRGS_FILE); StorageFile grammarContentFile = wait Package. Current. InstalledLocation. GetFileAsync(fileName); SpeechRecognitionGrammarFileConstraint grammarConstraint = new SpeechRecognitionGrammarFileConstraint(grammarContentFile); riconosciuto. Constraints. Add(grammarConstraint); SpeechRecognitionCompilationResult compilationResult = attendi il riconoscimento. CompileConstraintsAsync(); if (compilationResult. Status == SpeechRecognitionResultStatus. Success) { Debug. WriteLine("Risultato: " + compilationResult. ToString()); attendono il riconoscimento. ContinuousRecognitionSession. StartAsync(); } else { Debug. WriteLine("Status: " + compilationResult. Status); } }
Após iniciar o reconhecimento, o metodo RecognizerResultGenerated ricebe os comandi che foram interpretados e compara con os comandi com os que estão configurados em um arquivo xml que foi criado e inserido na solução.
Come non puoi inserire o idioma português, os comandi utilizados foram show (mostrar) e hide (esconder)e o que deve ser showdo forecast (previsão) e news (notícias).
private async void RecognizerResultGenerated(SpeechContinuousRecognitionSession session, SpeechContinuousRecognitionResultGeneratedEventArgs args) {
int count = args. Result. SemanticInterpretation. Properties. Count;
// Verifica la presenza di tag diversi e inizializza le variabili
String target = args. Result. SemanticInterpretation. Properties. ContainsKey("target") ? args. Result. SemanticInterpretation. Properties["target"][0]. ToString(): "";
String cmd = args. Result. SemanticInterpretation. Properties. ContainsKey("cmd") ?
args. Result. SemanticInterpretation. Properties["cmd"][0]. ToString(): "";
String device = args. Result. SemanticInterpretation. Properties. ContainsKey("device") ?
args. Result. SemanticInterpretation. Properties["device"][0]. ToString(): "";
// Prima controlla a quale dispositivo si riferisce l'utente
if (cmd. Equals("mostra"))
{
if (device. Equals("forecast")) { Consulta_previsao(); } else if (device. Equals("news")) { Consulta_noticias(); } else { //Debug. WriteLine("Dispositivo sconosciuto"); }
} else if (cmd. Equals("nascondi"))
{
if (device. Equals("forecast")) { //Tempo. Text = ""; attendi this. Dispatcher. RunAsync(Windows. UI. Core. CoreDispatcherPriority. High, () => { // Ora funziona, perché è in esecuzione sul thread dell'interfaccia utente: this. Max_tit. Text = ""; this. Min_tit. Text = ""; this. Min. Text = ""; this. Max. Text = ""; this. Img_Tempo. Source = new BitmapImage(new Uri("ms-appx:///Images/blank.png"));
});
}
else if (device. Equals("news")) { wait this. Dispatcher. RunAsync(Windows. UI. Core. CoreDispatcherPriority. High, () => { // Questo ora funziona, perché è in esecuzione sul thread dell'interfaccia utente: this. News1. Text = ""; this. News2. Text = ""; this. News3. Text = ""; this. News4. Text = ""; this. News5. Text = ""; }); } else { // Debug. WriteLine("Dispositivo sconosciuto"); } } else { //Debug. WriteLine("Comando sconosciuto"); }
}
Fase 4: Programação - Exibir Previsão Do Tempo
Se o comando de voz rilevato per le previsioni dello spettacolo, o metodo Consulta_previsao richiede una richiesta HTTP o un sito CPTEC fa INPE, che restituisce una anteprima del tempo em um arquivo xml. Após a leitura do xml, uma imagem é mostrada na tela de acordo com a previsão e também são showdas as temperaturas máxima e mínima.
privato asincrono void Consulta_previsao() {
HttpClient httpcliente = new
//HttpResponseMessage resp = httpcliente. GetAsync("https://servicos.cptec.inpe.br/XML/cidade/222/previsao.xml"). Result; var resp = httpcliente. GetAsync("https://servicos.cptec.inpe.br/XML/cidade/222/previsao.xml"). Result; resp. EnsureSuccessStatusCode(); var respbody = resp. Content. ReadAsStringAsync(); XmlDocument previsao = new XmlDocument();
previsao. LoadXml(respbody. Result);
XmlElement root = previsao. DocumentElement;
XmlNodeList nodes = root. GetElementsByTagName("tempo");
string prevtempo = (nodes. Item(0). InnerText);
string prevtempo1 = (nodes. Item(1). InnerText); string prevtempo2 = (nodes. Item(2). InnerText); string prevtempo3 = (nodes. Item(3). InnerText); nodes = root. GetElementsByTagName("minima"); string tempmin = (nodes. Item(0). InnerText); nodes = root. GetElementsByTagName("maxima"); string tempmax = (nodes. Item(0). InnerText);
string rsulado_previsao = "";
interruttore (prec.)
{ case "ec": rsultado_previsao = "Chuvas_Isoladas.png"; rottura; case "ci": rsultado_previsao = "Chuvas_Isoladas.png"; rottura; case "c": rsultado_previsao = "Chuva.png"; rottura; case "in": rsultado_previsao = "Instavel.png"; rottura; case "pp": rsultado_previsao = "Chuva.png"; rottura; case "cm": rsultado_previsao = "Chuva.png"; rottura; case "cn": rsultado_previsao = "Chuvas_Isoladas_Noite.png"; rottura; case "pt": rsultado_previsao = "Chuva.png"; rottura; case "pm": rsultado_previsao = "Chuvas_Isoladas.png"; rottura; case "np": rsultado_previsao = "Chuva.png"; rottura; case "pc": rsultado_previsao = "Chuva.png"; rottura; case "pn": rsultado_previsao = "Nublado.png"; rottura; case "cv": rsultado_previsao = "Chuva.png"; rottura; case "ch": rsultado_previsao = "Chuva.png"; rottura; case "t": rsultado_previsao = "Tempestade.png"; rottura; case "ps": rsulado_previsao = "Sol.png"; rottura; case "e": rsultado_previsao = "Sol_Encoberto.png"; rottura; case "n": rsultado_previsao = "Nublado.png"; rottura; case "cl": rsultado_previsao = "Sol.png"; rottura; case "nv": rsultado_previsao = "Nevoeiro.png"; rottura; case "g": rsultado_previsao = "Neve.png"; rottura; case "ne": rsultado_previsao = "Neve.png"; rottura; case "nd": rsultado_previsao = "na.png"; rottura; case "pnt": rsultado_previsao = "Chuvas_Isoladas_Noite.png"; rottura; case "psc": rsultado_previsao = "Chuva.png"; rottura; case "pcm": rsultado_previsao = "Chuva.png"; rottura; case "pct": rsultado_previsao = "Chuva.png"; rottura; case "pcn": rsultado_previsao = "Chuva.png"; rottura; case "npt": rsultado_previsao = "Chuva.png"; rottura; case "npn": rsultado_previsao = "Chuva.png"; rottura; case "ncn": rsultado_previsao = "Chuva.png"; rottura; case "nct": rsultado_previsao = "Chuva.png"; rottura; case "ncm": rsultado_previsao = "Chuva.png"; rottura; case "npm": rsulado_previsao = "Chuva.png"; rottura; case "npp": rsultado_previsao = "Chuva.png"; rottura; case "vn": rsultado_previsao = "Instavel.png"; rottura; case "ct": rsultado_previsao = "Chuva.png"; rottura; case "ppn": rsultado_previsao = "Chuvas_Isoladas_Noite.png"; rottura; case "ppt": rsultado_previsao = "Chuva.png"; rottura; case "ppm": rsultado_previsao = "Chuva.png"; rottura;
}
attendi this. Dispatcher. RunAsync(Windows. UI. Core. CoreDispatcherPriority. High, () => { // Ora funziona, perché è in esecuzione sul thread dell'interfaccia utente: this. Max_tit. Text = "Máxima"; this. Min_tit. Text = "Mínima"; this. Min. Text = tempmin + "°"; this. Max. Text = tempmax + "°"; this. Img_Tempo. Source = new BitmapImage(new Uri("ms-appx:/// Immagini/" + rsulado_previsao)); });
}
Fase 5: Programmazione - Exibir Notícias
Se o comando rilevato per notizie di spettacolo, o metodo Consulta_noticias richiede una richiesta HTTP o feed di notizie da BBC, che também restituisce um XML. Come cinco primeiras notícias são exibidas na tela em textblocks.
privato asincrono void Consulta_noticias() {
HttpClient httpcliente2 = new
var resp2 =
resp2. EnsureSuccessStatusCode(); var respbody2 = resp2. Content. ReadAsStringAsync(); XmlDocument noticia = new XmlDocument();
noticia. LoadXml(respbody2. Result);
XmlElement root2 = noticia. DocumentElement;
XmlNodeList nodes2 = root2. GetElementsByTagName(@"title");
aspetta questo. Dispatcher. RunAsync(Windows. UI. Core. CoreDispatcherPriority. High, () =>
{ this. News1. Text = (nodes2. Item(2). InnerText); this. News2. Text = (nodes2. Item(3). InnerText); this. News3. Text = (nodes2. Item(4). InnerText); this. News4. Text = (nodes2. Item(5). InnerText); this. News5. Text = (nodes2. Item(6). InnerText);
});
}
Fase 6: Conclusione
Inoltre, è possibile riprodurre le istruzioni, se possibile realizzare il rilevamento dei comandi di voz utilizando alguma placa con Windos IoT Core installato. Basta criar o arquivo de gramática com os comandi desejados.
Autore: Egon Patrick Marques Silva
Frederico Clark