zoukankan      html  css  js  c++  java
  • 语音播报实时天气

    一、 让文本变成声音

         .Net里面自带了一个语音类库:System.Speech,调用系统的语音功能,就能实现string到语音的转换,很简单(记得先把电脑音量调大一下):
     //Add System.Speech reference first
     using System.Speech.Synthesis;
     
     var reader = new SpeechSynthesizer();
     reader.SpeakAsync("I'm a programer. Hello, world! ");

        Hello, world! 你听到了……这里我用了SpeakAsync方法,也就是异步执行,不会阻塞主线程。你也可以直接调用Speak()方法,也就是在一个线程里面——突然想到可以利用Speak()方法来调试程序,把断点或者Log换成Speak(): 当别人辛苦的翻阅数百行的日志--而你的电脑用悠扬的语音告诉你:“This user's entity is null, here is a bug!”,高端大气上档次呀!

    二、 获取本地实时天气

         园子里面有很多获取天气的API文章,这里就不介绍了,给一个CSDN链接,还算比较全:天气预报API接口大全

         我这里用的都是新浪的API,最简单快捷。获取本地的实时天气,分为两步:一、根据电脑公网IP 获取当前城市;二、根据城市获取天气信息。

     var webClient = new WebClient() { Encoding = Encoding.UTF8 };
     //Get location city
     var location = webClient.DownloadString("http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json");
     var json = new JavaScriptSerializer().Deserialize<dynamic>(location);
     //Read city from utf-8 format
     var city = HttpUtility.UrlDecode(json["city"]);

       获取到的地理信息是json格式,反序列成dynamic动态类型,不需要再去创建个类去和json数据对应,C#获取json数据就和javascript中的操作差不多了,用了当然这样也就肯定没有VS的智能感知。取到的省市信息都是UTF-8编码的,所以要取出来的话,进行Decode。

     //Get weather data(xml format)
     string weather = webClient.DownloadString(string.Format(
             "http://php.weather.sina.com.cn/xml.php?city={0}&password=DJOYnieT8234jlsK&day=0",
             HttpUtility.UrlEncode(json["city"], Encoding.GetEncoding("GB2312"))));
     //Console.WriteLine(weather);
     var xml = new XmlDocument();
     xml.LoadXml(weather);

       这次取到的天气信息就是XML格式的了,也很方便。但需要注意的是此,构建URL的时候要把城市采用GB2312格式编码,WebClient需要指定UTF-8格式。天气信息取到了,下面就是编字符串,让它说话了,这里附上全部的代码,总共23行:

     1     //Initialize Speaker
     2     var reader = new SpeechSynthesizer();
     3     reader.Speak("I'm a programer,Hello, World! ");
     4 
     5     var webClient = new WebClient() { Encoding = Encoding.UTF8 };
     6     //Get location city
     7     var location = webClient.DownloadString("http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json");
     8     var json = new JavaScriptSerializer().Deserialize<dynamic>(location);
     9     //Read city from utf-8 format
    10     var city = HttpUtility.UrlDecode(json["city"]);
    11     //Get weather data(xml format)
    12     string weather = webClient.DownloadString(string.Format(
    13         "http://php.weather.sina.com.cn/xml.php?city={0}&password=DJOYnieT8234jlsK&day=0",
    14         HttpUtility.UrlEncode(json["city"], Encoding.GetEncoding("GB2312"))));
    15     //Console.WriteLine(weather);
    16     var xml = new XmlDocument();
    17     xml.LoadXml(weather);
    18     //Get weather detail
    19     var root = xml.SelectSingleNode("/Profiles/Weather");
    20     var detail = root["status1"].InnerText + "" + root["direction1"].InnerText
    21                     + root["power1"].InnerText.Replace("-""") + "级,"
    22                     + root["gm_s"].InnerText + root["yd_s"].InnerText;
    23     reader.SpeakAsync("今天是" + DateTime.Now.ToShortDateString() + "" + city + " " + detail);
    Location Weather Detail Speaker
  • 相关阅读:
    golang 数据结构 优先队列(堆)
    leetcode刷题笔记5210题 球会落何处
    leetcode刷题笔记5638题 吃苹果的最大数目
    leetcode刷题笔记5637题 判断字符串的两半是否相似
    剑指 Offer 28. 对称的二叉树
    剑指 Offer 27. 二叉树的镜像
    剑指 Offer 26. 树的子结构
    剑指 Offer 25. 合并两个排序的链表
    剑指 Offer 24. 反转链表
    剑指 Offer 22. 链表中倒数第k个节点
  • 原文地址:https://www.cnblogs.com/Hans2Rose/p/WeatherSpeaker.html
Copyright © 2011-2022 走看看