py-picotts keine Sprachausgabe

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
MpOnE
User
Beiträge: 15
Registriert: Dienstag 24. November 2020, 20:48

Guten Abend,

ich beschäftige mich derzeit mit dem py-picotts Modul, was aber nicht ganz funktionieren will.
mein Testscript sieht so aus:

Code: Alles auswählen

    picotts = PicoTTS()
    picotts.voice = 'de-DE'  # ['de-DE', 'en-GB', 'en-US', 'es-ES', 'fr-FR', 'it-IT']
    wavs = picotts.synth_wav('Hallo Welt')
    # wav = wave.open(StringIO(wavs))
    wav = wave.open(BytesIO(wavs))
    print(wav.getframerate(), wav.getnframes())
Output:

Code: Alles auswählen

16000 16192
Leider ist kein Ton über Lautsprecher zu hören und suchen hat mich hierher befördert (nach Tagen).

Ich hoffe ihr könnt mir weiterhelfen.

MfG
MpOnE
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@MpOnE: Natürlich ist da kein Ton zu hören. Du hast da Code geschrieben der Wav-Daten erzeugt und die Samplerate und die Anzahl der Samples als Text ausgibt. Um die Wav-Daten abzuspielen brauchst Du eine entsprechende Bibliothek mit der das geht.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
MpOnE
User
Beiträge: 15
Registriert: Dienstag 24. November 2020, 20:48

@__blackjack__:
Soweit bin ich auch jedoch frage ich mich wie ich jetzt das ganze abspiele und welcher befehl dazu notwendig ist..

Das Ganze läuft auf Debian
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Python audio Ausgabe mal gesucht? Ich finde da jede Menge, zb Pyaudio oder pygame oder playsound ...
MpOnE
User
Beiträge: 15
Registriert: Dienstag 24. November 2020, 20:48

Die Frage die ich mir stelle ist ob ich dabei pulseausdio verwenden kann

Unter debian Funktionierts ja relativ einfach mit:

Code: Alles auswählen

play ./sound.wav
Gibts dazu eine Adaption zu python?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hats du die Frage mal selbst versucht zu beantworten? Ist ja nicht so als ob einem da nicht jede Menge Projekte entgegenkommen, wenn man das mal Google zum frass vorwirft: https://www.google.de/search?q=python+pulseaudio
MpOnE
User
Beiträge: 15
Registriert: Dienstag 24. November 2020, 20:48

In der Tat halten wirs mal testweise einfach
ich werd playsound() dafür benutzen dafür müsste ich jetzt das ganze in eine Datei schreiben wie mache ist das ?
oder gibts die Möglichkeit die wav Variable direkt (ohne diese in eine Datei zu schreiben) abzuspielen über playsound?
MpOnE
User
Beiträge: 15
Registriert: Dienstag 24. November 2020, 20:48

Ich komm leider nicht weiter.

mein jetziges Script sieht so aus:

Code: Alles auswählen

    picotts = PicoTTS()
    AudioRec = pyaudio.PyAudio()

    picotts.voice = de-DE  # ['de-DE', 'en-GB', 'en-US', 'es-ES', 'fr-FR', 'it-IT']
    wavs = picotts.synth_wav(phrase)

    # Channels: 1, SampleRate: 16000Hz,  Encoded sample size in bits: 16
    # wav = wave.open(StringIO(wavs))
    wav = wave.open(BytesIO(wavs), 'rb')

    # open stream
    stream = AudioRec.open(16000, 1, pyaudio.paInt8, output=True))
    data = wav.readframes('1024')

    # play stream
    while len(data) > 0:
        stream.write(data)
        data = wav.readframes('1024')

    # stop stream
    stream.stop_stream()
    stream.close()

    # close PyAudio
    AudioRec.terminate()
    
Und erhalte folgende Fehlermeldung:

Code: Alles auswählen

TypeError: object of type 'Wave_read' has no len()
Irgendjemand einen Rat bzw. Lösung?
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@mpone: Aus dem Code geht nicht hervor, welches Modul du verwendest. So kann man nur wiederholen, was die Fehlermeldung (die übrigens in ihrer kompletten Form sogar die Zeile angibt, in der die Exception auftritt), schon sagt: du versuchst len() auf etwas aufzurufen, dass bei dem du die Funktion nicht aufrufen kannst.
Also musst du in der Dokumentation des Moduls nachlesen, wie man das, was du vor hast, wirklich umsetzt.
MpOnE
User
Beiträge: 15
Registriert: Dienstag 24. November 2020, 20:48

Benutzt werden folgende Module:

Code: Alles auswählen

from io import BytesIO
from picotts import PicoTTS
import pyaudio
import wave
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Vollständigen Code. Vollständige Fehlermeldung. Sonst ist die Zuordnung der Fehlerquelle nicht möglich.
MpOnE
User
Beiträge: 15
Registriert: Dienstag 24. November 2020, 20:48

Dann einmal Vollständig aktuelles Script:

Testscript:

Code: Alles auswählen

from io import BytesIO
from picotts import PicoTTS
import pyaudio
import wave


def say():
    picotts = PicoTTS()
    picotts.voice = 'de-DE'
    wavs = picotts.synth_wav('Hallo Welt!')
    wav = wave.open(BytesIO(wavs))
    # print(wav.getnchannels(), wav.getframerate(), wav.getnframes())

    # instantiate PyAudio (1)
    p = pyaudio.PyAudio()
    # print(p.get_format_from_width(wav.getsampwidth()))

    # open stream (2)
    stream = p.open(format=8,
                    channels=1,
                    rate=16000,
                    output=True)

    # read data
    data = wav.readframes(1024)

    # play stream (3)
    while len(data) > 0:
        stream.write(data)
        data = wav.readframes(1024)

    # stop stream (4)
    stream.stop_stream()
    stream.close()

    # close PyAudio (5)
    p.terminate()


if __name__ == '__main__':
    say()

Output:

Code: Alles auswählen

ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.surround71
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.hdmi
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.hdmi
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.modem
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.modem
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.phoneline
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.phoneline
ALSA lib pcm_oss.c:377:(_snd_pcm_oss_open) Unknown field port
ALSA lib pcm_oss.c:377:(_snd_pcm_oss_open) Unknown field port
ALSA lib pcm_a52.c:823:(_snd_pcm_a52_open) a52 is only for playback
ALSA lib pcm_usb_stream.c:486:(_snd_pcm_usb_stream_open) Invalid type for card
ALSA lib pcm_usb_stream.c:486:(_snd_pcm_usb_stream_open) Invalid type for card
Keine Fehlermeldung & kein Ton.
inputDevices hab ich alle durchprobiert

EDIT:
Weiteren versuchen klappt nun auch die Ausgabe, lag wohl am System selbst...
eine Frage hab ich noch unzwar wie kann ich den output von pyAudio() abstellen bzw in der Konsole nicht erscheinen lassen?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

MpOnE
User
Beiträge: 15
Registriert: Dienstag 24. November 2020, 20:48

__deets__ hat geschrieben: Mittwoch 25. November 2020, 15:16 https://stackoverflow.com/questions/425 ... s-not-work

Für sie gegoogelt 🙄🙃
Hab ich auch gefunden, der eigentliche Gedanke war Outputs "gewollt" unterdrücken zu können a la:

Code: Alles auswählen

# Soll angezeigt werden
Print('Hallo Welt')

# Soll nicht angezeigt werden
Print('Tschüss Welt') > nul
Antworten