前提
ubuntu20.04
python3.8を使用しています。
実現したいこと
オフラインで日本語の音声を作成し再生しようとpy-espeak-ngを使用して実現しようと考えています。しかし、現状は英語の方も作成できずエラーが出ている状況です。
申し訳ございませんがご教示いただけないでしょうか。
よろしくお願いいたします。
発生している問題・エラーメッセージ
wave.open(StringIO(wavs))の場合
TypeError: initial_value must be str or None, not bytes
wave.open(BytesIO(wavs)) の場合
Traceback (most recent call last): File "j.py", line 12, in <module> wav = wave.open(BytesIO(wavs)) File "/usr/lib/python3.8/wave.py", line 510, in open return Wave_read(f) File "/usr/lib/python3.8/wave.py", line 164, in __init__ self.initfp(f) File "/usr/lib/python3.8/wave.py", line 129, in initfp self._file = Chunk(file, bigendian = 0) File "/usr/lib/python3.8/chunk.py", line 63, in __init__ raise EOFError EOFError
該当のソースコード
#!/usr/bin/env python3 # -*- coding: utf-8 -*- from io import StringIO, BytesIO import wave from espeakng import ESpeakNG esng = ESpeakNG(voice='english-us') wavs = esng.synth_wav('Hello World!') wav = wave.open(StringIO(wavs)) #wav = wave.open(BytesIO(wavs))
wav = wave.open(StringIO(wavs))
#wav = wave.open(BytesIO(wavs))
この2行の意図を書いてください。何をしようとしていますか。
下がコメントになっている理由と、わざわざ載せた理由がありますか?
wavsの中身が分からないので、wavs = esng.synth_wav('Hello World!')のあとに
print(wavs) あるいは print(wavs[:20])した結果を追記ください。
> wavs = esng.synth_wav('Hello World!')
のすぐ下に
print(len(wavs))
を追加して実行したら、「0」と表示されませんでしょうか?
https://github.com/gooofy/py-espeak-ng/blob/master/espeakng/__init__.py
の「def synth_wav(...」のところを見ると、「self._espeak_exe(args, sync=True)」で作成したファイル「f」を「wav = f.read()」で読み込んで、それを返してるはずなのですが、返されたのを「print(len(wavs))」で確認して「0」ならば、「def synth_wav(...」内のどこかがうまくいってないのでしょうね
> esng = ESpeakNG(voice='english-us')
https://github.com/espeak-ng/espeak-ng/blob/master/docs/languages.md
を見ると、「english-us」は無いですね
esng = ESpeakNG(voice='english-us')
↓ 修正
esng = ESpeakNG(voice='en-us')
wav = wave.open(StringIO(wavs))
↓ 修正
wav = wave.open(BytesIO(wavs))
で、どうでしょうか?
僕もちょっと調べていたのですが、使っているモジュールはそれではなくて、こちらのようです。
speek-ng の方には、ESpeakNGというクラスがは無いので掘っていました。
https://github.com/gooofy/py-espeak-ng
質問のコードは、基本的にこちらのサイトにあるサンプルと同じです。
ただし、このサイトのコードは、python2のモジュール(StringIO)で書かていて、python3 で動かそうとした場合、質問者のような疑問が生じるということになるのだと思います。
ちなみに、python3にも対応しているとは書いてあります。
なぜそうなるのかについては、不明なのですが。
> 日本語の音声を作成しようとpy-espeak-ngを使用して実現しようと
espeak-ng --voices
を実行して確認したら、日本語は「voice='ja'」のようです
「py-espeak-ng」
https://github.com/gooofy/py-espeak-ng
は、そこに「Some simple wrappers around eSpeak NG」と書いてあるように、「eSpeak NG」を呼び出して使います
「Requirements」にも「espeak-ng binary installed and in PATH」と書かれてますように、別途「eSpeak NG」をインストールする必要があります
「Links」にある下記が「eSpeak NG」です
https://github.com/espeak-ng/espeak-ng
「eSpeak NG」の「espeak-ng」というコマンドを、「py-espeak-ng」は
https://github.com/gooofy/py-espeak-ng/blob/master/espeakng/__init__.py
の「def _espeak_exe(...」で呼び出して使います
【追記】
google colabで下記を実行しても、エラーは出ません
!sudo apt install espeak-ng
!pip install py-espeak-ng
from io import StringIO, BytesIO
import wave
from espeakng import ESpeakNG
#esng = ESpeakNG(voice='english-us')
esng = ESpeakNG(voice='en-us')
wavs = esng.synth_wav('Hello World!')
#wav = wave.open(StringIO(wavs))
wav = wave.open(BytesIO(wavs))
quickquipさん、can110さん、jbpb0さん、TakaiYさん、ご返信いただきありがとうございます。
みなさんがご提案してくださった解決策を一つ一つ実行してみました。
その結果、TakaiYさんが提案してくださったhttps://github.com/gooofy/py-espeak-ng
とjbpb0さんが提案してくださったvoice='ja'をもとに解決することができました。ありがとうございました。
以下にソース全文を掲載します。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from espeakng import ESpeakNG
esng = ESpeakNG(voice='ja')
wav = esng.say('こんにちは', sync=True)
あれ?
「wav = wave.open(...」はやらなくてもいいのですか
> esng = ESpeakNG(voice='ja')
wav = esng.say('こんにちは', sync=True)
日本語に変わってますが、英語の下記も同様に大丈夫ですよね?
esng = ESpeakNG(voice='en-us')
wav = esng.say('Hello World!', sync=True)
質問を編集して「そもそも何がしたかったのか」を追記してください。
それに対して解決策を自分で書いて解決済みにしてください。
https://teratail.com/help#resolve-myself
僕もあれーー?ですね。
回答1件
あなたの回答
tips
プレビュー