ノート読み上げを録音した音声の複数スライド組み込みをPowerPointVBAで自動化してみた

この記事は、[NTTテクノクロス Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ntt-tx)の13日目記事です。

## はじめに
NTTテクノクロスの佐藤と申します。
人事システムの保守・運用を担当するかたわら、サイト作成やダイバーシティ関連の業務など担当しています。

私は、自分の耳が聴こえないということを生かして聴こえないならではの業務上の工夫を考えてそれを同じ聴覚障がいがある方々と共有するなどして皆でともに働きやすい環境を作りたいと常々考えています。
その中で、聴覚障がいがある方が誤解やすれ違いをできるだけなくし、円滑に他の社員と働けるようにと考え、「ツナガル・ブック」というガイドブックを発行し社外へもリリースしました。

今後も様々な視点を持って何ができるか考えながら業務を遂行していきたいと思っています。

※参考：
[情報畑でつかまえて：「NTTテクノクロスが目指す誰もが働きやすい職場とは。～聴覚障がい者との相互理解を図る「ツナガル・ブックTM」発行への想い～」](https://www.ntt-tx.co.jp/column/pr_blog/231204/)


### なぜこの記事を書こうと思ったか
私は生まれつき耳が聞こえません。そのため、普段は手話・筆談など視覚メインの生活をしています。
また業務では、TeamsというMicrosoft社が開発したツールを使ってメンバーと文字チャットしたり、会議参加時はTeams内にあるトランスクリプト（相手の発声を文字にして表示する機能）を読むことで内容を把握するなど工夫しています。自分から発言するときはチャットを打って発言しています。

社内イベントなどで登壇する時は、今時点では２通りの方法をとっています。

- NTTテクノクロスが開発した音声合成システムを使う方法（＝[FutureVoice Crayon](https://www.futurevoice.jp/)）
- PowerPointの読み上げ機能・録音機能を使う方法

それぞれ状況によって使い分けをしているのですが、特にPowerPointの読み上げ機能を使う場合、後述する注意点があることが分かりました。
それを解決し、読み上げ機能と録音機能を使って発表者の手間がかかることなく資料を作り、安心して登壇出来るようになればと思い、この記事を書きました。


## PowerPointのノートと読み上げ機能について

皆さんご存知の方は多いと思いますが、念のため説明します。
PowerPointには、「ノート」があり、そのノートを読み上げる機能があります。

### PowerPointのノートとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772852/2befded0-0488-8353-33c1-f00620ae15a1.png)

上記画像の緑枠の部分がノートです。

このノートに発言内容を書いておけば、スライドショーにして発表した時にノートの文章が発表者側の画面に出るのでそれを見ながら話すことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772852/2bf14e45-a275-fd3b-74cd-774fdb3366af.png)
※画像緑枠がノートの文章です

そのため、発表時に言葉が詰まったり何を話すか忘れてしまって焦ったりということを防ぐことができるという発表者にはありがたい機能です。

しかし、発声が困難な方（耳が聞こえない方や風邪などで喉を傷めてしまった方など）はノートに文章を用意してもそれを見て話すことができません。そこで、「読み上げ」機能が出てきます。

### 読み上げ機能とは

ノートに文章を書いておくと、その文章を読み上げさせることができます。（具体的な方法は下記「読み上げ機能の使い方」参照）
それを「読み上げ」機能といいます。

しかし、PowerPointのノート読み上げはデフォルトでメニューに出てきていません。そのため設定でどうにかしないといけません。
今からこの設定のやり方を書いていきます。

#### 読み上げ機能の設定方法

1. PowerPointの「ファイル」＞「オプション」＞「クイックアクセスツールバー」で「読み上げ」を選択
1. 「追加」を選択し、右側に表示させたら「OK」を押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772852/bed017a3-77fa-fc23-bd0b-7c591e2fde10.png)
※この時、「クイックアクセスツールバーをリボンの下に表示する」のチェックがありますが、これは好みによります。


すると、画像の通り読み上げボタンが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772852/1b2c539c-8430-ffaa-c593-43dc1cf9b27e.png)

#### 読み上げ機能の使い方

やり方は簡単です。
ノートの文章で読み上げさせたい文章を選択して、読み上げボタンを押すだけです。

例えば、下記画像の緑枠の文章のみを読み上げさせたいときはその文章だけを選択して読み上げボタンを押せばその部分が読み上げられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772852/46746ced-94d7-faab-862c-bf43c9c64552.png)
なお、全文を一度に読み上げさせたいときは「Ctrl」＋「A」で全選択が早いです。


## PowerPointの録音機能について

もう一つ、PowerPointには録音機能があります。
これはPowerPointでスライド発表する時に自分または他者の声を吹き込み、それを録音するものです。ノートの読み上げを同時に録音することもできます。
そのため、発声ができない方（耳が聞こえない方・風邪などで発声が困難な方）も読み上げ機能を利用してノートの文章を読み上げさせ、録音機能でそれを録音すれば、登壇時には録音したものを読み上げて発表ができます。

また、それを動画にすれば１ページごとに組み込まれた録音を全部読み上げさせながら発表も可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772852/412adc0f-a9c7-a526-87eb-c7a8fe1f61d5.png)
※こちらで動画にすることができます

しかし、これには注意点があります。

- 読み上げ機能を使って発表資料の準備をしたくても、１ページごとに読み上げさせる手間がかかる
（10ページなど複数ページに及ぶ場合は時間がかかる）
- 動画にした場合、質疑応答などで「●●が書いてあったページに戻って」と言われた時に遡る手間がかかる
（スライドだとマウスを動かすだけですぐに戻ることができる）
 
## 複数スライドへの音声組み込みを自動化してみよう

しかし、PowerPointのノート読み上げ機能と上記の録音機能と同時に動かしてスライドに組み込む動作を全ページに渡って繰り返すプログラムを作れば、組み込み作業の負担が軽減されます。そこで、今回はこの方法にチャレンジしてみました。

おそらく他にもやり方があり、そちらの方がスムーズということもあるかもしれませんが、今回はこの方法を書いておきます。

### 開発環境
- Windows11 Pro（Windows11 Homeでも確認済）
- PowerPointバージョン：Microsoft® PowerPoint® for Microsoft 365 MSO (バージョン 2310 ビルド 16.0.16924.20054) 64 ビット

### 下準備
まず、下準備として以下の作業が必要です。

1. スライドショーで読み上げたい資料を用意する
1. 資料のノートに発言内容を記載
今回はサンプルとしてこのようなものを作りました。
スライド１⇒スライドには「TestView1」ノート：「おはようございます。テスト１です。」
スライド２⇒スライドには「TestView2」ノート：「こんにちは。テスト２です」
スライド３⇒スライドには「TestView3」ノート：「こんばんは。テスト３です」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772852/765ec0cc-4cd6-944c-e228-d056bdbf2ede.png)


1. もしPowerPointのメニューに「開発」がない場合は「開発」を出しておく
※PowerPoint VBAなので、PowerPoint内でVisual Basic Editor(VBE)を起動し、そこで動かす必要があります。</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772852/c8861019-6a51-4836-3c6f-5db16063663e.png)

　自分のPowerPointメニューにない場合は、[ファイル]＞[オプション]＞[リボンのユーザ設定]から「開発」を入れてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772852/c7c32d96-1ec7-21f0-8207-2662b4559adc.png)





### コード

コード内で工夫した点は

- ノートを読み上げさせたものを同時に録音する
- ページが複数ある場合は１ページずつ読み上げ・録音を繰り返す
- 録音したものは直接スライドに組みこむ
- 録音ファイル自体もファイルと同じ場所に作る

です。

コードは以下の通りです。(VBAですが、分かりやすく色分けするために色付けはVBを採用しています)
※ざっと作ったためエラーハンドリングは入れていません。
※動かない場合はおそらくFSOオブジェクト設定ができていないケースが考えられます。FSOオブジェクト設定まで説明すると長くなってしまうため申し訳ございませんが、ネットで調べてみていただけると助かります。

```vb
Option Explicit

Sub EmbedVoice()

    Dim lPgcnt As Long          'ページカウント
    Dim strPath As String       'パス（フォルダパス＋wav）
    Dim strFilePath As String   'ツール本体のパス
    Dim strNote As String       'ノートのテキスト
    Dim oFileStream As Variant
    Dim ovoice As Variant
    Dim fso As Object
    
    Dim obSlide As Slide
    Dim obShp As Shape
    Dim obEffect As Effect
    
    Dim cnt As Long
    
    ' 初期設定
    lPgcnt = ActivePresentation.Slides.Count
    cnt = ActiveWindow.Selection.SlideRange.SlideIndex
    
    '全てのスライドが終わるまで読み上げさせる
    For cnt = 1 To lPgcnt
        
        '現在のスライドのノートを取得
        strNote = ActivePresentation.Slides(cnt).NotesPage.Shapes.Placeholders(2).TextFrame.TextRange.Text
    
        'ノートが空白の場合終了
        If strNote = "" Then
            Exit Sub
        End If
    
        'wavファイルのパスを作成
        strPath = ActivePresentation.Path & "\voice" & cnt & ".wav"
    
        'wavファイルが既にあれば削除
        Set fso = CreateObject("Scripting.FileSystemObject")
        If fso.FileExists(strPath) Then Kill strPath
    
        'wavファイルに保存
        Const obStereo = 39
        Const CrFile = 3
    
        Set oFileStream = CreateObject("SAPI.SpFileStream")
        oFileStream.Format.Type = obStereo
        oFileStream.Open strPath, CrFile
    
        '音声合成エンジンを取得
        Set ovoice = CreateObject("SAPI.SpVoice")
        Set ovoice.AudioOutputStream = oFileStream
        
        '音声合成実行
        ovoice.Speak strNote
        oFileStream.Close
    
        'audioの組み込み
        Call obAudio_Create(obSlide, obShp, obEffect, strPath, cnt)
        
    Next

    '解放処理
    Set fso = Nothing
    Set ovoice = Nothing
    
    MsgBox "Done."

End Sub
'audioの組み込み
Private Sub obAudio_Create(ByVal obSlide As Slide, ByVal obShp As Shape, ByVal obEffect As Effect, ByVal strPath As String, ByVal cnt As Integer)

    Set obSlide = ActivePresentation.Slides(cnt)

    Set obShp = obSlide.Shapes.AddMediaObject2(strPath, False, True, 10, 10)

    With obShp.AnimationSettings.PlaySettings
        .HideWhileNotPlaying = True
    End With

End Sub

```

### 動かした結果

上記コードで動かした結果は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772852/6cf5b118-6cf8-6c5f-0a46-4b66666efa35.png)

このように、全てのスライドに録音マークがつきました。
この録音マークはどうなるのかというと・・・

#### スライドショーでの発表時

このようにスライドショーにもマークが出ることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772852/39d4d646-1b6d-542d-6e0d-5fa1827b67f8.png)

そしてスライドショーにして発表するときは、このマークをクリックすると録音された音声が読み上げられます。試しにTeamsのトランスクリプトを使って確認しました。

以下のように、スライドのノートの文章がきちんと読み上げられていることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772852/9a34f369-d08d-046e-8fef-be8e891b9e4f.png)

これで、１ページごとに手動で録音する手間なく、複数のページを全自動で録音させ、更にスライドに組み込むことができるようになりました。

以下、●の部分が今までの問題点、⇒以降のコメントがツールによって解決できた点です。

- 周囲に雑音があっても安心してノートの文章を音声合成で読み上げさせることができる
　⇒パソコンから出る合成音声を利用した録音だと合成音声だけが録音されるので、
 　自分の声を録音したくても周囲に雑音がありやり直しを繰り返したということが起こらない
 
- 同時にスライドに録音を組み込むことができる
　⇒手動の場合、合成音声を再生させて更に録音し、それをスライドに組み込む手間がかかるが
 　　それを自動化することで負担が軽減される
   
- 一度に複数ページに渡って録音組み込み可能
　⇒複数ページを手動で録音し組み込む場合、１ページごとにする必要があるが
 　それを自動化することで複数ページに渡る録音の負担が軽減される
  
- トランスクリプトで録音結果を確認できる
　⇒スライド発表をTeams画面共有で行なう場合、スライドの音声が今どこまで進んでいるかを
 　　Teamsトランスクリプトを見ながら確認し、自分で進めることができる
  　　特に聴覚に障がいがある方にとっては人の手を借りずに自分で発表できるようになる
 
- 途中で２ページ戻ってと言われてもスライドなのですぐに戻れる
　⇒一般的には複数ページに音声を組み込みそれを動画にするのが多いが、
 　　その場合発表後の質疑応答で「●ページを見せて」と言われてもすぐに戻ることができない
  　　しかし、スライドショーだとマウスでカーソルを戻すだけですぐに戻れる


特に合成音声を利用した録音と複数ページに渡っての録音組みこみ、
そして発表時に録音をトランスクリプトで確認し発表できることは聴覚に障がいがある方にとっては有効です。


#### 発表する際に注意したいこと

- PowerPointから音声を出すようにするためには、共有時に必ず「コンピューターサウンドを含む」をONにしないといけません。
これをしないと音声が出ないばかりか、トランスクリプトにも音声認識結果が表示されなくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772852/69752af8-04cb-23d4-e97d-d1d23218a8d7.png)


### 今後のツール改善案
今まで色々と解説してきましたが、これで完璧ではありません。
今後、以下の点を改善したいと考えています。

- スライドをめくると自動で次ページの音声が読み上げられるようにしたい
　（現時点ではスライドをめくって録音マークを押す必要がある）

 <font color="blue">＜追記＞
 スライドをめくると自動で次ページの音声が読み上げられるようになりました。
 ツールを動かして録音マークを付けてから以下の設定をして保存すると、スライドをめくったのと同時に次ページの音声が読み上げられるようになりました。</font>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772852/6066289f-6bb0-f808-fbfa-17b9b06cd068.png)
 
- 読み上げさせたいPPTファイルを挿入すればそのファイルに音声が組み込まれるようにしたい
　（現時点では毎回、読み込ませたいPPTにコードを貼り付けて動かさないといけない）
 　⇒例として、以下の画面のようなツールがあれば良い
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772852/ccf9f243-5f7b-3de9-4cb1-6fbf53a79007.png)

- １回目ツールを動かして録音マークをスライドにつけた後、PowerPointのノートの文章に修正を入れた場合、<b>１回目で作った録音マークを消してからツールを動かす必要がある</b>
　→ツールを動かす際、録音マークのあり／なしを判断して「あり」の場合は削除するようにしたい


これらについては時間があった時にまた改善し、完成したら再度Qiita記事にアップ出来たらと思っています。

## まとめ

今回はPowerPointVBAを使って、PowerPointの音声読み上げ機能・録音機能を使ったツールの説明を行ないました。
この記事が聴こえない人にとっても聴こえる人にとっても役に立つことを願っています。

また弊社NTTテクノクロスは開発系会社なので優秀なエンジニアが数多くいます。
[「NTTテクノクロス Advent Calendar」](https://qiita.com/advent-calendar/2023/ntt-tx)はどれも読みごたえがあるので、ぜひともご覧ください。

明日は@hara-stさんからアジャイル系の記事がUPされる予定です。こちらも楽しみにしていてください！