Super vielen Dank werde sie mir heute Abend gleich ziehen
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
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
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
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.
- Den Chrome Browser öffnen (geht auch mit anderen)
- Den Google Translator öffnen
- Rechts oben auf die drei “menu” Punkte klicken > dann auf “weitere Tools” > “Entwicklertools”
- Auf der rechten Seite erscheinen nun die Entwicklertools. Hier nun den Reiter “Network” auswählen > darunter erscheinen weitere Reiter > den Reiter “Media” auswählen
- 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.
- 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
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
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!
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.
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:
- You are defining the functions input() and dich() but never call them. What are they meant to do and when whould they be called?
- No real bug, but no clean code either: You are importing tkinter.filedialog as filedialog but never use filedialog directly.
- 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
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.
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
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')