分123先週のレシピでは,mbrolaを使った音声合成と,MeCabを使った形態素解析のレシピをお届けしました。先週のレシピに対するお詫びまず先週の内容に関して2点お詫びがあります。1点目はMbrolaの「フリーなライセンス」という言及です。オープンソースソフトウェアにおいてフリーとは「自由な」ことを指しますから,ソースが公開されておらず改良する自由を持たないmbrolaは,フリーなライセンスが適用されたソフトウェアではありません。筆者の意図は,「⁠広く使うことができるように配慮されている」というところにあり,それはMbrolaプロジェクトの目的の一つでもあります。2点目は,MeCabの解析結果には表示されていない情報もあり,それを利用するとより自然な音声を目指すことができるという点です。確かにMeCabには表示されないパラメーターがありますが,自然な音声を目指してそれを利用してもあまり意味はありません。筆者の意図としては単語間の文法的,意味的な関係のパラメーターを取得し,それをピッチに反映するというところにありましたが,MeCabはそういう目的のソフトウェアではありません。以上,筆者の理解不足と言葉の選択の誤りです。申し訳ございませんでした。今回は予告どおり,一連の流れを自動化するPythonスクリプトを作成してみます。Pythonを選択した理由は2つあります。ひとつはMeCabのPythonバインディングのパッケージが提供されていて都合が良かったこと,もうひとつは日本語文字の扱いが簡単そうなことです。後者を先に簡単に説明します。Pythonで日本語処理Mecabを通じて辞書から取得した「読み」をmbrolaの音素リストに変換するためには,日本語を1文字1文字処理する必要があります。冒頭の例「八戸」の読みである「ハチノヘ」を音素リストに変換するには,次を行う必要があります。「ハチノヘ」を「ハ⁠」⁠,「⁠チ⁠」⁠,「⁠ノ⁠」⁠,「⁠ヘ」に切り分けたリストを得るリストのそれぞれの要素に対して置換処理を行い,「⁠h⁠」⁠,「⁠a⁠」⁠,「⁠tS⁠」⁠,「⁠i⁠」⁠,「⁠n⁠」⁠,「⁠o⁠」⁠,「⁠h⁠」⁠,「⁠e」のリストを得るこれらの処理は注意して行わなければなりません。いうと,日本語文字(以下,日本語キャラクターと呼んでいきます)は1バイトでは表せないからです。命令が1バイトづつ処理するように実装されていたら,日本語キャラクターはうまく処理されず,予期しない結果が返ってきます。具体例を挙げて説明しましょう。命令が1バイト(8ビット)づつ処理するよう実装されている場合,「⁠0x61⁠」⁠,「⁠0x69⁠」⁠,「⁠0x75⁠」⁠,「⁠0x65⁠」⁠,「⁠0x6F」と1バイトづつとり出されても「a⁠」⁠,「⁠i⁠」⁠,「⁠u⁠」⁠,「⁠e⁠」⁠,「⁠o」となり,特に問題がありません。この処理系に「あいうえお」を与えてみましょう。E3818A」となります。上記の処理系でこれを扱うと「0xE3⁠」⁠,「⁠0x81⁠」⁠,「⁠0x82⁠」⁠・・・(⁠以下略)と取り出され,「⁠あ⁠」⁠,「⁠い⁠」⁠,「⁠う⁠」⁠,「⁠え⁠」⁠,「⁠お」に対応するビット列にはなりません。それでは3バイトずつ取り出すようにすればよいというわけでもなく,UTF-8はキャラクターに応じて1バイトから4バイトで表現するるため,ビット幅固定の処理そのものが不適切な実装です。歴史的経緯により,アルファベットなどラテン文字のキャラクターは1バイトで表現できるように定められているのが一般的です。そのため,1バイトずつ処理する処理系で十分でした。日本語や中国語,韓国語などは,256キャラクターしか表現できない1バイトでは到底足りません。そこで複数のバイトを使って表現するわけですが,このような実装は上記の1バイト処理系では適切に扱うことができません。日本語を処理するにあたりこれでは困ります(注1⁠)⁠。Pythonではこの問題に対し,インタープリター内で文字列をUnicodeによるビット列で表現し,このビット列を操作する専用の命令をオブジェクトのメソッドとして提供することで対応しています。Python2と3で違いがあり,Python2ではUnicode型のインスタンスを使う必要がありますが,Python3では文字列のオブジェクト自体がデフォルトでUnicodeとなります。そのため,Python2とPython3でスクリプトの書き方を変える必要があります。Python2でUnicode型のインスタンスを作成する場合,「⁠u""」や「U""」のリテラルを用います。文字列型オブジェクトをUnicode型に変換するには,文字列型の文字符号化方式を引数にunicode()関数を実行します。"utf-8")」とします。この際,文字列型stringがどのような文字符号化方式のビット列となっているかを,あらかじめ知っておく必要がありますので注意してください。して作成したUnicode型オブジェクトのインスタンスは,正しくシーケンス処理をすることができます。一文字づつ取り出すなら次のようになります。print(character)今回は前後の要素をチェックするために添字付きのアクセスをする必要があったので,次のコードを多用しています。HOWTOが役に立つでしょう。注1筆者の個人的な体験ですが,ラテン文字キャラクターを扱う文化圏にいる人と話をした際,日本語のようなキャラクターを処理する際のこのような注意点を説明しても,すんなり理解してもらえないことがありました。「⁠日本語のキャラクターは一体いくつあるんだい?」と質問されて「うーん,数えきれないよ。万とかかな?」と答えて目を丸くされたのを覚えています。Studioのユーザ。Studioコミュニティで活動。いつかユーザ同士で合作するのが夢。2019」を開催しました。DAY1・DAY2の様子を注目セッションとともにお伝えします。LINEのエンジニア3名がイベントに先駆けて見どころを紹介します。コードの安全性・安定性を高める開発サイクル~テスト管理の効率を上げ,脆弱性診断を自動で行う~本連載では,連載「業務を改善する情報共有の仕掛け」を受けつつ,安全性・安定性を加えた開発サイクルについて考えていきます。若者世代から圧倒的な人気を誇るライブ配信&動画投稿コミュニティアプリ「MixChannel」(ミクチャ)の裏側(レコメンドシステムやサーバサイド開発など)について解説していきます。その他の連載CSS3アニメーションでつくるインターフェイス表現CSS3によるアニメーション表現を紹介していきます。その中でも,幅広い読者に応用してもらえるだろうインターフェイスを主なお題とします。MySQL道普請便り本連載では,MySQLを使ったアプリ開発・運用に関するノウハウをご紹介していきます。RecipeUbuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。JavaScriptセキュリティの基礎知識JavaScriptに関するセキュリティ上の問題はどこで発生し,どうすれば防ぐことができるのか?について解説していきます。〜システムをきちんと運用するための基礎知識システムは「作って終わり」ではなく,運用の中でさまざまな問題が発生します。問題の発生に備えて事前にどのような対応をしておくべきなのか,問題発生時に何をしなければならないのか,ポイントを解説していきます。きたみりゅうじの聞かせて珍プレーソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。Linuxのメンテナンスの傍ら,Linuxやオープンソースソフトと日々を過ごす著者が,その魅力とつきあい方を,エッセイ風味でお届けします。PRESS特別編集部員,さわやか笑顔のスーパーハカーはまちちゃんとネット大好き14歳わかばちゃんが,毎号,読者の皆さんから寄せられたおたよりを紹介します。皆さんの日頃の悩みにも答えちゃいますよ。]メールでのお知らせメールで次の案内をお送りしております。メールの配信を希望する方は,利用したい項目をチェックしてメールアドレスを入力し,[登録]ボタンをクリックしてください。UPDATES[ほぼ週間に1回]新刊メールマガジン[ほぼ週間に1回]電脳会議の各号案内[ほぼ1ヵ月半に1回]※変更する場合や停止する場合は,登録情報変更ページをご覧ください。※登録いただいたメールアドレスには,そのお知らせ以外,配信いたしません。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します。個別にライセンスが設定されている記事等はそのライセンスに従います。