Qwen3-TTSに自分の声でしゃべらせる

Qwen3-TTSというテキストto音声モデルが出ていて、どうせ日本語はしゃべれんのだろう?って思ってたけど案外しゃべれるし、自分の音声のクローンもできるようなので、試してみました。
Qwen3-TTS Family is Now Open Sourced: Voice Design, Clone, and Generation!

手順などはGitHubに。
https://github.com/QwenLM/Qwen3-TTS

基本的にはpip installするだけ

pip install -U qwen-tts

flash-attnを入れたほうがいいということだけど、Windowsなのであきらめます。

pip install -U flash-attn --no-build-isolation

デモがあるので起動。デフォルトではflash-attnを使うようになってるので、使わないようにする。

qwen-tts-demo Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice --port 8800 --no-flash-attn

話者を選べるけど、Ono Annaが日本語ネイティブ。

Eric(四川訛りの中国語)やSohee(韓国語)をえらぶと、それっぽい訛りの日本語になる。RyanやAidenは英語ネイティブということだけど、割と自然な日本語になってた。

Baseモデルを選ぶと、音声クローンがつくれる。

qwen-tts-demo Qwen/Qwen3-TTS-12Hz-1.7B-Base --port 8800 --no-flash-attn

UIも変わって、リファレンス音声とその書き起こしを指定するようになっている。

自分の声なんだけど、こんなハキハキとはしゃべれないな。

VoiceDesignモデルを選ぶと、声質を指定できるみたい。

qwen-tts-demo Qwen/Qwen3-TTS-12Hz-1.7B-Base --port 8800 --no-flash-attn

UIも変わる。

female voiceを指定するとアニメ声になった。

Anthropic CEOの「ソフトウェアエンジニアリングは12ヵ月で完全に自動化する」発言は鵜呑みにできない

Claude Codeの開発で2ヵ月コードを書かないエンジニアがいて、そこから6-12ヵ月でソフトウェアエンジニアリングが完全に自動化するというAnthropic CEOの発言が話題。
でもそれって限られた開発しか見てないように思うので、めんどうなコードばかり書くことになるだけでは、と思ったりした。

上記では述べられてないけど、このYouTubeでの発言をみると、コードを書かないエンジニアがいるのはClaude Codeの開発での話っぽい。

これが、Claude Opusのサーバーを運用するエンジニアがコードを書いてないという話であればすごいのだけど、Claude Codeはソフトウェアの中では簡単な部類になると思う。

基本的にはユーザーが入力したテキストにしたがってClaudeを呼び出しプロンプトのテキストを管理というもの。

ユーザーの入力を他のだれかにリアルタイムで反映させる必要はないし、秒間数万のトランザクションが発生するわけでもない、ユーザーインタフェースはほとんどない、物理ワークフローの制約を反映する必要がない、共有リソースの排他制御もほぼ不要、そして、考慮すべきレガシーコードがない。

重要なのはプロンプトの部分にあると思う。そしてここは手書きじゃなかろうか。

ただ、そういった難しい制約のない部分のコードの自動化が進むことは確かなんだと思う。 その結果、自動化できる部分は目にみえなくなり、ソフトウェアエンジニアの前には難しくてめんどうなコードばかり残って、むしろそういった作業が終わらないということになりそう。

あと、コードレビューが大変という話はよく聞くけど、そのあとのQA作業にも負荷が行ってて、ソフトウェアエンジニアへのテスト自動化の圧も高まると思う。AIを使った自動テストが流行るのでは。

そもそもプロンプトはたくさん手で書かないといけないですね。

ということで、ソフトウェアエンジニアはAI様が気持ちよくコードを書くためのプロンプトと、そこからはみでためんどうなコードと、それらの動作を保証する自動テストをたくさん書くことになり、「全然自動化されてないなぁ」という感想を持つことになるんではなかろうか。

GLM-4.7-FlashのGGUFをLM Studioで動かすときにはRepetition Penaltyを無効にする必要がある

GLM-4.7-Flashが出ていたのでGGUFをLM Studioで試したけどどうもおかしかったのだけど、Repetition Penaltyを無効にすると解決。

出てたので試してたのだけど。
https://nowokay.hatenablog.com/entry/2026/01/20/114010

こんな感じで出力がおかしかったのです。

Repetition Penalty(繰り返しペナルティ)を無効にすると解決しました。

他のパラメータもUnslothさんの推奨どおりにするとこうですが、まだうまくいっていない。
GLM-4.7-Flash: How To Run Locally | Unsloth Documentation

まともにコード生成しています。

まあ、それでもコンパイルエラーが出ててあまり優秀とはいえないけど。

あと、Flash Attentionをオフにすると推論が速くなります。

量子化のQ4_K_MとかQ4_K_Sとかの違いってなに?

量子化ではQ4_K_MとかQ4_K_Sとか種類があります。じゃあその違いって具体的になに?ということで見てみました。
※ この記事からの抜粋
コンパイルエラーを元気に説明するLLMをファインチューンでつくる - ローカルファインチューン完全ガイド - - きしだのHatena

たとえばLlama-3.2-1B-InstructのUnslothさんによるGGUFを見るとこんな感じで色々あります。
https://huggingface.co/unsloth/Llama-3.2-1B-Instruct-GGUF/tree/main.

Q4は4bitで量子化、つまり値を4bitで表しますよということなのでそのままですね。Q3なら3bit、Q5なら5bit。

問題はK_Mの部分。 ここで、KはK meansという手法を使って量子化することを表します。
そしてMとかSはサイズです。Medium, Smallの略です。Lもあります。

でもここでじゃあMediumとかSmallとか何よってなるので、実際の量子化を見てみます。
https://huggingface.co/unsloth/Llama-3.2-1B-Instruct-GGUF/blob/main/Llama-3.2-1B-Instruct-Q4_K_M.gguf https://huggingface.co/unsloth/Llama-3.2-1B-Instruct-GGUF/blob/main/Llama-3.2-1B-Instruct-Q4_K_S.gguf

まずQ4_K_S。Q4_Kの中にQ5_Kがまじってますね。

これがQ4_K_MだとQ6_Kになります。

Transformerの計算の中でQuery、Key、Valueという要素があるのですけど、Valueだけ精度が高くなってます。

ついでに、じゃあなんでValueの値だけ精度が高いかというのも見ておきましょう。
ここに、Javaで書いたLLMの実装があります。というか、Cで書かれたものをあたたかみのある手作業でJavaに変換したものです。
https://gist.github.com/kishida/05656bfcbe840f269784f7dbbee5928e#file-llama-java-L300

qとkey_cacheを掛けたものを合計してattにいれてsoftmaxということをやってます。

softmaxは指数関数をかけたものをその合計で割るというものです。
そういった操作をするので掛け算の結果がそのまま残るわけではなく、精度が落ちてもかまわないわけですね。

一方でvalueに関しては、そうやって求めた値に掛けるだけ。

qkで計算した結果にsoftmaxをかけてvを掛けたものをそのまま使うので精度が重要ってことで高めの精度が使われてます。

F32もありますが、ここはShapeを見ると次元が低いです。行列を使って値を求めたあとに掛けるバイアス値なので精度重要だし、数も少なく量子化するメリットもでにくいのでそのままF32が使われてます。

ところでこれは、Qwen-Image-Layeredという、画像をレイヤーに分解するモデルのQuantStackでのQ4_K_Mの2ブロック目。
Q4_K主体でv_proj.weightだけQ6_K。
https://huggingface.co/QuantStack/Qwen-Image-Layered-GGUF/blob/main/Qwen_Image_Layered-Q4_K_M.gguf

同じQwen-Image-LayeredのQ4_K_Mでもunslothさんのところでは2ブロック目もQ5_K主体になっていて、Q4_Kになるのは3ブロック目からでした。
https://huggingface.co/unsloth/Qwen-Image-Layered-GGUF/blob/main/qwen-image-layered-Q4_K_M.gguf

同じ量子化でも微妙に違ったりするのですね。

ここで気づいた。
画像や動画の生成モデルは量子化の影響を受けやすくVRAMはみ出ていいのでなるべく大きいサイズを選ぶ - きしだのHatena

Q4_K_Mがそこまで性能劣化しない割にサイズも小さくCPUにもやさしいということでよく使われます。

もっと詳しい説明はここに
https://g-pc.info/archives/43789/

いかに「エンジニアといえばWeb系ソフトウェアエンジニア」な雰囲気ができたか

「エンジニアはソフトウェアエンジニアだけじゃない」とか「Web系だけがソフトウェア開発じゃない」という話をよくみかけるけど、なんで「エンジニアといえばWeb系ソフトウェアエンジニア」な雰囲気が発生したのか。

まず、2000年。 ドットコムバブルというのがあり、ネット系企業が上場して株価があがって暴落してつぶれてというのがありました。
けど、そのころ「Web系」という存在がうまれたのですね。インターネットがそれなりに普及して、ブラウザもそれなりに使えるようになって、そこでWeb系のソフトウェア開発でメシを食うというのが始まりました。

次に2005年。Web 2.0ですね。
XMLHttpRequestを使って非同期通信を行ってページ遷移なしでの処理が行われ始めました。
日本でインターネット普及率70%。mixiが始まったりユーザーがネットに何かを投稿するということが生活に入ってきます。
そして、mixiのような、大企業の一部門ではなく、Webサービスを行うための企業が普通に成り立つようになります。

そうしてユーザーがブログなどの発信をする中で、業務について書けるのはパソコンが目の前にあって時間の自由もあるソフトウェアエンジニア、ということになり、ソフトウェア開発系のブログがあふれます。
まだTwitterがないので、短いやりとりをブログ経由で行ったりもしてましたね。

ただ、このころはソフトウェア開発系のブログもイベントも、業務システム系のものが多かったと思います。
ただし、受託での仕事は発信がやりにくいので、SIの元締めになるような企業の製品紹介にからんだもの、比較的自由な会社やフリーランスの人、といった発信が主だったはず。

※追記 コメントにあるけど組み込みやゲームは情報発信できないので、ないものとして扱われがち
組み込みソフトウェア業界というナゾの裏世界の話 - きしだのHatena

そして2010年。
GREEとDeNAがソシャゲーで苛烈な競争を行う中で、その競争を支えるためのエンジニアの確保に熱を入れ始めます。
そこから他の企業にも波及して「入社すれば200万円」のような高待遇でエンジニアを獲得する競争も始まります。
https://www.itmedia.co.jp/news/articles/1008/20/news043.html

それまでSIなど「Web系」ではなかった人のWeb系企業への転職も目立ちはじめ、Web系エンジニアの比率も高まります。
また、そういった人材獲得のために、Web系の会社によるイベントや発信も増えます。
個人のブログでの情報発信の推奨も行われます。

そうして、Web系ソフトウェアエンジニアの発信が増える上、業務系でもブログを書いたり登壇したり露出の多い人ほど、だれかから声がかかってWeb系に転職するので、Web系に偏っていくわけですね。

こうして、ネット上では「Web系ソフトウェアエンジニアにあらずばエンジニアにあらず」な雰囲気ができあがったというわけ。

GLM-4.7-Flash、性能それほどでもなく、いまのところ量子化がうまくいってない

GLM-4.7はコーディング能力の高さが認められるようになってきています。その軽量版、30B-A3BのGLM-4.7-Flashが出ていました。
https://huggingface.co/zai-org/GLM-4.7-Flash

DeepSeekのMultihead Latent Attentionを使っているのが売りっぽい。 ただ、まだ使える環境がない・・・

OpenRouterがクソ遅い・・・

今のところZ.aiのAPIで使えなかったので、OpenRouterを使ったのだけど、遅い。

とぎれとぎれに出てきて結果12tok/secというところ。
でも、答えが返ってこないことがある。

コーディングはそこまでうまくない

とりあえずOpenRouterで使ってみたところ、一応JavaScript版のブロック崩しはできました。

ただしJava

ヌルポ出てたりしたのだけど、ブロックが消えたときにnullを割り当ててるのにnullチェックを行わないというものだった。そして対応してもらおうと思ったら死んだ。

ここのifでnullチェックが必要。あと、こういう処理は拡張forを使ってほしいところ。

        // ブロックとの衝突判定
        for (int i = 0; i < bricks.length; i++) {
            if (ball.intersects(bricks[i])) {
                bricks[i] = null; // ブロックを消す
                dy = -dy; // 反転
                break; // 一度に一つずつ消すためにループを抜ける
            }
        }

あと、16msごとに呼ばれるactionPerformedで16msのウェイトいれて無限ループしてたりする。

    @Override
    public void actionPerformed(ActionEvent ae) {
       while (gameRunning) {
            update(); // 論理更新
            repaint(); // 描画更新
            try {
                Thread.sleep(16); // 休止(60FPS相当)
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
       }
    }

という感じで、ロジックやコードスタイルもイケてないのでgpt-oss 20bのほうがコード書ける気がする。

ベンチマークだとかなり上回ってるんだけど。

日本知識

山口県について聞いてみたけど、半分以上間違ってる。2項目あると片方違う、という感じ。

MLXは最新で対応

MLXエンジンは最新のもので対応しているようです。

ということで4bit版を試します。

ただ、JS版ブロック崩しを作ってもらおうとすると、バグる。

Java版もバグる

難しいことを考えさせるとバグる

変な小説は作ってくれた

あまりうまく量子化できてなさそうです。

GGUFも怪しい

どうやらアーキテクチャとしてはDeepSeek V3と同じらしいので、llama.cpp本体の修正は不要ということで議論が進んでる。
https://github.com/ggml-org/llama.cpp/pull/18936

Flash AttentionがMLAに対応していないので、切ったほうが速くなります。

がしかし、なんか怪しい

マルチGPUが悪さしてる可能性もある。


なんだか、LM Studioで動かすと挙動がおかしい。

llama.cppを直接つかうとまとも。

まとめ

Nemotron 3 Nanoのほうがよさそう
https://nowokay.hatenablog.com/entry/2025/12/16/042030

オブジェクト指向という自転車置き場

オブジェクト指向」という言葉がネットに現れると、みんな思い思いのオブジェクト指向を語りだしますね。
このブログもそう。

そして、その「オブジェクト指向」が指すもの、みんな違います。

なんでかというと、「オブジェクト指向」って結局のところ「オブジェクト指向」とつけば売れた、マーケティング用の腐ったバズワードだからです。
90年代、ソフトウェア製品や開発手法に「オブジェクト指向」と付ければ売れ、つけなければ売れないという時期がありました。

構造化やデータベース設計などの手法をもっていた人たちも、そこにクラスと継承を載せてオブジェクト指向手法として売り出したり。
なので、そのころのソフトウェア開発をうまくやる仕組みは全部オブジェクト指向ということになってしまってます。

日本だと「オブジェクト指向でなぜつくるのか」が「難しいソフトウェア開発を楽にするための総合技術」としてアジャイルまで含め全部オブジェクト指向ということにして、その影響も大きいように思います。
「難しいソフトウェア開発を楽にするための総合技術」はソフトウェア工学としてまとまってるし、そちらのほうが発展性や網羅性があるので、この本は「ソフトウェア工学でなぜつくるのか」のほうが適切だと思うのだけど、そのタイトルだと売れないですね。

そんな感じで、「オブジェクト指向」というのは製品やサービス、本を売るためのマーケティング用語になって、技術用語としてはかなり歪んでいます。「オブジェクト指向でなぜつくるのか」も本が売れるのでそのままのタイトルで、無理やり様々な話を盛り込んでオブジェクト指向に結び付けていますね。

日本で象徴的なのが、九大病院オブジェクト指向システムで、日経の記事には「九大病院は当初,システムの入札条件として「純粋なオブジェクト指向技術で実現すること」を指定した」ということが書かれていました。
https://web.archive.org/web/20000503031204/http://www3.nikkeibp.co.jp/WAT2/971212/971212trein01.html

当時、この案件をやっていたらしき人たちと同じフロアでちょっと仕事を手伝っていたのだけど、どんどん人が増えていってたな。大変そうだった。
ただ、おかげでSRAの人がよく福岡に来てソフトウェア工学セミナーをやっていてありがたかった。そのときはこんな案件ってしらなかったけど。

そして、そのプロジェクトが大失敗したことで、オブジェクト指向の夢から覚める人も多かったんじゃないかと。
Smalltalkによる伝説のプロジェクト - kなんとかの日記
危機からの脱出 九州大学医学部附属病院 | 日経コンピュータ | 日経BP記事検索サービス (記事タイトルのアーカイブ)

ただまあ、そういうことはあまり引き継がれず、オブジェクト指向は夢の技術かのように語られた本や記事も残ったので、ソフトウェアをうまく作るための工夫がすべてオブジェクト指向だとして、そうすると自分がソフトウェアをうまく作るときに考えた工夫もすべてオブジェクト指向なので、みんな思い思いに、ソフトウェアをうまく作る工夫について語りだすのでした。
だれでもソフトウェアを作るときになんらか工夫しているので、なんらか口を出すことができる、ということで「自転車置き場の議論」になってるわけですね。

そんなんなので、実務での技術コミュニケーションには使えませんね。
なので、技術コミュニケーションの際には抽象データ型や部分型、ソフトウェア工学など、オブジェクト指向以外の言葉で話せる部分はそれぞれの用語を使うほうがいいと思います。実際に開発の現場でオブジェクト指向という言葉を使うことは まずないですね。

適切な言葉を使うほうがいいのでは、というのはここでまとめていた。(まとまってない気もする)
オブジェクト指向はすでに粒度が時代にあっていない - きしだのHatena

そうやって他の言葉のほうが適切に話ができる部分を引きはがしていくと、「オブジェクト指向」としてしか語れないこととして継承が残るわけです。
オブジェクト指向は継承で多態するプログラミング - きしだのHatena