N.Yamazaki's blog

主に音声合成について思ったことを書いてみようと思います。
音声合成LSIでイヤホンを鳴らすときの回路(アンプ不要)
音声合成LSI「AquesTalk pico LSI」の出力で、アンプICを使わずにイヤホン(またはヘッドホン)を駆動するときの回路を検討しました。


■考慮すべきポイント
以下のポイントを考慮して設計します。
1. 絶対最大定格を超えないこと
  端子最大電流40mA
  端子電圧:-0.5V以上 Vcc+0.5V以下
2. 出力は出来るだけ大きく
3. 折り返し雑音やPWMキャリア成分の除去はそこそこ

■スピーカーを直接接続すると・・・
時折、AquesTalk pico LSIの音声出力端子(AOUT)に、イヤホンやスピーカーを直接接続している例を見かけますが、LSIを壊す可能性があります。
理由は、イヤホンのインピーダンスが低いため端子最大電流の絶対最大定格を超えてしまうことと、イヤホンのインダクタンスにより逆起電力が発生し、これにより端子電圧の絶対最大定格を超えるためです。
また、圧電ブザーや圧電スピーカーを直接接続する例も見かけますが、これらは駆動側からみるとコンデンサみたいなものなので、これも端子最大電流を超えてLSIを壊します。もっとも、経験上、このような使い方をしてもそう簡単には壊れませんが・・・

■回路図
今回設計した回路図と素子の定数を示します。
回路図
素子定数
Vcc[V] Zo[Ω] R1[Ω] C1[uF] C2[uF] 出力[mW] fc[KHz]
5.0 32 120 3.3 10 2.5 2.5
5.0 16 120 4.7 22 1.8 3.0
5.0 8 120 10 47 0.9 2.8
3.3 32 82 3.3 10 2.0 2.8
3.3 16 82 4.7 22 1.5 3.1
3.3 8 82 10 47 0.8 2.8

折り返し雑音除去用のLPFと、DC成分除去のHPFから構成されるシンプルな回路です。
電源電圧VccとイヤホンのインピーダンスZoをもとに、表から各素子の値を求めます。
ATP3011の音声帯域は4KHz、ATP3012は5KHzなので、カットオフ周波数は3KHz付近に設計しました。
本来なら折り返し雑音だけをカットするために2次のLPFを用いたいのですが、2次の構成ではどうしても音量が小さくなるので、1次のLPFでカットオフを少し下げました。

また、この回路の周波数特性の設計にはイヤホンのインピーダンスを利用しています。そのため、イヤホンのインピーダンスは固定です。もし、使用するイヤホンが変わる場合は、この回路は使えず、別途アンプを使うしかなさそうです。

この回路の音量は、イヤホンのインピーダンスが大きいほど大きく鳴らせます。一般的なアンプを使ったものとは逆ですね。
上に示した定数は音量が最大になるように設計してますが、もし、音量を下げる場合は、R1の値を大きくすればOKです。なお、R1の値を下げるのは端子最大電流を超えてしまうのでNGです。

■左右を並列接続、それとも直列?
市販のイヤホンのインピーダンスは16Ωのものが多いようです。これは片側のインピーダンスです。
左右のイヤホンをモノラルの回路で駆動するとき、通常は左右を並列に接続しますが、インピーダンスが1/2になるので音量が小さくなってしまいます。一方、直列に接続すればインピーダンスは倍になって音量的に有利ですが、左右が逆位相になるのでちょっと気持ちよくありません。しかし、実際のところイヤホンで左右逆位相で鳴らしたとき聴感上はどうなるのでしょう?スピーカーのように空間で打ち消しあうことも無いですし・・・特に問題ないのでしょうか?

■おまけ、ボリューム付き
ボリュームで音量を調整できるようにした回路例を次に示します。
最大音量は、ボリューム調整をしない場合に比べると6db程度小さくなります。
また、カップリングコンデンサ(C2)を前に移して、AOUTから出力されるDC信号成分による電力消費を削減しています。

VR付回路

■最後に
今回の検討は、ICからのPWMオーディオ出力を、アンプを使わずにCRの受動素子だけでフィルタを構成し、イヤホンから音を出すという、そんな一般的な設計にも応用できると思います。

■Link
  N.Yamazaki's blog「音声合成LSI用のオーディオアンプ(再考)」
| AquesTalk pico LSI | 17:26 | - | - |
AquesTalk pico LSI用のアンプモジュール
音声合成LSI「AquesTalk pico LSI」用のオーディオアンプモジュールを試作しました。
スピーカーで鳴らすにはどうしても外付けのアンプが必要ですが、これを使えば、"アンプ内蔵の音声合成LSI"に早がわりです。

音声合成LSIとアンプモジュール

次のようにAquesTalk pico LSIに重ね、端の2つの穴にスピーカーを配線・接続するだけです。

音声合成LSIにアンプモジュールを重ねる



■特長
  • ぴったりサイズ
    28pinのDIPサイズにぴったり収まるコンパクトな実装
  • 配線不要
    AquesTalk pico LSIに重ねて数箇所を半田付けするだけの配線の引き回しが不要
  • 大音量
    最大2.6Wのデジタルアンプによる十分な音量出力



■使い方
高さを1.6mmに抑えているので、万能基板に直に載せて使うだけでなく、Arduino UnoのICソケットにもギリギリ挿せました。
ソケットを使う場合は、IC用のソケットでなく丸ピンソケットを2列で使うとしっかりと挿せます。


アンプ付ATP3011を万能基板に載せる

アンプ付ATP3011をArduino Unoに挿す


ちなみに、アンプモジュールの裏面はフラットの片面だけの実装です。

音声合成LSI用アンプモジュール裏面

■仕様
サイズ 38.1mm x 10.4mm x 1.6mm
出力 最大2.6W(5V 4Ω)
電源電圧 2.4V to 5.5V
待機電流 1uA(typ Vdd=5V)
音量調整  ジャンパーによる2段切り替え
その他 音声出力に連動したアンプの起動/シャットダウン

■回路

ATP3011アンプモジュール回路図
回路図(クリックで拡大)

■製品化について
興味を持たれた方は、是非ともツイート/シェア/コメントなどで何らかのレスポンスをお願いします。
それで、ニーズが多ければ製品化・販売を検討しようと思ってます。
これで、AquesTalk pico LSIがもっともっと売れるといいなぁ・・・
 
| AquesTalk pico LSI | 21:20 | - | - |
音声合成LSIのCAD用部品ライブラリ
AquesTalk pico LSIの部品ライブラリを以下に公開します。
回路設計や基板設計にお使いください。

ATP3011とATP3012シリーズそれぞれDIP版とTQFP版の2種類が含まれています。
対応CADは、EAGLEとDesignSpark PCBの2つです。

■対象デバイス型番
ATP3011F4-PU/ATP3011F1-PU/ATP3011M6-PU/ATP3011R4-PU
ATP3012F5-PU/ATP3012F6-PU
ATP3011F4-AU/ATP3011M6-AU/ATP3012F5-AU

■EAGLE用
http://www.cadsoftusa.com/downloads/file/aquest.lbr

■DesignSpark PCB用
http://www.a-quest.com/blog_data/dspcb_aquest.zip

内容に不具合などありましたら、infoaqアットa-quest.com にメールください。

今回Eagle版はCadSoftのサイトにアップロードしてみました。
アップロードしてからライブラリが公開されるまで半日ほどかかり、ちゃんと「ダウンロードできるようになったよ!」ってメールもあって、どうやら手作業でやってるみたいですね。
 
| AquesTalk pico LSI | 18:22 | - | - |
音声合成LSI用のオーディオアンプ(再考)
音声合成LSI「AquesTalk pico LSI」でスピーカーを鳴らすためには外付けのオーディオアンプが必要です。
このオーディオアンプICは、多くのメーカから沢山の種類が発売されていてホントに選ぶのが大変です。
そこで、今回はお勧めのアンプICを回路定数と共に紹介します。

■簡単にD級で大出力
lm48310
まずは、Texas InstrumentsのLM48310を使ったもの。簡単に大音量を求めるならコレがお勧め。
電源5Vと4Ωのスピーカーで最大2.6Wの出力が得られます(5V 8Ωのときは、最大1.6W)。
PWMで駆動するD級アンプのため効率が高く(5V 1W時で88%)消費電流や発熱が少ないです。
一方で、AB級に比べて放射ノイズ(音質における雑音ではないですよ!)が大きいのでRF回路混在では注意が必要でしょう。もっとも、独自のスペクトラム拡散技術で放射ノイズを少なくしているとのことです。

■AB級で大出力
lm4871
次は、Texas InstrumentsのLM4871LD(またはLM4991LD)を使ったもの。
とにかく音量重視ならこちら。3Ωのスピーカーならなんと3Wの出力が出せます。
(電源5Vに4Ωのスピーカーなら2.5W、8Ωなら1.5W)
AB級のためD級のような放射ノイズが少ないため、RF回路との混在でもばっちりです。
ただし、効率がD級より悪いため消費電流も発熱も大きく、実装は放熱を考慮する必要があってちょっと面倒。
このパッケージはLLPというもので、PCBに放熱用のパタンを用意する必要があります。
なお、MSOPやDIPパッケージ版のLM4871(non LD版)というのもありますが、こちらは最大1.5Wまで(Vcc5V SP8Ω)となります。
実際に鳴らしてみた感想ですが、ボリュームを上げて出力が歪んだときの音質がD級よりも聞き易かったです。

■D級アンプその2
tpa2006
こちらは、秋月のKITでもおなじみのTPA2006D1(Texas Instruments製)を使ったもの。
電源5Vと8Ωのスピーカーで最大1.45Wの出力が得られます。
D級アンプであり、LM48310と特性が似ているのですが、注意点は、4ΩのスピーカーではVcc4.2Vまでとの制限があります。
スピーカーは8Ωとか、3V電源などと、動作環境がマッチすればお勧めです。
このICのパッケージはWSONですが、同種にSOPパッケージのTPA2005D1というのもあります(最大1.4W)。

■幕下落ち
ht82v739
以前に参考回路に載せていた HT82V739(HOLTEK製)を使ったもの。
今回これを参考回路から外します。理由は、入手経路が限られているのと入力インピーダンスがスペック上では不明(数KΩ程度?)なので。効率も不明です。でも、秋月でDIP版が手に入るので量産でなく個人で使う分には手軽ですね。

■番外編
Diodes製のPAM8301PAM8303Dといったものも検討したのですが、これもHT82V739同様に入力抵抗が不明、ゲインも平均値しか書いてないなど設計要件を満たさず落選。なお、PAM8301を実際に動かしてみたところ、そこそこ鳴るのだけど電源ラインに他のICには見られない程の酷いノイズがのって何だコリャって感じ。原因は不明。

超有名なLM386は選考外でした。上にあげた回路はすべてBTL駆動です。LM386などを使ったシングルエンドの回路は、原理的に出力が1/4になりますし、実装サイズの大きいカップリングコンデンサも必要になるので、スピーカーの片方を接地するといった特殊な条件がなければこれらを選択するメリットはないでしょう。

また、今回はTI製が多かったですが、他メーカのものとしては、MaximのMAX98304/MAX98314/MAX98300、STMicroのTS4962/A21SP16、NXPのSA58672あたりのD級アンプも良さそうです。

■使用上の注意
ところで、上記すべての回路はATP3011用です。ATP3012で使う場合には、AOUTからのLPF部分を次のように置き換えてください。
また、アンプのゲインはバラつきを考慮して多少大きめに設定していますので、ボリュームを最大にすると間違いなく音声出力が歪みます。大きな音量を得る場合でも、許容できる歪になるまでボリュームを下げて使ってください。
lpf30113012
■LINK
 N.Yamazaki's blog「音声合成LSIでイヤホンを鳴らすときの回路(アンプ不要)」
| AquesTalk pico LSI | 23:11 | - | - |
[Arduino] AquesTalk ライブラリ

Arduino用 音声合成LSIライブラリ

このライブラリは、Arduinoから音声合成LSI「AquesTalk pico LSI」(以下、"LSI")を制御するためのライブラリです。これを使えば簡単に音声合成を行うスケッチが書けます。

なお、Arduino基板とLSIは2線のI2Cインターフェースで接続することを前提としています。ハードウェア的には「AquesTalk Shield(*1)」を使ったり、ブレッドボード上で配線します(下の配線例参照)。
 *1   AquesTalkプロトシールド ROBOBA032

配線例
Arduino Uno, ATP3011XX-PU ブレッドボードとアクティブスピーカを使った例


 

動作環境
■ 対象デバイス(LSI)
ATP3012F6-PU/ATP3012F5-PU/ATP3011R4-PU/ATP3011M6-PU/ATP3011F1-PU/ATP3011F4-PU/ATP3010F4-PU

■ Arduino IDE
Ver.1.0.x  Ver.1.6.x

■ Arduino基板
Arduino Unoやその互換ボードなど


簡単な使い方(example/HelloTalk.inoと同じ)

#include <AquesTalk.h>
#include <Wire.h>  // ライブラリ内部で使用するので定義必要

// Hello Talk - AquesTalk pico LSIで「こんにちは」を繰り返し発声する

AquesTalk atp;  //インスタンス定義 変数名は任意

void setup()
{
}

void loop()
{
 atp.Synthe("konnnichiwa.");  //引数に指定のテキストを発声
}



ダウンロード
URL    Arduino_AquesTalk_Library.zip  2015/2/16 update

Arduino環境にライブラリをインストールする方法は、"arduino ライブラリ 追加"などで検索してください。



関数メソッド
ライブラリの関数の説明を以下に示します。
関数の具体的な使用方法は ライブラリ付属のサンプルスケッチ"SampleTalk"を参照するのが良いです。


AquesTalk(int addr)
AquesTalkクラスのインスタンスを生成します。addrには、LSI側のI2Cアドレス(7bit)を指定します。addrは省略することも可能です。この場合、アドレスは出荷時設定の0x2Eとなります。

     Example
         AquesTalk talk;   // 出荷時設定のインスタンス生成
         AquesTalk aquestalk(0x2F); // I2Cアドレスを0x2Fに変更した場合


bool IsActive()
LSIの接続・動作をチェックします。
LSIから応答がある場合はtrue、無い場合はfalseが返ります。
falseの場合には、配線等をチェックしてください。
思ったとおりに動作しない場合は、まず、この関数で動作をチェックしてみます。


void Synthe(const char *msg)
音声合成を行います。
msgには 発声する音声記号やコマンド文字列を指定します。
この関数は、前の発声の終了を待ってから、引数の文字列の最後にデリミタのCR('¥r')を付与してLSIに送信しています。
発声の終了を待たずに関数から戻ります。
間違った音声記号列を引数に指定した場合は、LSIは何も発声せずにエラーを返しますので、エラーの有無は、本関数の呼出し後に GetResp()関数を呼び出して確認できます。

void SyntheP(const prog_char *msg)
引数にプログラム領域上のコマンドを指定する他はSynthe()と同じです。
メッセージが固定の場合には、RAMを節約することができます。
詳しくは、ArduinoのPROGMEMを参照してください。

void SyntheS(String &strMsg)
引数にString型でコマンドを指定する他はSynthe()と同じです。

void Write(const char *msg)
LSIに指定の文字列を送信します。
msgには 発声する音声記号やコマンド文字列を指定します。
Synthe()と異なり、LSIの受信の可否にかかわらず送信します。
また、最後にデリミタのCR('¥r')を送信しないので、コマンドを分割して送信できます。

void  WriteP(const prog_char *msg)
引数にプログラム領域上のコマンドを指定する他はWrite()と同じです。

bool IsBusy();
発声中か否かを返します。
発声中はtrueを返します。次のコマンドはfalseの場合に送信する必要があります。
なお、応答なしの場合もfalseを返します。

uint8_t GetResp()
LSIの応答を取得します。
発声中の場合は、発声終了後に戻ります。
Synthe()の後で呼び出すことで、音声記号列の指定ミスを確認できます。
戻り値: >100 エラーコード(LSIのデータシート参照), 0 正常終了, 2 応答なし, 3上記以外

void Break();
LSIの発声を中止します。

void SetSpeed(uint16_t speed, uint8_t *pRet=0)
発話速度を設定します。
発話速度はLSIの不揮発メモリに設定しますので、
これで設定した値は、電源を切っても継続されます。
speed: 50-300  標準:100 50:最遅 300:最速
pRet: 正常に設定できたか確認する場合指定。省略可。返される値はGetResp()と同じ。

uint16_t GetSpeed(uint8_t *pRet=0)
現在の発話速度の設定値を取得します。
pRet: 正常に設定できたか確認する場合指定。省略可。返される値はGetResp()と同じ。

void GetVersion(char *str)
LSIのファームバージョンを返します。
strには6バイト以上の配列を用意して呼び出してください。

void SetRom(uint16_t adr, uint8_t val, uint8_t *pRet=0)
LSIの不揮発メモリ(EEPROM)に値を設定します。
これでLSIの各種パラメータを設定できます。
指定するアドレスおよび値はLSIのデータシートを参照してください。
不意に値を変更すると、LSIが動かなくなりますので、LSIの仕様を十分に理解した上でお使いください。
adr: EEPROMアドレス 0-0x3ff
val: 値 0-0xFF
pRet: 正常に設定できたか確認する場合指定。省略可。返される値はGetResp()と同じ。

uint8_t GetRom(uint16_t adr, uint8_t *pRet=0)
LSIの不揮発メモリ(EEPROM)に値を取得します。
adr: EEPROMアドレス 0-0x3ff
pRet: 正常に設定できたか確認する場合指定。省略可。返される値はGetResp()と同じ。
戻り値:値 0-0xFF

// 以下の関数はATP3011R4のみ有効です。

void SetPitch(uint8_t pitch, uint8_t *pRet=0)
声の高さを設定します。
pitch: 声の高さ 0-254  標準:64 0:高い 254:低い
pRet: 正常に設定できたか確認する場合指定。省略可。返される値はGetResp()と同じ。

uint8_t GetPitch(uint8_t *pRet=0)
現在の声の高さの設定値を取得します。
pRet: 正常に設定できたか確認する場合指定。省略可。返される値はGetResp()と同じ。
戻り値: 声の高さ 0-255  標準:64(または255) 0:高い 254:低い
 
void SetAccent(uint8_t accent, uint8_t *pRet=0)
アクセントの強さを設定します。
accent: アクセントの強さ 0-255  標準:64 0:なし 255:強い (値に対して段階的に変化)
pRet: 正常に設定できたか確認する場合指定。省略可。返される値はGetResp()と同じ。

uint8_t GetAccent(uint8_t *pRet=0)
現在のアクセントの強さの設定値を取得します。
pRet: 正常に設定できたか確認する場合指定。省略可。返される値はGetResp()と同じ。
戻り値: アクセントの強さ 0-255  標準:64 0:なし 255:強い


注意
本ライブラリは、I2C通信にWire標準ライブラリを使用しています。したがって、本ライブラリを使用する場合は、スケッチ上に #include <Wire.h> も追加してください。

サイズ
本ライブラリは2byteのSRAM領域を消費します(1インスタンスあたり。Wireライブラリのサイズは含まず)。
ROM(Flash)領域は、Wireライブラリも含めて3K〜10Kbyte程度使います(用いる関数により異なる)。

サンプルスケッチ
ライブラリには、以下のサンプルスケッチが含まれています。スケッチを書くときの参考にしてください。

  • HelloTalk:    「こんにちは」を連続して発声する最も簡単なスケッチ
  • SampleTalk: AquesTalkライブラリの各関数の使い方を示した例
  • MultiTalk:     2台で音声合成の掛け合いを行う制御方法の例
  • PitchAccent: 声の高さやアクセントの強さを変えた例(ATP3011R4のみ)


Link

Arduinoで音声出力をはじめよう!「入門編」

| AquesTalk pico LSI | 16:43 | - | - |
隠しコマンドでATP3011R4のチューニング
ロボット声の音声合成LSI ATP3011R4-PUをお持ちの方へのオマケ!

ATP3011R4は声の高さとアクセントを調整する機能が隠されています。

■背景
この声種は各種ロボットへの応用をイメージして作ったのですが、ロボットといっても人型のものや手のひらサイズまで色々なサイズがあって、サイズが大きくなると声も低くなるというイメージがありますよね。ということで、声の高さ(ピッチ)を変更する機能がこっそり用意されています。

本機能とともに、「隠しコマンドで声質をチューニングする」で声質も含めて調整することにより、バラエティ豊かなオリジナルの声質が得られることでしょう。


■注意
本記事の内容は、(株)アクエスト公式のものではありません。
記事内容の実施に伴う影響等は、すべて自己責任でお願いいたします。

■対象製品
    ATP3011R4-PU

■とりあえず設定を変えてみよう
ターミナル等で以下のようにATP3011R4対してコマンドを送ります。
すると、デフォルトに比べて高い声で合成するようになります。
リセットは不要で、コマンド設定後の発声から反映されます。

set pitch accent

なお、元に戻すには、次のコマンドを送ります。
#W03DFF
#W03CFF

■実際はEEPROMに値を設定している
実際のところ、内部EEPROMのアドレス0x03Cと0x03Dの値がアクセントの強さと声の高さを示しています。

アドレス:0x03C 値の範囲:0x00-0xFF
 アクセントの強さ(値が大きいほど声の高さの高低が大きい)

アドレス:0x03D 値の範囲:0x00-0xFF
  声の高さ(値が大きいほど声が低い)

0x03Dを0xFFにすると、アクセントの強さ、声の高さの両方ともデフォルト設定になります。
アクセントの強さの指定は連続的でなく段階的に変化するので、値を少し変えただけでは変化が現れない場合があります。また、アクセントの強さを小さくすると、ロボット的な単調なアクセントになりますが、「端」「橋」など単語の区別がつかなくなることにも注意が必要です。

■サンプル設定値
最初の例に示した値だけでなく、値をいろいろ変えて所望の合成音声を作ってみてくださいね。
とりあえずのために、以下のような設定値を示しておきます。

0x03C  0x03D
40H     40H   デフォルトと同じ
20H     01H   超小型サイズ
00H     20H   小型サイズ(棒読み)
10H     20H   小型サイズ
40H     80H   大型サイズ

■オリジナルの設定ができたら・・・
今回示したピッチの調整と、「隠しコマンドで声質をチューニングする」で示した声質調整を組み合わせて、是非、オリジナルのイメージの合成音声を作ってみてくださいね。
そして、イメージのものが出来上がったら、動画サイトなどで紹介して私にも教えてくださいね。
| AquesTalk pico LSI | 10:57 | - | - |
Arduinoで音声出力をはじめよう!「入門編」

keyword: Arduino 音声出力 サウンド 音声合成LSI

音声合成LSIを使えば簡単にArduinoで音声出力ができます!

demo

■Arduinoで音声を出力するいくつかの方法

電子工作を手軽に始められるマイコンボード『Arduino』。モノづくりやプロトタイピングで数多く利用されています。Arduinoからの出力の基本は、なんといってもLチカですね。誰もがLEDを点滅させることから始めたことと思います。その後、もう少し詳細な情報を出力するのにLCD(液晶ディスプレイ)を使う方法がありますが、Lチカに比べるとだいぶ難しくなってきます。

一方で、サウンドを使いたいということもあるでしょう。音は、なんらかの警告や注意喚起に最適ですし、見ないで操作する装置だってありますよね。

そこで、Arduinoででサウンドを出力する方法を考えてみると、おおむね以下の方法があります。(これらの特徴や使い方に関しては、書籍「Prototyping Lab」の31章に詳しく書かれています)

1.ポートのON/OFFによるブザー音
2.PCMAudioライブラリでPWM再生
3.Wave ShieldでSDカード上のサウンドデータを出力


■音声合成LSIを使う方法

今回は上記とは全く別な方法、音声合成LSIを使って音声メッセージを出力する方法を紹介します。この方法は、以下の特徴があります。

- 必要な機能がデバイス1つにまとめられているので配線が簡単
- スケッチにテキストを記述するだけで任意のメッセージを発声できる。
- あらかじめ音声メッセージ用の音声データを用意する必要がない。
- 大きな音声データのせいでArduinoのプログラム領域が占有されることが無い。
- 数値を簡単に桁読みで出力できる。
- 単語の置き換えなど、プログラムで文を構成すればメッセージのパタンも無限大。


それでは、とにかく作ってみましょう。今回のお題は「ラーメンタイマー」です。
ボタンを押して時間を分単位でセットし、時間になるとメッセージで知らせてくれます。
なお、以降の内容は、Arduinoを使ってなんらかのスケッチを動かしたり、ブレッドボードを使用して電子回路を組める方を想定しています。もしまだであれば、オライリーから出ている書籍「Arduinoをはじめよう」などを参考に、一通り動かせるようにしてください。


■用意するもの

- Arduino Uno×1
- ブレッドボード×1
- 音声合成LSI ATP3011F4-PU×1
- タクトスイッチ×1
- 抵抗4.7KΩx2
- 抵抗1KΩx1
- コンデンサ 47nF(0.047uF) x1
- コンデンサ 100nF(0.1uF) x1
- アクティブスピーカー ボリューム付×1
- ワニ口クリップ(コード付 アクティブスピーカー接続用)×2
- 配線素材(適量)

ここで使用する音声合成LSI(以降"LSI"とする)は、「AquesTalk pico LSI」 型番:ATP3011F4-PUです。28ピンのDIPパッケージの部品で、現在、秋月電気通商で¥850で入手可能です。なお、この女声のバージョン以外にも声種の異なる製品が販売されています(アクエストより)。

アクティブスピーカーとは、アンプ内蔵のスピーカのことです。パソコン用やiPod用などの外部スピーカーもこれに該当します。ボリュームがついているものを使うのが簡単ですが、もしボリュームがついていない場合は、別途ブレッドボード上に音量調整用の半固定抵抗を追加してこれで調整します(後述)。

■配線する

以下のように配線します。

haisen

回路図はこちら。
circuit

ArduinoとLSIの通信はI2Cで行います。I2Cとは、デバイス間を2本の線(+GND)で通信するもので、複数のデバイスも並列につなげられる特徴があります。そのため、I2CインターフェースのLCDモジュール、フラッシュメモリ、時計モジュールなども同時に使用可能です。いずれにせよ、ArduinoではI2C通信用のライブラリが用意されてますので、詳細を知らなくても簡単に使うことができます。

R1、R2の抵抗(プルアップ抵抗と呼ぶ)の値は、かなり適当で大丈夫です。今回の回路だったら1KΩ〜数10KΩでも動くでしょう。

100nFのコンデンサは、電源ラインを安定させるためのもので、LSIの7ピン-8ピン間になるべく近くなるように配線する必要があります。

時間設定用のタクトスイッチは、ArduinoのD2端子に接続しています。ボタンを押したときに信号レベルがLOWになります。

LSIの12ピンから1KΩの抵抗を通して、アクティブスピーカに接続します。この抵抗と47nFのコンデンサは、高域のノイズを除去するためのフィルタの役割があります。

アクティブスピーカは、通常ミニプラグが使われていますので、接続にはワニ口クリップを用いました。他にも市販の「ステレオミニジャックDIP化キット」を使っても良いでしょう。
このミニプラグ(オス)は、通常3極になっています。一番内側(コード側)はGNDに接続します。もう一方は端子のどちらかを指先で軽く触れたとき「プチッ」と鳴る方に接続します。もし、どちらも鳴るならお好きな側に。

「ミニプラグとクリップの写真」
clip


アクティブスピーカにボリュームが無ければ、5KΩ程度の半固定抵抗をブレッドボードに追加して、これで音量を調整するようにします。
haisen_vr
「半固定抵抗を接続した配線」

■スケッチを書き込む

Androidでは、動かすプログラムのことをスケッチと呼びます。
以下の手順で、ラーメンタイマーの動作を行うスケッチをArduino基板に書き込んでみます。

1. ここから今回のスケッチramen_timer.zipをダウンロードして任意の場所にファイル保存。
2. ramen_timer.zipを任意のフォルダに解凍
3. arduinoアプリを起動(Windowsなら arduino.exeを起動)
4. メニュー:ファイル>開く で、解凍したファイル中のramen_timer.ino を開く
5. メニュー:ファイル>マイコンボードに書き込む

以上で間違いが無ければ、パソコン上には「マイコンボードへの書き込みが完了しました。」と表示され、「ポン!」と起動時に音が鳴ると思います。その後、タクトスイッチを押すたびに「1分」「2分」と発声し、指定の時間が経つと「○分たったよ。ラーメン、ラーメン、ラーメンできた。・・・」と数回発声して終了します。

「完成動画」


■スケッチの音声出力している部分を読む

今回使用したラーメンタイマーのスケッチを読んで、音声出力の書き方をみましょう。
次のコードが、ラーメンタイマーのプログラムです。

「スケッチ」ramen_timer.ino

/////////////////////////////////
// ramen_timer - ラーメン・タイマー AquesTalk pico LSIを使用
//   
// by N.Yamazaki AQUEST Corp.  <http://www.a-quest.com>
#include <Wire.h>    // I2C通信用ライブラリ
const int ledPin = 13;    // LED のピン番号
const int swPin = 2;    // タクトスイッチのピン番号
int sec10;        // 残時間カウンタ 単位は[0.1秒]
int lastState;    // 一つ前のタクトスイッチの状態
int setMinute;    // セット時間 単位は[分]
void setup()
{
Wire.begin();  // ArduinoをI2C Masterとして初期化
pinMode(swPin, INPUT_PULLUP);    // スイッチ端子を入力(プルアップあり)に
pinMode(ledPin, OUTPUT);        // LED端子を出力に
sec10 = -5;
lastState=HIGH;
while(AquesTalk_IsBusy()) ; // Ready待ち
AquesTalk_Synthe("#J"); // 「ポン!」チャイム音出力
}
void loop()
{
/////////////////////////////////////
// タクトスイッチの処理
/////////////////////////////////////
int state = digitalRead(swPin);   
if(lastState==HIGH && state==LOW){ // ボタンが押された
setMinute = (sec10+650)/600; // 1分追加(65秒追加して分単位に切り捨て)
sec10 = setMinute*600;    // 0.1秒単位のカウンタ
String strMsg = GenMinuteMessage(setMinute);
while(AquesTalk_IsBusy()) ; // Ready待ち
AquesTalk_Synthe(strMsg); // 「1分」、「2分」、...
}
lastState = state; //現在のスイッチ状態を保存
/////////////////////////////////////
// カウンタ値に応じた処理
/////////////////////////////////////
if(sec10>0) { // カウントダウン中
sec10--;    // 0になるまでカウントダウン
LedBrink(); // カウントダウン中はLED点滅する
}
else if(sec10==0){ // Time up
if( !AquesTalk_IsBusy() ){
String strMsg = GenMinuteMessage(setMinute) + "+ta'ttayo.";
AquesTalk_Synthe(strMsg);    // 「○分たったよ!」
sec10--; 
digitalWrite(ledPin, LOW); // LED OFF
}
}
else if(-5<sec10 && sec10<0){ // Time up 以降 4回繰り返す
if( !AquesTalk_IsBusy() ){
// 「ラーメン、ラーメン、らーめんで・き・た!」
AquesTalk_Synthe("ra'-menn/ra'-menn/ra,ame-nn-/de',ki,ta'/...");
sec10--;
}
}
delay(100);  // 0.1sec 待ち
}
/*----------------------------------------------------
ローカル関数
-----------------------------------------------------*/
// 「○分」の音声記号列生成
//  例) "<NUMK VAL=3 COUNTER=fun>"
String GenMinuteMessage(int min)
{
String str = "<NUMK VAL=";
str += String(min, DEC);
str += " COUNTER=fun>";
return str;
}
// 10回呼び出しにつき1回、LEDを点灯
void  LedBrink()
{
static int count=0;
// counter update
count++;
if(count==10) count=0;
if(count==0) digitalWrite(ledPin, HIGH);
else         digitalWrite(ledPin, LOW);
}
/*----------------------------------------------------
音声合成用の関数
-----------------------------------------------------*/
#define I2C_ADDR_AQUESTALK 0x2E // AquesTalk pico LSIのデフォルトのI2Cアドレス
// LSIがコマンドを受信可能かチェック
// 戻り値 0:Ready 1:Busy 2:Error
int AquesTalk_IsBusy()
{
delay(10); // Busy応答は10msec以上待つ必要がある 連続して呼ばれた場合のため
Wire.requestFrom(I2C_ADDR_AQUESTALK, 1);
if(Wire.available()>0){
byte c = Wire.read();
if(c=='>')    return 0;    // Ready応答
else        return 1;    // busy応答
}
else {
return 2; //ERR: NOACK または応答が無い。I2Cの配線をチェックすべし
}
}
// 音声合成開始    引数に音声記号列を指定
void AquesTalk_Synthe(String &strMsg)
{
char msg[256];
strMsg.toCharArray(msg, 256);
AquesTalk_Synthe(msg);
}
// 音声合成開始    引数に音声記号列を指定
// 最後に"¥r"を送信
void AquesTalk_Synthe(const char *msg)
{
AquesTalk_Cmd(msg);
AquesTalk_Cmd("¥r");
}
// LSI にコマンド送信
void AquesTalk_Cmd(const char *msg)
{
// Wireの制約で、一度に送れるのは32byteまで
// AquesTalk picoへは一度に128byteまで送れるので、
// Wire.beginTransmission()〜Wire.endTransmission()を複数回に分けて呼び出す
const char *p = msg;
for(;*p!=0;){
Wire.beginTransmission(I2C_ADDR_AQUESTALK);
// Wireの制約で、一度に送れるのは32byteまで
for(int i=0;i<32;i++){
Wire.write(*p++);
if(*p==0) break;
}
Wire.endTransmission(); // 実際はこのタイミングで送信される
}
}

 

全体の構成としては、前半にArduinoスケッチの基本の、setup()とloop()関数があります。
中間部分にはローカル関数でアプリ固有の関数が2つあります。
そして、音声出力関係の関数は後半にまとめられています。(「音声合成用の関数」以下の部分)

実際に音を出しているところを見てみましょう。
setup()中の以下の部分が、起動時に「ポン」と効果音を鳴らしているところです。

 while(AquesTalk_IsBusy()) ; // Ready待ち
 AquesTalk_Synthe("#J"); // 「ポン!」チャイム音出力


AquesTalk_IsBusy()は、LSIがメッセージを受信できる状態かチェックする関数です。発声中は1が返るので、これで、発声の終了もチェックできます。whileループでLSIの準備ができるまで待ちます。
続くAquesTalk_Synthe()は、LSIにコマンド(またはメッセージ)を送る関数です。
ここでは、"#J"を指定していますが、これはLSIからチャイム音を出力するためのコマンドです。チャイム音は他に"#K"も指定できます。この関数の呼び出しで発声を開始し、関数からは発声完了を待たずに戻ります。

次に、loop()内の次の部分は、タクトスイッチを押下したときに、「1分」、「2分」と発声させている部分です。

String strMsg = GenMinuteMessage(setMinute);
while(AquesTalk_IsBusy()) ; // Ready待ち
AquesTalk_Synthe(strMsg); // 「1分」、「2分」、...

GenMinuteMessage()はローカル関数で、引数に数値を指定すると"<NUMK VAL=3 COUNTER=fun>"のような文字列を返す関数です。この文字列はLSIに数値を読ませるための特殊な記述で、

 桁読みで数値3を助数詞「分」をつけて読む"

という意味で、この例では「さんぷん」と発声し、数値の文字を変えれば任意の数を「いっぷん」「にふん」のように正しい読みとアクセントで読み上げます。数値の読み方やアクセントは数によって複雑に変化するのですが、それらはLSIが自動でやりますので簡単です。
助数詞の部分は他にも時分秒、年月日などいろいろ用意されています。詳細はLSIのデータシートの「音声記号列仕様」に詳しく示されています。
その後、先と同様にAquesTalk_IsBusy()でLSIが受信可能状態かをチェックします。
このチェックが無くても動くのですが、発声中にAquesTalk_Synthe()を呼び出すと機能しないので、チェックするようにしてください。
AquesTalk_Synthe()の引数に文字列"<NUMK VAL=X COUNTER=fun>"を指定して、「1分」、「2分」と発声させています。

つづいて、loop()内の次の部分は、指定時間が経過したときに「○分たったよ」と発声する部分です。

String strMsg = GenMinuteMessage(setMinute) + "+ta'ttayo.";
AquesTalk_Synthe(strMsg); // 「○分たったよ!」

基本的に前述と同じですが、ここでのポイントは先ほどの数値を読ませる文字列の後ろに"+ta'ttayo."という文字列を指定知る部分です。もうお気づきのことと思いますが、「たったよ」を指定しています。この文字列は音声記号列と呼ばれ、記述方法は基本ローマ字で表記して、さらにアクセントや文節の区切りを指定することができます。

助詞の「は」を"wa"と音として表記するなどいくつか気をつけない点があります。また誤った指定をするとエラーになり発声しません。記述方法の詳しくはLSIのデータシートの「音声記号列仕様」に書かれていますので、是非参照してください。

■オリジナルのスケッチで音声出力する

自分のアプリに音声出力機能を追加する方法です。

まず、ラーメンタイマーのスケッチの後半の「音声合成用の関数」以下をざっくりコピーします。
次に、スケッチの先頭に次の行を追加してください。この行は、I2C通信を使うために必要なおまじないです。

 #include <Wire.h>

また、setup()の最初に次の行を忘れずに追加してください。これはI2C通信の初期化関数です。

 Wire.begin();

あとは、スケッチの中で音声出力をしたい部分に、AquesTalk_IsBusy()でLSIの状態を確認してからAquesTalk_Synthe()でメッセージを送信するだけです。簡単でしょ!

音声出力のHelloWorldとなるもっともシンプルなスケッチを、以下に示しておきます。(音声合成用の関数は省略)

「スケッチ  」HelloTalk.ino

// Hello Talk
#include <Wire.h>
void setup()
{
Wire.begin();
}
void loop()
{
while(AquesTalk_IsBusy()) ;
AquesTalk_Synthe("konnnichiwa.");
}

2012/11/15 追記
音声合成を使うスケッチを自分で書く場合は、
音声合成LSIライブラリを使うと簡単です。

■音声記号列を試行錯誤するためのツール

音声記号列は慣れるとさくっと書けるようになるのですが、最初のうちはアクセントや区切り記号の指定に迷って、試行錯誤が必要でしょう。そのたびにスケッチを転送して実行を繰り返すと効率が悪いので、そんなときは以下のAquesTalkTermスケッチを使うと楽です。これはArduino基板をシリアルモニタとLSIの中継に使い、シリアルモニタから任意のコマンドや音声記号列をLSIに送信することができます。

使い方は、このスケッチをArduinoに書き込んだ後、シリアルモニタを起動します(メニュー:ツール>シリアルモニタ)。画面下の改行コードが[CRのみ]、ボーレートが[9600bps]であることを確認し、上のエディトボックスにLSIに送るコマンド(たとえば、"konnnichiwa.")を入力して送信ボタンのクリックで転送できます。"kkk"などと誤った音声記号列を指定すると、"E105"とちゃんとエラーコードが返ります。

スケッチのダウンロード AquesTalkTerm.ino

■音声記号列を記述するポイント

読みの指定は音として意識する必要があります。前述の助詞の「は」を"wa"と表記するほかにも、二重母音の「えい」「おう」を長音化させる。例えば「合成」は"gousei"とするのでなく"go-se-"としたほうがわかりやすくなります。
また、母音の無声化も効果的です。無声化とは、例えば文末の「〜ます。」の「す」がスーッと抜けた音になり、物理的には声帯の振動しない音になることをいいます。この例では、"masu." でなく"ma_su." と指定します。文末以外の文中でも無声化は起こり、例えば「スケッチ」を"sukecchi"の代わりに"_sukecchi"と無声音を使ったほうが聴きやすくなります。おおまかですが、無声化は次の条件で発生します。

 キ、ク、シ、ス、チ、ツ、ヒ、フ、ピ、プ、シュなどが、カ、サ、タ、ハ、パ行の直前に来るとき

まとめると、以下に注意します

・助詞を音にあわせる
・二重母音の長音化
・無声化

そういや、これを忘れていました。漢字のテキストを音声記号に変換するWebサービスがあります。詳しくは、こちらの記事を参照してください。

「音声記号列を簡単に記述する方法」
http://blog-yama.a-quest.com/?eid=970149

■発声速度を変えるには

次の関数を追加し、これを呼び出せば、それ以降、発話速度が指定の値に変更されます。
なお、この変更は電源を切ってもそのまま有効になります。 

 AquesTalk_Speed() 2012/10/10修正

// 発話速度を変更
//    speed: 50-300  default:100 50:最遅 300:最速
void AquesTalk_Speed(int speed)
{
String hex;
String str;
if(speed<50) speed=50;
else if(speed>300) speed = 300;
hex = String(speed%256, HEX);
if(hex.length()==1)  str = "#W0020" + hex;
else                 str = "#W002"  + hex;
str.toUpperCase();  // 大文字で指定 2012/10/11 追記
while(AquesTalk_IsBusy()) ;
AquesTalk_Synthe(str);
hex = String(speed/256, HEX);
if(hex.length()==1)  str = "#W0030" + hex;
else                 str = "#W003"  + hex;
while(AquesTalk_IsBusy()) ;
AquesTalk_Synthe(str);
}


■発声を途中で中断するには

次の関数を追加し、これを呼び出せば、発声の途中で止めることができます。

 

 

AquesTalk_Break()

// 発声を中断する
void AquesTalk_Break()
{
AquesTalk_Cmd("$");
}


■アンプを自作する(オーディオ回路)

ここまではアクティブスピーカーを使用しましたが、アンプをつけてスピーカをならしてみます。お勧めは、データシートの付録にも示している1.2Wのアンプの回路です。

circuit amp
「アンプ回路図」

このアンプのICには、秋月電子通商の「ミニモノアンプ基板」¥500を使いました。
なお、ブレッドボード配線での注意点として、アンプの消費電流は大きいので動作中に電源電圧が変動して動作が不安定(とぎれとぎれの変な音になったりすることもある)になることがありました。これを防ぐためにアンプIC近くの電源+5VとGNDの間に100uFの電解コンデンサを追加しています。

「アンプを実装」
amp

なお、アンプ回路は他でも構わないのですが、LSIからの出力ゲインは4Vp-pと比較的大きいので歪まないように注意して設計してください。

■スピーカーは必ず筐体に入れて

最後に、自作の場合スピーカを剥き出しで動かすことが多いのですが、これだと残念な音しかでません。試しに、手でスピーカーの周りを覆って鳴らしてみてください。こうすると低音からしっかり鳴りだすことがわかります。装置が完成のときには、スピーカをちゃんと筐体にいれて鳴らしてくださいね。

speaker「手でスピーカの周りを覆ってみたら」



■外部LINK

今回のラーメンタイマーのスケッチ
http://www.a-quest.com/blog_data/ramen_timer.zip

かんたんマイコン「Arduino」の始め方
http://pc.watch.impress.co.jp/docs/2008/1218/musashino023.htm

秋月電子通商「音声合成LSI ATP3011F4-PU」
http://akizukidenshi.com/catalog/g/gI-05665/

音声合成LSI使用レポート
http://www.eleki-jack.com/KitsandKids2/2012/04/lsi.html

ATP3011F4-PUデータシート
http://www.a-quest.com/archive/manual/atp3011_datasheet.pdf

ArduinoでI2C制御LCD ACM1602を使う
http://www.eleki-jack.com/mycom2/2012/05/arduinoi2clcd_acm16021.html

 

[Arduino] AquesTalk ライブラリ
http://blog-yama.a-quest.com/?eid=970151

 

| AquesTalk pico LSI | 20:53 | - | - |
音声記号列を簡単に記述する方法

 音声合成LSI「AquesTalk pico LSI」の入力はローマ字の音声記号列です。基本はローマ字で記述するだけですが、助詞の「は」を "wa" にしたり、アクセントを入れたり、最初はこれを記述するのに戸惑うかたも多いかと思います。

そんなときは「音声記号列生成 Webサービス」を使うと簡単です。
漢字かな混じりのテキストを、ローマ字音声記号列に変換するWebサービスです。
あとは生成した音声記号列をコピペして使うだけ!



必要に応じて、読みの修正、ポーズの位置・長さ調整、アクセントの位置・大きさ(区切り記号による)の調整、無声化などを、手動で調整すると、ずっと品質の高い合成音声が得られるようになりますので、是非お試しください。
音声記号列の仕様は「AquesTalk pico LSI」のデータシートの最終章を参照してください。

なお、AquesTalk(2)エンジンで使用する、かなの音声記号列は、こちらのデモページで変換できます。


対象デバイス ATP3010、ATP3011、ATP3012

| AquesTalk pico LSI | 17:18 | - | - |
音声合成LSI「AquesTalk pico LSI」 種類とその違い

音声合成LSIの製品種類が増えてきましたので、ここでそれぞれの違いをまとめておきます。(2012/08/31) (2012/09/28追記)

■「AquesTalk pico LSI」製品一覧(発売の新しい順)

  • ATP3011R4-PU
  • ATP3012F5-PU
  • ATP3011F1-PU
  • ATP3011M6-AU
  • ATP3011M6-PU
  • ATP3011F4-AU
  • ATP3011F4-PU
  • ATP3010F4-PU

■製品型番の見方

ATP301XYY-ZZ

    X:    製品番号 リリース順に0,1,2となっています。
    YY:   声種(声の種類)
    ZZ:  パッケージ PU:28pinDIP AU:TQFP32pin


■声種(声の種類)

  • F5 落ち着いた女声
  • F4 かわいい系の女声
  • F1 通称"ゆっくり"
  • M6 男声
  • R4 ロボ声

■製品番号による違い

  ATP3012 ATP3011 ATP3010
動作クロック 外部クリスタルまたは
セラミック振動子(16MHz/10MHz)
内蔵RCオシレータ(8MHz) 外部クリスタルまたは
セラミック振動子(16MHz)
音声帯域 0 - 5KHz 0 - 4KHz 0 - 4KHz
PWM搬送周波数 30KHz/20KHz 16KHz 16KHz
動作電圧 2.7V(16Mは3.1V)-5.5V 2.5V-5.5V 3.8V-5.5V
UARTボーレート EEPROMに設定 設定シーケンスによる自動設定 EEPROMに設定
エイリアス除去フィルタ 不要 必要 必要

ATP3012 は、ATP3011と比べると

  • 音声の周波数帯域を5KHz(サンプリング周波数10KHz)に上げて音質の向上を行いました。
  • 折返し雑音の帯域を可聴領域より高くしアンチエイリアス用のLPF を省略可能です(16MHzモード)。
  • 動作クロックは、外付けとなり、クリスタルかセラミック振動子の外付けデバイスが必要です。
  • 最小電源電圧は、動作クロックにより異なります。10MHzのとき2.7V、16MHzのとき3.1V
  • UART のボーレート設定は、最初に’?’を送るのでなく内部EEPROM に設定します。出荷時は9600bpsです。
  • AOUT/PMOD1 の端子が入れ替わっています。
  • 動作クロック設定のためのCLK16端子が追加され、TEST端子が無くなりました。
  • 発声時の消費電流が多少増加しています。


ATP3011 は、ATP3010と比べると

  • 動作クロックは、内臓RCオシレータとなり、外付のクリスタルが不要です。
  • 動作電圧が、2.5Vから動作可能となっています。
  • UARTのボーレート設定が、起動時にホスト側から'?'を転送して調整するようになっています。
  • SLEEP端子により、待機時消費電流を少なくするスリープ機能が追加されています。



■ATP3011からATP3012への移行ポイント

  • Arduino Uno基板に挿して使用する場合は、音声出力はD9端子になります。
  • 外付けのクリスタルかセラミック振動子が必要です。
  • 2セルのバッテリーで動作させるときは、10MHzクロックでの使用を推薦します。
  • 通常、アンチエイリアス用のLPFは不要ですが、アンプの動作よっては歪む場合がありますので、必要に応じてLPFを追加してください(データシート『13.1. アナログ・オーディオ回路(参考回路)』参照)。


■リンク

AquesTalk pico LSI
AquesTalk音声合成ミドルウェア
AquesTalkPico LSI 関連ブログ記事

| AquesTalk pico LSI | 14:58 | - | - |
隠しコマンドで声質をチューニングする
音声合成LSI「AquesTalk pico LSI」ATP3011シリーズは、裏コマンドで声質を調整することができます。



■注意
本記事の内容は、(株)アクエスト公式のものではありません。
記事内容の実施に伴う影響等は、すべて自己責任でお願いいたします。

■対象製品

ATP3011F4-PU
ATP3011F4-AU
ATP3011M6-PU
ATP3011F1-PU
 

■原理は動作クロックの変更
特に音声合成の動作を変えているわけでなく、単純に動作クロックを変更するだけです。
したがって、この調整のによる効果はテープ(古い!?)の早回しみたいなものです。
このデバイスは、OSCCALレジスタの値を変更することで、内部RCクロック周波数を調整できます。
OSCCALの値と周波数の関係は次のとおり。

osccal
*Atmel社 ATmega328 データシートより


ただし、あくまでも平均的なもので、実際は個別デバイス毎に特性は異なります。
途中で不連続になっている部分にも注意が必要です。
 
ATP3011シリーズは、EEPROMアドレス0x03Eの値を起動時にOSCCALに設定します。
ただし、不意の設定を防ぐため、アドレス0x03Fは、アドレス0x03Eの値を論理反転した値にする必要があります。アドレス0x03Eには、0x01から0xFEまでの値を指定できます。
低くする例 0x03E:0x01 0x03F:0xFE
低くする例 0x03E:0x10 0x03F:0xEF
高くする例 0x03E:0xCC 0x03F:0x33
高くする例 0x03E:0xFE 0x03F:0x01
出荷時設定 0x03E:0xFF 0x03F:0xFF


■設定方法
EEPROMの値の設定は、#Wコマンドで行います。
たとえば、次のようにします。

>#W03E01
>#W03FFE

その後、デバイスのリセットで有効になります。
基本は8MHzなので、声の高さを半分から1.5倍くらいまで変化できそうです。
なお、声の高さの変化に連動して、発話速度も変化しますので、
EEPROMアドレス0x002-0x003の値でを話速も調整するとよいでしょう。

■原理の理解やデバイスの知識が必要
内部クロックを8MHzから大幅に変化させたときの動作はデバイス自体が保証してません。
個人的には20MHzまで動作可能なデバイスなので壊れることは無いとは思うのですが。
クロックを上げたときは最小動作電圧も高くなるので、3V系では注意が必要です。
ATP3011の仕様に示されたタイミング等時間関連の値はすべて変わります。
万が一、シリアル通信ができなくなるとEEPROMの設定値をデフォルトに戻す術がなくなります。
その他、想定外のリスクがあるかも。

というわけで、本記事は、ハードウェア上級者向けです。あしからず。
 

■内部クロックを8MHzにトリミングする
そもそも、この機能を用意したのは、このデバイスの内部クロック精度が+-10%とばらつきが多く、聞いてわかるほどのデバイス間の違いがあります。
ただ、調整により、+-2%程度まで精度を高められるので、場合によっては必要になるかなと。

で、内部クロックを8MHzに調整する方法ですが、
内部クロック信号は外部に出てないので、直接に測定できません。そこで、調整にはAOUT信号を用います。
音声出力時にAOUTからは一定周期の矩形波が出力されます。
この間隔をオシロで測定し、64μsec になるように上記の方法で内部クロックを調整すればバッチリです。

■ATP3010F4はどうする?
外部クロックだから、異なる発振周波数のクリスタルに変えちゃおう!
| AquesTalk pico LSI | 11:05 | - | - |
PROFILE
Follow
CATEGORIES
LATEST ENTRIES
SEARCH THIS SITE
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
SONY MDR-CD900ST
SONY MDR-CD900ST (JUGEMレビュー »)

普段これで開発しています。
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND