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

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

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

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

Python

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

Q&A

解決済

1回答

532閲覧

TypeError: initial_value must be str or None, not bytes

reiya_123

総合スコア57

Python 3.x

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

Python

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

0グッド

0クリップ

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

僕もあれーー?ですね。
guest

回答1

0

自己解決

オフライン下で日本語の音声をテキストから再生しようと考えていました。
下記にソースで解決しました。

#!/usr/bin/env python3 # -*- coding: utf-8 -*- from espeakng import ESpeakNG esng = ESpeakNG(voice='ja') wav = esng.say('こんにちは', sync=True)

投稿2022/09/27 05:21

reiya_123

総合スコア57

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問