MacOSにおけるMigemoの設定

環境はMacOS 14.2.1 (Sonoma)、Emacs29.1。

migemoを使うためにcmigemoをインストールする。

brew install cmigemo

migemo.elはMELPAからインストールできる。

Emacsの設定は以下の通り。起動直後からmigemoを使うわけではないので、isearch中にC-eでトグルして有効化する。

(setq migemo-command "cmigemo")
(setq migemo-options '("-q" "--emacs"))
(setq migemo-dictionary
      "/opt/homebrew/Cellar/cmigemo/20110227/share/migemo/utf-8/migemo-dict")
(setq migemo-user-dictionary nil)
(setq migemo-regex-dictionary nil)
(setq migemo-coding-system 'utf-8-unix)
(autoload 'migemo-toggle-isearch-enable "migemo" nil t)
(define-key isearch-mode-map (kbd "C-e") 'migemo-toggle-isearch-enable)
(with-eval-after-load 'migemo
  (migemo-init)
  (setq migemo-isearch-enable-p nil))

mozc_emacs_helperをMacOS (Sonoma, Apple M1)でビルドし、Emacsからmozcを使う

はじめに

mozc_emacs_helperをビルドしてEmacsからmozcを使いたかったときのログ。

Mozcのビルド手順

あらかじめ、XCodeやBazelのインストールは済ませておく。

リポジトリをクローンし、Mozcをビルド&インストールする。

$ python3 -m pip install requests
$ git clone https://github.com/google/mozc.git
$ cd mozc/src
$ python3 build_tools/update_deps.py
$ python3 build_tools/build_qt.py --release --confirm_license
$ MOZC_QT_PATH=${PWD}/third_party/qt bazel build package --config oss_macos -c opt
$ open bazel-bin/mac/Mozc.pkg

これが終わったら念のため再起動。

mozc_emacs_helperのビルド手順

Google 日本語入力と連携させたい場合、あらかじめインストールしておく。

ninjaのインストール。

$ brew install ninja

以下はおまじない:

$ sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
$ sudo ln -s /opt/homebrew/bin/python3 /usr/local/bin/python

これらをやっておかないとコンパイル時にエラーになったので。特に後者はビルド中にpythonを参照しようとするため、python3のバイナリを参照するようにシンボリックリンクを張った。

以下を参考にsrc/build_mozc.pyおよびsrc/mac/mac.gypを書き換える。

続いてSDKのバージョン確認。

$ ls /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs

実行例は下図のようになった。バージョンは14.0であった。

SDKのバージョン確認

さらに続いてGoogle 日本語入力のバージョンを確認する。下図より、2.28.5050.1 であった。

図:Google 日本語入力のバージョン確認

上記で確認したバージョンをもとに、src/data/version/mozc_version_template.bzlを書き換える。

MAJOR = 2

# MINOR = 29
MINOR = 28

# BUILD number used for the OSS version.
# BUILD_OSS = 5291
BUILD_OSS = 5050

# Number to be increased. This value may be replaced by other tools.
BUILD = BUILD_OSS

# Represent the platform and release channel.
# REVISION = 100
REVISION = 1

確認したSDKのバージョン(14.0)およびMacOS自体のバージョン(このときのSonomaは14.2.1だった)を指定してビルドする(注意: --noqt の後ろにもコマンドは続いている!)。

$ GYP_DEFINES="mac_sdk=14.0 mac_deployment_target=14.2" python3 build_mozc.py gyp --noqt --branding=GoogleJapaneseInput
$ python3 build_mozc.py build -c Release unix/emacs/emacs.gyp:mozc_emacs_helper

動作確認。

$ echo -e '(0 CreateSession)\n(1 SendKey 1 97)' | out_mac/Release/mozc_emacs_helper

バイナリをパスの通った場所にコピーする。

$ sudo cp out_mac/Release/mozc_emacs_helper /usr/local/bin

もっとも、--branding=GoogleJapaneseInputの指定をしなければ、Google 日本語入力との連携は発生しない。ゆえにmozc_version_template.bzlやmac.gypの書き換えは必要ない。その状態でhelperをビルドしても確かに動作する。指定はお好みで。

Emacsの設定

mozc.elはpackage-installからインストールできる。 ついでにmozc-popupもインストールしておく。

設定は例えばこんな感じに。

;; 言語設定 & mozc
(set-language-environment "Japanese")
(setq default-input-method "japanese-mozc")
(prefer-coding-system 'utf-8)

;; 要 mozc-popup <- package-install
(require 'mozc-popup)
(setq mozc-candidate-style 'popup)

また、mozc-tempによるモードレスな入力も試してみると良いだろう。そのご利益は、わざわざ日本語入力開始時/終了時にtoggle-input-methodを発動する必要がない点である。

mozc-tempを使ったモードレス日本語入力が快適 :: 四時随順

参考

xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance · Issue #569 · nodejs/node-gyp · GitHub

emacs with mozc on macos sierra · GitHub

EmacsでPythonを書く設定2024

はじめに

2024年もPythonまわりのEmacsの設定を色々と試してみる。

設定

MELPAからインストール可能。 melpa.org

  • Language server

Emacsからlanguage serverを使うためにeglotを入れる. 最近はeglotはEmacsに最初から入るようになったようだ。

PythonのLauguage serverとしてpython-lsp-serverおよびプラグインpython-lsp-ruffを入れる。Ruff自体が高速なPython linterであり,それを活用するpython-lsp-ruffも当然高速(動作が軽い)。

github.com

github.com

  • その他の3rd Party Plugins
pip3 install python-lsp-isort
pip3 install python-lsp-black

python-lsp-isortはimport順を自動でソートしてくれるパッケージである。 python-lsp-blackはblackの仕様に沿ってコードをフォーマットしてくれるパッケージである。

実際の設定はこんな感じ。

;; Python
(add-hook 'python-mode-hook #'eglot-ensure)

;; 保存時に自動整形 (eglot)
(add-hook 'python-mode-hook
          #'(lambda ()
              (add-hook 'before-save-hook
                        'eglot-format-buffer nil t)))

追記

RuffをEmacsから触るときには以下の記事もまた参考になる。

mako-note.com

音響(音声・音楽含む)分野のビギナー向けテキストやフリーソフトなどをまとめてみた

はじめに

音響分野のビギナー(学部生)が自習するのに役立つと思われるテキストや便利なフリーソフトをまとめてみたので紹介する。

読み物

音声合成に興味を持ったならば一読すると良いと思われる。肩の力を抜いて読めるが、専門用語も出てくるので、勉強になる。

広く浅く、やさしく学びたい

  • 音響学を学ぶ前に読む本

難しい数式を使わずに、分野の基礎知識をやさしく学べる。出てくる数式は対数や三角関数ぐらい。

  • ゼロからはじめる音響学

こちらも広く浅く音響分野全般を学べる。イラストが多めで助かる。 www.kspub.co.jp

  • 音と音楽の科学

「音」の基礎知識を増やすのにかなり役立つ。

gihyo.jp

  • 音のなんでも小事典

音の雑学を含めて音響分野を幅広く、科学的に解説している。通読しても楽しめるが、気になったところをつまみ食いする読み方でも十分楽しめる。

bookclub.kodansha.co.jp

「音」関連のプログラミングに触れてみたい

  • Pythonではじめる音のプログラミング

「音」を作るプログラミングをPythonで体験できる。 ボリューム満点。 www.ohmsha.co.jp

「音」を作るプログラミングをCで体験できる。こちらもおすすめ。 フーリエ変換やフィルタまわりでいくつか難しい数式は出てくるが、 雰囲気を感じ取ることができればOK。

gihyo.jp

  • プログラム101付き 音声信号処理

こちらもサンプルプログラムが豊富なのが嬉しい。

shop.cqpub.co.jp

一冊持っておくと重宝するかも

  • 音響学入門ペディア

勉強が進んできた段階で、特定のトピックについて内容がよく分からなくなったときに、 この本に書かれた解説を読んで目からウロコが落ち、思わず膝を打つかもしれない。 専門的な内容も噛み砕いて説明してくれるので、助かる一冊。

ディープラーニング

音楽を題材にして、ディープラーニング初心者でも安心して学ぶことができる。 音楽を生成するAIに興味のあるひとは一読を勧める。 ちなみにサンプルプログラムは深層学習フレームワークのひとつであるKerasに基づいている。 またMIDIデータの入出力も勉強でき、何かと得るところが多い。

信号処理

さて音響分野では「信号処理」まわりの基礎知識や数学は欠かすことができない。 進んで学びたい人は下記の本たちがいいかもしれない。

  • ディジタル音響信号処理入門

Google Colabでサクッと学べる。説明もわかりやすい。

www.coronasha.co.jp

作曲に入門したい人

  • 作りながら覚える 3日で作曲入門

タイトルの通り,筆者も3日で作曲入門できました.とてもおすすめ.

www.ymm.co.jp

フリーソフト

波形編集ソフトの定番中の定番。インストールしておいて損はない。

www.audacityteam.org

  • VOICEVOX

音声合成(テキスト読み上げ)を行うフリーソフト。色々なキャラの声で合成できるのは楽しい。

voicevox.hiroshiba.jp

Macユーザ向けのDTM系ソフト。

  • DOMINO

Windowsユーザ向けのMIDI編集ソフト。

そのほか

音響分野は幅広く、勉強しておくべき事柄は多い。専門的でカッチリした最初のテキストに以下を勧めたい。

  • 基礎 音響・オーディオ学

www.coronasha.co.jp

  • 音響学入門

www.coronasha.co.jp

そのほか、下記のシリーズで学ぶことができるだろう。 音響入門シリーズはCDが付録についていることが多く、参考になる。 『音響学入門』もシリーズ中の1冊である.

  • 音響入門シリーズ

「シリーズ:音響入門シリーズ」検索結果 | コロナ社

  • 音楽情報処理

曰く、『コンピュータ上で音楽を何かしたい!何ができる?と考えるすべての方へおすすめの1冊』。

www.coronasha.co.jp

おわりに

音響分野のテキストはたくさん出ており、勉強するための教材に困ることはないだろう。 自費購入が難しい場合も、大学などの図書館にはある程度揃っていると思われる。

筆者の独断と偏見でテキストをピックアップしたが、一つのブックマークとしてビギナーの参考になれば幸いである。

音声パワーと基本周波数をリアルタイムでモニタリングするスクリプトをPythonで書いた話

はじめに

「音」の勉強を始めたビギナーにとっては、 そもそも音響関係のPythonモジュールを使ったプログラミングの経験も少ないだろうと思われる。 本記事はそのようなビギナー向けにプログラムの実例をひとつ提供するものである。

さて以前、こんな記事を書いたことがあった。

tam5917.hatenablog.com

記事の中で、発話区間検出(Voice Activity Detection)をしながら音声認識をかけるスクリプトを紹介している。

実行イメージを下図に示す。音声の短時間パワーおよび認識された発話内容が表示されている。

図1:asr_streaming_vad.pyの実行例

音声入力を活用したアプリケーションの実装を考えた場合、音声認識機能をひとまず除外し、パワー(音量)だけではなく声の高さ(基本周波数)もモニタリングできたほうが色々と捗るのでは、と考えた。

そこで本記事ではそのようなデモンストレーションを行うスクリプトを実装したので、紹介する。

実装

実装へのリンクを示す。音量監視機能付き音声認識スクリプトの大元がKoji Inoue 氏のコードであるため、コピーライトを書いておいた。

主に使うモジュールはsounddeviceである。このモジュールを活用することで、マイクから音声データを取得し、自身のプログラム内で活用できる。

さて音声データから音声の短時間パワーを計算しているのはこのあたり:

audio = struct.unpack(f"{len(indata) / 2:.0f}h", indata)  # 2Byte単位でunpackする
audio = np.array(audio).astype(np.float64)

# 音声のパワー(音声データの二乗平均)を計算する
rms = math.sqrt(np.square(audio).mean())
power = 20 * math.log10(rms) if rms > 0.0 else -math.inf  # RMSからデシベルへ

indata は ストリームから取得した生のバイナリデータであり、それをstructモジュールのunpack関数を用いて short int へと変換する。 unpackした直後はtupleになっているため、numpyのarray へと変換する。パワーの計算方法については音響学・音声分析の教科書を見て欲しい。

基本周波数を計算しているのはこのあたり:

fo, _ = pyworld.dio(audio, self.rate)
nonzero_ind = np.nonzero(fo.astype(int))[0]
fo = fo[nonzero_ind]  # foが非ゼロの部分を取り出すことで、推定をロバストにする
if len(fo) > 0:
    fo = fo.mean()  # フレーム平均
else:
    fo = 0.0  # 空っぽだったら 0.0 Hz

PyWorldのdio関数により基本周波数を計算している。基本周波数が非ゼロのフレームのみを取り出して、フレーム平均により推定している。

音声をマイクから取得し、パワーと基本周波数を表示するやり方は以下の通り。 sounddeviceの作法は少し独特だが、「入力ストリーム」から音声取得→音声分析→パワーたちを表示、をひたすら繰り返す動作となっている。

try:
    print("<収録開始>")
    mic_stream.open_stream()  # 入力ストリームを開く準備
    with mic_stream.input_stream:  # 入力ストリームから音声取得
        audio_generator = mic_stream.generator()  # 音声データ(のカタマリ)
        for data in audio_generator:  # チャンクごとに情報を表示してモニタリング
            power, fo = mic_stream.compute_power_fo(data)  # 音声パワーと基本周波数を取得
            print(
                "\r" + f"音声パワー {power:5.1f}[dB] " + f"基本周波数 {fo:5.1f}[Hz]",
                end="",
            )
            continue
    except KeyboardInterrupt:  # Ctrl-C で強制終了
        print("\n<収録終了>")

なおプログラム実行終了時のイメージはこちら。実行中は音量と声の高さに応じて、表示が逐次変わっていく。

図2:短時間パワーと基本周波数をリアルタイムでモニタリングした様子(プログラム終了時)

今回のプログラムではCtrl-Cにより強制終了する形とした。本記事の読者ならば、さらに改良できるだろう。

おわりに

sounddeviceモジュールの活用例として、パワー(音量)と声の高さ(基本周波数)をモニタリングするPythonスクリプトの実装を紹介した。件のモジュールの仕様を筆者はすべて把握しているわけではないのだが、公式のサンプルプログラムを動かしたりすることで、マイクやスピーカーからの音声入出力がリアルタイムで行われるのはやはり面白いと感じる。

sounddevice 公式の 実装例たちを見ると、リアルタイムで音声波形をグラフにプロットしたりするスクリプトが紹介されている。ぜひ試してみると良いだろう。またasyncioモジュールを活用した実装例も紹介されている。 今回の実装をasyncioモジュールによってリファクタリングすることは今後の課題としたい。

おまけ

sounddeviceを用いた先人の記事たち。matplotlibのFuncAnimationと組み合わせるのが良いらしい。

pesqパッケージのインストールにコケたときの話(Ubuntu 22.04)

音質を客観評価する際の指標の1つにPESQ(Perceptual Evaluation of Speech Quality)がある.

Pythonで実装した方がいた.

github.com

当方の環境はUbuntu 22.04.3 LTS (Jammy Jellyfish) であり,Pythonのバージョンは3.10.2である.

pip経由のインストールを試みると以下のエラーに出会った.

pesq/cypesq.c:6:10: fatal error: Python.h: そのようなファイルやディレクトリはありません
    6 | #include "Python.h"
      |          ^~~~~~~~~~
compilation terminated.
error: command '/usr/bin/x86_64-linux-gnu-gcc' failed with exit code 1

以下のコマンドを実行したあとならば,無事にインストールできた.

sudo apt install python3.10-dev