Text to Speech unter Windows

Super vielen Dank werde sie mir heute Abend gleich ziehen :+1:

Sollte ab Powershell 5 laufen, welches man unter Windows 7 evtl. nachinstallieren müsste.

Vielen Dank für die positive Rückmeldung! Eigentlich sollten ja die Zahlen 1-255 erzeugt werden. Ich hatte das im Script aber vorerst auf 1-2 beschränkt. Könnt ihr in der Zeile 43 abändern. Aus
1..2 | % {
wird
1..255 | % {
Dann sollte es vollständig sein.

Super cool! Das mit dem Startguthaben wusste ich gar nicht.

Johannes / Thorsten hat „de-DE-Wavenet-C“ benutzt.

die Generierung der Dateien hat sowohl für Windows als aus für Google grundsätzlich funktioniert. Allerdings wenn ich versuche sie abzuspielen kommt kein Ton. Egal mit welchem Player. Das trifft aber auf die original Tonuino files auch zu. Was mache ich falsch?

edit: mit VLC ging es jetzt … scheint aber generell dann ein komischer codec zu sein …

Also bei mir laufen die in jedem Player. Sind mit 32kbit/s mono codiert.

Ah ja, Danke für den Hinweis. Jetzt macht es Sinn :slight_smile:

Ist die Windows Stimme dann Cortana? Wie hört sich die an? Ist das annehmbar?

So habe mir die Files gezogen und das voiceMenu und das readCard und writeCard angepasst.
Das voiceMenu funktioniert schon mal und die Stimme hört sich gut an :+1:
Habe leider noch Probleme mit dem schreiben und wieder auslesen vom Tag, da ist irgendwo noch ein Dreher, zumindest sehe Ich den RBG wert schon auf dem RFID-Tag zudem funktioniert aus irgendeinem Grund das resetCard nicht, das longPress wird nicht erkannt so das Ich bald keine blank Tag´s mehr habe… morgen geht´s weiter :grin:

Leider ist es nicht cortana und im Vergleich mit z.B. Google ist die Stimme deutlich synthetischer.
Ich werde mich nochmal daran probieren cortana zu aktivieren. Im englischen soll es durch diverse Registry-Eingriffe möglich sein.

Hallo zusammen,

ich laboriere momentan auch an zwei tonuinos auf cubiekid-Basis rum. Soweit läuft das auch, aber ich bin über die fehlenden Textfiles gestolpert. Ohnehin will ich noch einige Texte anpassen und das einzig wirklich “echt” klingende scheint mir die TTS von Google zu sein. Nun hab nach einiger Suche einen Weg gefunden wie man relativ simpel direkt MP3s über Google TTS erzeugen kann… vieleicht hilft es dem ein oder anderen weiter.

  1. Den Chrome Browser öffnen (geht auch mit anderen)
  2. Den Google Translator öffnen
  3. Rechts oben auf die drei “menu” Punkte klicken > dann auf “weitere Tools” > “Entwicklertools”
  4. Auf der rechten Seite erscheinen nun die Entwicklertools. Hier nun den Reiter “Network” auswählen > darunter erscheinen weitere Reiter > den Reiter “Media” auswählen
  5. Jetzt kann man einen beliebigen Text auf der linken Seite in das Translatorfeld eingeben und auf das Lautsprechersybol klicken. Dabei wird der Inhalt aufgerufen und auf der Rechten Seite erscheint ein neuer Eintrag. Doppelklick darauf und ein neuer Tab mit dem File öffnet sich.
  6. Rechtsklick > speichern unter > Fix und fertige MP3 in super Qualität

Hört sich umständlich an, ist aber wirklich simpel, weil man es hintereinander weg machen kann…

mfg Sven

5 „Gefällt mir“

Hallo,

wollte gerade die google translator Version testen um kurz eine Begrüßung zu erstellen, aber den Punkt “weitere Tools” gibt es bei mir leider nicht - muss man da als Entwickler angemeldet sein oder so?

EDIT: Habe gerade https://soundoftext.com/ in einem anderen Beitrag hier gefunden. Das tut es auch

Viele Grüße,
leo

1 „Gefällt mir“

Hallo,

es wurden ja schon einige Möglichkeiten, wie man mit den Bordmitteln der verschiedenen Betriebssystem-Welten (Windows, Linus, Mac) aus Texten MP3s erstellen kann.

Leider klingen die BS-eigenen Stimmen nicht so gut, wie einige Online-Services wie von Google, oder auch kostenlose, über Werbung finanzierte Web-Services.

Google hat aber den Nachteil, dass man sich dort registrieren muss, was - auch wenn kostenlos - nicht jeder machen will.

Kostenlose Web-Services wie http://notevibes.com/de/ bieten ebenfalls sehr natürlich klingende Stimmen und müssen sich vom Klang her nicht hinter dem Google-Service verstecken. Außerdem erfordern sie keine Registrierung, haben aber den großen Nachteil, dass man jeden Text einzeln auf der Website eintragen und die generierte MP3-Datei manuell herunterladen muss.

Und wenn man sich diese Mühe macht, darf man die MP3s noch nicht einmal mit anderen teilen, da dies in den Nutzungsbedingungen (für die kostenlose Nutzung ohne Registrierung) ausgeschlossen ist. MP3s darf man ohne eine kostenpflichtige Lizenz nur für die eigene persönliche Verwendung herunterladen. Es müsste demnach also jeder die von ihm genutzten MP3-Dateien selbst erstellen.

So ähnlich gilt das auch für andere Online-Text-to-Speech-Services.

Um sich die viele Arbeit beim manuellen Aufrufen eines solchen Online-Services zu sparen, kann man diesen Vorgang aber auch automatisieren. Ich möchte anhand eines kleinen Python-Scriptes zeigen, wie man (am Beispiel von notevibes.com) das machen könnte:

import requests
import urllib
import comtypes.client

def text2mp3(textstring,filename):
    req = requests.post("https://notevibes.com/de/", data={'time': '_tonuino', 'content': textstring, 'speed': 1 , 'pitch': 0 , 'voice': 'de-DE-Wavenet-B'})
    if(req.status_code != 200):
        print(req.status_code, req.reason)
        return
    txt = req.text
    start = txt.find('https://storage.googleapis.com/audiog')
    end = txt.find('.mp3',start) + 4
    link = txt[start:end]
    urllib.urlretrieve (link, filename)

Die Funktion besteht im Grunde aus zwei Teilen: Zunächst wird die Website mit den gewünschten Parametern per POST-request aufgerufen. Als Antwort erhält man eine neue Website, deren Beschreibung im String txt abgelegt wird. Aus dieser Beschreibung wird im zweiten Schritt der Dateiname der generierten MP3-Datei herausgesucht und die Datei heruntergeladen.

Die Programmiersprache Python hat gegenüber betriebssystemspezifischen Scriptsprachen den Vorteil, dass sie auf jedem Betriebssystem läuft, aber man könnte dasselbe auch ähnlich z.B. mit der Windows Powershell oder einem Linux-Shell-Script umsetzen.

Das Python-Script lässt sich unter Python einfach mit zwei Strings als Parametern, nämlich dem zu sprechenden Text und dem gewünschten Dateinamen aufrufen. Das Aufrufscript (ebenfalls in Python) könnte dann in etwa so beginnen:

for i in range(1,255):
    text = str(i)
    text2mp3(text, text.zfill(4) + '.mp3')
 
text2mp3("Oh, eine neue Karte! Verwende die Lautstärke Tasten um einen Ordner für die Karte auszuwählen. Drücke die Pause Taste um die Auswahl zu speichern.", \
  '0300_new_tag.mp3')

...

Auf notevibes gibt es vier verschiedene deutsche Sprachen. Je nach gewünschter Sprache müsste im Script der Parameter ‚voice‘ angepasst werden. Dies sind die gültigen Einträge:

  • Anika: de-DE-Wavenet-A
  • Markus: de-DE-Wavenet-B
  • Arabella: de-DE-Wavenet-C
  • Gust: de-DE-Wavenet-D

Außerdem kann man noch mit dem Parameter speed die Sprachgeschwindigkeit (gültige Werte: 0.2, 0.4, 0.6, 0.8, 1, 1.25, 1.5, 1.75, 2) und mit dem Parameter pitch die Tonhöne (gültige Werte: -20, -15, -10, -5, 0, 5, 10, 15, 20) einstellen. Der Parameter time wird lediglich an den Dateinamen der von notevibes generierten MP3-Datei angehängt und muss kein Zeitstring sein. Er dient lediglich dazu, von mehreren Nutzern erstellte MP3s auf dem Server zu unterscheiden. Da im Falle des Scripts jede Datei unmittelbar nach dem Erstellen heruntergeladen wird, dürfte es hier keine Konflikte geben.

Viel Spaß beim Ausprobieren!

3 „Gefällt mir“

Ach ja,

mein letzter Beitrag passt ja nicht ganz zum Überschriftsthema „Text to Speech unter Windows“.

Mit Python kann man natürlich auch die Windows-eigene Sprachsynthese verwenden, aber die klingt nunmal nicht so schön:

import comtypes.client

def text2wav(textstring,filename):
    speak = comtypes.client.CreateObject("SAPI.SpVoice")
    filestream = comtypes.client.CreateObject("SAPI.spFileStream")
    filestream.open(filename, 3, False)
    speak.AudioOutputStream = filestream 
    speak.Speak(text)
    filestream.close()

Mit dem Script werden keine MP3s sondern WAV-Dateien erstellt, die man dann z.B. mit dem VLC-Player zu MP3 konvertieren kann.

Hi Peer
Some think wrong with my code. :frowning:
Please help!

import requests
import urllib
import comtypes.client
import codecs
import tkinter.filedialog as filedialog 
import tkinter as tk
# ----------Peer's code-----------
def text2mp3(textstring,filename):
    req = requests.post("https://notevibes.com/de/", data={'time': '_tonuino', 'content': textstring, 'speed': 1 , 'pitch': 0 , 'voice': 'vi-VN-Standard-A'})
    if(req.status_code != 200):
        print(req.status_code, req.reason)
        return
    txt = req.text
    start = txt.find('https://storage.googleapis.com/audiog')
    end = txt.find('.mp3',start) + 4
    link = txt[start:end]
    urllib.request.urlretrieve (link, filename)
#-------------------------------------------
def input():
    input_path = tk.filedialog.askopenfilename() #chose txt file
    input_entry.delete(0, tk.END)  # Remove current text in entry
    input_entry.insert(0, input_path)  # Insert the 'path'
def dich():
    my_txt_file = input_entry.get() # convert a text file into a string
    file = open(my_txt_file, "r", encoding="utf-8") # convert text file to string
    content = file.read()    # convert text file to string
    filename3 = tk.filedialog.asksaveasfilename(defaultextension=".mp3", filetypes=(("MP3", "*.mp3"),("All Files", "*.*") )) # folder and name mp3 file.
    text2mp3(content, filename3)
############### 
master = tk.Tk()
top_frame = tk.Frame(master)
bottom_frame = tk.Frame(master)
line = tk.Frame(master, height=1, width=400, bg="grey80", relief='groove')
input_path = tk.Label(top_frame, text="Input File Path:") #Label
input_entry = tk.Entry(top_frame, text="", width=40)
browse1 = tk.Button(top_frame, text="Browse", command=input) # click (Browse) button to run (input)
begin_button = tk.Button(bottom_frame, text="Convert to mp3!", command=dich) # click (Convert to mp3!) button to run (dich)
top_frame.pack(side=tk.TOP)
line.pack(pady=10)
bottom_frame.pack(side=tk.BOTTOM)
input_path.pack(pady=5)
input_entry.pack(pady=5)
browse1.pack(pady=5)
begin_button.pack(pady=20, fill=tk.X)
###############################

It is quite difficult to tell you whats wrong with your code when you just paste some source code without a description what it is supposed to do and what it actually does.

But some things are quite obvious:

  1. You are defining the functions input() and dich() but never call them. What are they meant to do and when whould they be called?
  2. No real bug, but no clean code either: You are importing tkinter.filedialog as filedialog but never use filedialog directly.
  3. No real bug, but no clean code either: The imports are not at the beginning of the code.

Thank Peer!
This code work with news.txt https://drive.google.com/open?id=1Mm3CFt59mLB5KLyIHkC8oUeHIDKZiZio
But dosen’t work with nt100.txt https://drive.google.com/open?id=1k04RRShuTSzQ3kcUXEqr3JaqVSG7k0CB
all file are .txt utf8 :frowning:
Please! Can you try to run my code? Thanks!

Sorry, but without a clear description what the code ist meant to do and what error actually occurs, I am not able to help you.

1 „Gefällt mir“

Please stay on topic. The scripts here are for a specific purpose - the TonUINO. It’s not a general script for speech synthesis. Please refer to a python board for general help with python. Thanks.

Sorry Stephan :frowning:

Peer’s code doesn’t work when input txt file.

import requests
import urllib
import comtypes.client
import requests
import urllib
import comtypes.client
import codecs

###Input txt file
file = open("nt100.txt", "r", encoding="utf-8") 
content = file.read()
#### TTS - Peer's code #########
def text2mp3(textstring,filename):
    req = requests.post("https://notevibes.com/de/", data={'time': '_tonuino', 'content': textstring, 'speed': 1 , 'pitch': 0 , 'voice': 'vi-VN-Standard-A'})
    if(req.status_code != 200):
        print(req.status_code, req.reason)
        return
    txt = req.text
    start = txt.find('https://storage.googleapis.com/audiog')
    end = txt.find('.mp3',start) + 4
    link = txt[start:end]
    urllib.request.urlretrieve (link, filename)
text2mp3(content, \
  '0300_new_tag.mp3')