質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

解決済

TypeError: initial_value must be str or None, not bytes

reiya_123
reiya_123

総合スコア54

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1回答

0リアクション

0クリップ

235閲覧

投稿2022/09/26 21:58

編集2022/09/27 05:18

前提

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))

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

quickquip

2022/09/27 00:23 編集

wav = wave.open(StringIO(wavs)) #wav = wave.open(BytesIO(wavs)) この2行の意図を書いてください。何をしようとしていますか。 下がコメントになっている理由と、わざわざ載せた理由がありますか?
can110

2022/09/27 01:03

wavsの中身が分からないので、wavs = esng.synth_wav('Hello World!')のあとに print(wavs) あるいは print(wavs[:20])した結果を追記ください。
jbpb0

2022/09/27 01:12 編集

> 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(...」内のどこかがうまくいってないのでしょうね
TakaiY

2022/09/27 02:02 編集

僕もちょっと調べていたのですが、使っているモジュールはそれではなくて、こちらのようです。 speek-ng の方には、ESpeakNGというクラスがは無いので掘っていました。 https://github.com/gooofy/py-espeak-ng 質問のコードは、基本的にこちらのサイトにあるサンプルと同じです。 ただし、このサイトのコードは、python2のモジュール(StringIO)で書かていて、python3 で動かそうとした場合、質問者のような疑問が生じるということになるのだと思います。 ちなみに、python3にも対応しているとは書いてあります。 なぜそうなるのかについては、不明なのですが。
jbpb0

2022/09/27 02:02

> 日本語の音声を作成しようとpy-espeak-ngを使用して実現しようと espeak-ng --voices を実行して確認したら、日本語は「voice='ja'」のようです
jbpb0

2022/09/27 02:28 編集

「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))
reiya_123

2022/09/27 02:33 編集

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)
jbpb0

2022/09/27 03:15 編集

あれ? 「wav = wave.open(...」はやらなくてもいいのですか > esng = ESpeakNG(voice='ja') wav = esng.say('こんにちは', sync=True) 日本語に変わってますが、英語の下記も同様に大丈夫ですよね? esng = ESpeakNG(voice='en-us') wav = esng.say('Hello World!', sync=True)
quickquip

2022/09/27 03:22

質問を編集して「そもそも何がしたかったのか」を追記してください。 それに対して解決策を自分で書いて解決済みにしてください。 https://teratail.com/help#resolve-myself
TakaiY

2022/09/27 04:05

僕もあれーー?ですね。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。