{"id":1472,"date":"2019-02-22T22:41:24","date_gmt":"2019-02-22T13:41:24","guid":{"rendered":"https:\/\/www.rocher.kyoto.jp\/arbr\/?p=1472"},"modified":"2019-03-23T19:34:37","modified_gmt":"2019-03-23T10:34:37","slug":"%e5%8f%a4%e3%81%84android%e3%81%a8%e3%83%a9%e3%82%ba%e3%83%91%e3%82%a4%e3%81%a7%e5%a4%9a%e6%a9%9f%e8%83%bd%e3%83%a2%e3%83%8b%e3%82%bf%e3%83%bc%e3%82%92%e4%bd%9c%e3%82%8b","status":"publish","type":"post","link":"https:\/\/www.rocher.kyoto.jp\/arbr\/?p=1472","title":{"rendered":"\u53e4\u3044Android\u3068\u30e9\u30ba\u30d1\u30a4\u3067\u591a\u6a5f\u80fd\u30e2\u30cb\u30bf\u30fc\u3092\u4f5c\u308b"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">\u76ee\u7684<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u4ee5\u524d<a href=\"https:\/\/www.rocher.kyoto.jp\/arbr\/?p=1455\">\u4f5c\u3063\u305f<\/a>\u5e97\u306e\u547c\u3073\u51fa\u3057\u30d6\u30b6\u30fc\u306f\u62bc\u3055\u308c\u305f\u3089line&amp;\u30e1\u30fc\u30eb\u901a\u77e5\u3092\u98db\u3070\u3059\u3088\u3046\u306b\u306a\u3063\u3066\u3044\u308b\u3002\u305f\u3060\u3057\u3001\u62bc\u3057\u305f\u5074\u304b\u3089\u307f\u308b\u3068\u306a\u3093\u306e\u53cd\u5fdc\u3082\u7121\u3044\u305f\u3081\u52d5\u4f5c\u3057\u3066\u3044\u308b\u304b\u4e0d\u5b89\u3002\u306a\u306e\u3067\u3001google\u30af\u30e9\u30a6\u30c9\u3067\u5408\u6210\u3055\u305b\u305f\u97f3\u58f0\u3092\u53e4\u3044Android\u3067\u6d41\u3059\u3088\u3046\u306b\u3057\u305f\u3002\uff08+\u753b\u9762\u3067\u30e1\u30c3\u30bb\u30fc\u30b8\u8868\u793a\uff09<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u306a\u304a\u3001\u3053\u306e\u8a18\u4e8b\u3092\u66f8\u3044\u3066\u3044\u308b\u6bb5\u968e\u3067\u306f\u30a8\u30df\u30e5\u30ec\u30fc\u30bf\u3067\u52d5\u3044\u305f\u306e\u307f\u3002\u5b9f\u6a5f\u306f\u53e4\u3059\u304e\u3066\u73fe\u884c\u306eAndroidStudio\u3067\u7d20\u76f4\u306b\u30d3\u30eb\u30c9\u3067\u304d\u3066\u3044\u306a\u3044\u3002\u30d3\u30eb\u30c9\u3059\u308b\u65b9\u6cd5\u3092\u8abf\u3079\u3066\u304b\u3089\u518d\u6311\u6226\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u74b0\u5883<br><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u547c\u51fa\u5074<br><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u958b\u767a\u74b0\u5883<\/h4>\n\n\n\n<ul class=\"wp-block-list\"><li>OS Centos7<\/li><li>python 3.7.0<\/li><li>the Cloud Client Libraries for the Cloud Text-to-Speech API \u306e\u30a2\u30eb\u30d5\u30a1\u7248(\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u304c\u53e4\u3044\u3060\u3051\u304b\u3082)<\/li><li><\/li><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">\u60f3\u5b9a\u74b0\u5883<\/h4>\n\n\n\n<ul class=\"wp-block-list\"><li>raspberry pi typeB<\/li><li>python 3.7.0<\/li><li>the Cloud Client Libraries for the Cloud Text-to-Speech API \u306e\u30a2\u30eb\u30d5\u30a1\u7248(\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u304c\u53e4\u3044\u3060\u3051\u304b\u3082)<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u89e6\u3063\u305f\u9650\u308a\u3001\u672c\u756a\u74b0\u5883\u7528\u306eraspberry pi typeB\u3067\u52d5\u4f5c\u306f\u3059\u308b\u3082\u306e\u306eCloud Text-to-Speech API\u306e\u547c\u51fa\u304c\u91cd\u3044\u300210\u6587\u5b57\u7a0b\u5ea6\u30673\u79d2\u307b\u3069\u3002gRPC\u306e\u63a5\u7d9a\/\u6697\u53f7\u5316\u51e6\u7406\u5468\u308a\u3067cpu\u304c\u3044\u3063\u3071\u3044\u3044\u3063\u3071\u3044\u306b\u306a\u3063\u3066\u3044\u308b\u6a21\u69d8\u3067\u7aef\u672b\u80fd\u529b\u306e\u554f\u984c\u3068\u601d\u3046\u3002<br><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u547c\u3073\u51fa\u3055\u308c\u308b\u5074(android)<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u958b\u767a\u74b0\u5883<br><\/h4>\n\n\n\n<ul class=\"wp-block-list\"><li>android studio 3.3.1<\/li><li>SHL22<\/li><li>Android\u30d0\u30fc\u30b8\u30e7\u30f3 4.2.2<\/li><li>compileSdkVersion\/targetSdkVersion 28<\/li><li>minSdkVersion 16 (\u958b\u767a\u7aef\u672b\u304c\u3053\u306e\u6642\u4ee3\u306e)<\/li><li>com.nanohttpd:nanohttpd-webserver:2.1.1<\/li><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">\u60f3\u5b9a\u74b0\u5883<\/h4>\n\n\n\n<ul class=\"wp-block-list\"><li>IS11PT<\/li><li>Android\u30d0\u30fc\u30b8\u30e7\u30f32.3.4<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u7aef\u672b\u304c\u53e4\u3059\u304e\u308b\u306e\u3067\u958b\u767a\u74b0\u5883\u3092\u7c21\u5358\u306b\u6574\u3048\u3089\u308c\u306a\u304b\u3063\u305f\u306e\u3067\u3001\u307e\u305a\u306f\u65b0\u3057\u3081\uff08\u3068\u3044\u3063\u3066\u30828\u5e74\u3050\u3089\u3044\u524d\uff09\u306e\u7aef\u672b\u3067\u4f5c\u6210\u3002<br><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u547c\u51fa\u5074\u6a5f\u80fd<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u6982\u8981<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">google\u306eText-to-Speech API \u3092\u547c\u3073\u51fa\u3057\u3066\u3001request\u3067Android\u5185\u306b\u8d77\u52d5\u3055\u305b\u3066\u3044\u308bnanohttps\u306bpost\u3092\u3059\u308b\u306e\u307f\u3002Text-to-Speech API\u306f\u307b\u307c<a href=\"https:\/\/cloud.google.com\/text-to-speech\/docs\/reference\/libraries?hl=ja\">\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8<\/a>\u3069\u304a\u308a\u3002request\u306e\u30d5\u30a1\u30a4\u30eb\u306e\u3068\u3053\u308d\u306f\u30d1\u30e9\u30e1\u30fc\u30bf\u306bMIME\u30bf\u30a4\u30d7\u307e\u3067\u3057\u3066\u3044\u3057\u3066\u3084\u3089\u306a\u3044\u3068Android\u5074\u3067\u4f7f\u3063\u3063\u3066\u3044\u308bnanohttpd\u3067\u30d5\u30a1\u30a4\u30eb\u3092\u3088\u307f\u8fbc\u3081\u306a\u304b\u3063\u305f\u306e\u3067\u6ce8\u610f\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u30bd\u30fc\u30b9<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env python3\n# coding: utf-8\nimport requests\n\nfrom google.cloud import texttospeech\n\ndef make_voice(current_time):\n    _make_voice(current_time,\"\u5c11\u3005\u304a\u5f85\u3061\u304f\u3060\u3055\u3044\")\n\ndef _make_voice(current_time,msg):\n    file_name = 'output.mp3'\n    client = texttospeech.TextToSpeechClient()\n    synthesis_input = texttospeech.types.SynthesisInput(text=msg)\n\n    voice = texttospeech.types.VoiceSelectionParams(\n        language_code='ja-JP',\n        ssml_gender=texttospeech.enums.SsmlVoiceGender.NEUTRAL)\n    audio_config = texttospeech.types.AudioConfig(\n        audio_encoding=texttospeech.enums.AudioEncoding.MP3)\n\n    response = client.synthesize_speech(synthesis_input, voice, audio_config)\n\n    with open('output.mp3', 'wb') as out:\n        out.write(response.audio_content)\n\n    url = 'http:\/\/127.0.0.1:8081\/msg\/'\n    files = {'file': (file_name,open(file_name, 'rb'),'audio\/mpeg')}\n    payload = {\"message\" :  msg}\n    r = requests.post(url ,files=files ,params=payload)\n    print(r)\nif __name__ == '__main__':\n    make_voice( '2019\/02\/12 \u56fa\u5b9a' )<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u547c\u3073\u51fa\u3055\u308c\u308b\u5074<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u6982\u8981<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u5185\u90e8\u3067\u7acb\u3061\u4e0a\u3052\u3066\u3044\u308bnanohttpd\u3067\u60c5\u5831\uff08\u30ea\u30af\u30a8\u30b9\u30c8\uff09\u3092\u53d7\u3051\u53d6\u3063\u3066\u3001\u97f3\u58f0\u518d\u751f\u3057\u753b\u9762\u306b\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u51fa\u3057\u3066\u304a\u304f\u3002\u3061\u306a\u307f\u306b\u3001\u53e4\u3044\u30d0\u30fc\u30b8\u30e7\u30f3\u3067\u52d5\u304b\u305d\u3046\u3068\u3057\u3066\u305f\u306e\u3067\u6587\u6cd5\u304c\u53e4\u3044\u3082\u306e\u304b\u3089\u65b0\u3057\u3044\u3082\u306e\u307e\u3067\u6df7\u5728\u3057\u3066\u3044\u308b\u306e\u3067\u9069\u5b9c\u8aad\u307f\u66ff\u3048\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package jp.co.epea.monitor;\n\nimport android.media.MediaPlayer;\nimport android.os.Handler;\nimport android.widget.TextView;\n\n\nimport java.io.IOException;\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport fi.iki.elonen.NanoHTTPD;\n\nimport static fi.iki.elonen.NanoHTTPD.Response.Status.NOT_FOUND;\nimport static fi.iki.elonen.NanoHTTPD.Response.Status.OK;\n\npublic class MoniterServer extends NanoHTTPD {\n    private Handler handler;\n    private TextView textView;\n\n    public MoniterServer(Handler handler, TextView textView) {\n        super(8080);\n        this.handler = handler;\n        this.textView = textView;\n\n    }\n\n    @Override\n    public Response serve(IHTTPSession session) {\n        Method method = session.getMethod();\n        String uri = session.getUri();\n\n        System.out.println(method + \" '\" + uri + \"' \");\n        if (uri.equals(\"\/msg\/\")) {\n            final String msg = session.getParms().get(\"message\");\n\n\n            Map&lt;String, String> files = new HashMap&lt;>();\n            try {\n                session.parseBody(files);\n            } catch (IOException ioe) {\n                return new NanoHTTPD.Response(NOT_FOUND, MIME_HTML, \"none\");\n            } catch (ResponseException re) {\n                return new Response(re.getStatus(), MIME_PLAINTEXT, re.getMessage());\n            }\n\n            MediaPlayer player = new MediaPlayer();\n            try {\n                player.setDataSource(files.get(\"file\"));\n                player.prepare();\n                player.start();\n            } catch (IOException e) {\n                e.printStackTrace();\n            }\n\n            handler.post(new Runnable() {\n                @Override\n                public void run() {\n                    textView.setText(msg);\n                }\n            });\n            return new NanoHTTPD.Response(OK, MIME_HTML, \"ok\");\n        } else if (uri.equals(\"\/clear\/\")) {\n            handler.post(new Runnable() {\n                @Override\n                public void run() {\n                    textView.setText(\"\");\n                }\n            });\n            return new NanoHTTPD.Response(OK, MIME_HTML, \"ok\");\n        }\n        return new NanoHTTPD.Response(NOT_FOUND, MIME_HTML, \"none\");\n    }\n}\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u3044\u3064\u3082\u3069\u304a\u308a\u95a2\u4fc2\u306a\u3044\u3051\u3069<br><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u305d\u3046\u3044\u3048\u3070<a href=\"https:\/\/natsuko.z31.web.core.windows.net\/\">\u5ac1\u306e\u30b5\u30a4\u30c8<\/a>\u3092azure\u306b\u3082\u7f6e\u304d\u307e\u3057\u305f<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u76ee\u7684 \u4ee5\u524d\u4f5c\u3063\u305f\u5e97\u306e\u547c\u3073\u51fa\u3057\u30d6\u30b6\u30fc\u306f\u62bc\u3055\u308c\u305f\u3089line&amp;\u30e1\u30fc\u30eb\u901a\u77e5\u3092\u98db\u3070\u3059\u3088\u3046\u306b\u306a\u3063\u3066\u3044\u308b\u3002\u305f\u3060\u3057\u3001\u62bc\u3057\u305f\u5074\u304b\u3089\u307f\u308b\u3068\u306a\u3093\u306e\u53cd\u5fdc\u3082\u7121\u3044\u305f\u3081\u52d5\u4f5c\u3057\u3066\u3044\u308b\u304b\u4e0d\u5b89\u3002\u306a\u306e\u3067\u3001google\u30af\u30e9\u30a6\u30c9\u3067\u5408\u6210\u3055\u305b\u305f\u97f3\u58f0\u3092\u53e4\u3044An [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26,113,100],"tags":[],"class_list":["post-1472","post","type-post","status-publish","format-standard","hentry","category-android","category-python","category-raspberrypi"],"_links":{"self":[{"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=\/wp\/v2\/posts\/1472","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1472"}],"version-history":[{"count":4,"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=\/wp\/v2\/posts\/1472\/revisions"}],"predecessor-version":[{"id":1484,"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=\/wp\/v2\/posts\/1472\/revisions\/1484"}],"wp:attachment":[{"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1472"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1472"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1472"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}