Thoughts on Solus linux, systemd timers vs cron, and the state of TTS on linux.

2019-12-07-1

I've been trying Solus linux, a rolling distro that tries to stay very modern, out as a potential replacement for Ubuntu. It has first class MATE support and a modern 5.x kernel. It seems very nice visually. But, and I know it's not it's fault, as my first hard intro to systemd all the things I dislike about it are making me dislike Solus. Instead of just one line and done with cron with systemd timers you create two ~15 line config files and then it's not even auto-detected you have to run another long system command to reload config. This was an unpleasant discovery and hopefully not a harbinger of things to come. But just in case I've set up a Devuan VM too to set up the same software flows as I implement them on systemd. I'll have to learn all this systemd stuff sometime anyway.

One of the first and most important things I need set up on daily driver OS is proper text to speech. In the old days this meant Festival 1.96 with CMU Arctic dataset HTS voices. This produces a monotone but clearly understood voice rapidly. Unfortunately Festival 2.0 does not support the Nitech CMU Arctic HTS voices so distros that only had it (building festival from source is a nightmare) were always ruled out. But today while playing around in solus I learned about mimic. It's apparently a festival lite fork but it supports all the CMU HTS voices I've come to know and love over the last decade while improving many other features. Now with mimic you can set speech speed and pitch on the fly now instead of having to config it to export every utterance to aplay binary call for manual speeding and pitch shift. Bye-bye,

(Parameter.set 'Audio_Command "aplay -q -c 1 -t raw -f s16 -r $(($SR*105/100)) $FILE")

Hello,

--setf duration_stretch=0.8 --setf int_f0_target_mean=145
...or something like that.

While talking about mimic on IRC another guy recommended I check out RHVoice which apparently has a US English voice included but no online voice samples. I'll try compiling that later. In the far future there's also all those machine learning based "tacotron" text to speech methods which apparently will be the core of mimic2 and Mozilla's text to speech core.

Edit: Nope.

I was wrong. It turns out mimic doesn't have flitevox compatible voices for the nitech_us_slt_arctic_hts. It has a HTS voice from the same CMU arctic dataset but by people at CMU. This voice is not equal in quality to the Nitech one. Mimic 1 is not a replacement for festival 1.96.

But!

It turns out that debian did fix the syntax of the nitech voices for festival 2.0 compatibility and put some of them in the default repos! So debian 10 does have some of the nitech voices but not cmu *slt* dataset. But on the debian bug management list there is a guide on how to do it yourself. Thanks Debian! It's worth noting that Devuan, which I was also investigating, doesn't even have the CMU HTS voices at all in it's repos for festival. So both Solus and Devuan are out of the running. Debian 10 it is.


Steven Erikson's "Rejoice, A Knife to the Heart" is like if "Watchmen" was written by a bitter education worker.

2019-12-11-1
sci-fi author writes story about sci-fi author

Steven Erikson's "Rejoice, A Knife to the Heart" is like if "Watchmen" was written by a bitter education worker. They'll save Earth from $disaster by force! It is a pure wish fullfillment story about a godlike intelligence suddenly coming to earth and forcing everyone to play nice, even, especially, with other animals. It plays on the common trope of scifi authors that is having the main character be a scifi author. This leads to no end of not so subtle 4th wall references that break suspension of disbelief. It explicitly says it's not hard scifi through one of these 4th wall nested comments about the outer reading frame. And this is very, very true. Throughout the book the times when it even tangentially approaches physics it uses the terms in ways that are not even wrong. But that lampshade was well hung so lets move beyond that. The actual story is pretty catchy and the particular blend of authoritarians nanny state paradise isn't by itself attractive. But it is a fun and interesting what-if story about ripping out the basic precepts of human interactions and trying to start anew. And plenty of what it criticises about the current economics of humanity is spot on.

I'm still only about a third in so much could change but it's a fun book. He spends a good chunk of the first part of the book justifying picking a scifi author and his previous effort in scifi "Willful Child" was not so much as story as a roast of common scifi tropes wrapped around educational system criticism. So he's surely aware of the tight rope he's walking here using and mocking the same tropes. It mostly works. If you haven't already read Cory Doctorow's "Walkaway" maybe read that first. But if you have and you're looking for more like it then "Rejoice, A Knife to the Heart" is a good pick.


CSS in HTTP Headers

on blog at 2019-12-11-2
css, css everywhere!

I found out you can put links to CSS in webserver HTTP header responses. I've got /header.css linked in this servers HTTP headers now. All it's doing is resizing images but it's kind of handy for the blog pages where embeding css in each would be a hassle. For nginx this is easy to do in your .conf,

add_header Link "<//superkuh.com/header.css>; REL=stylesheet";

The // instead of a full or specific URL is for portability re: HTTP and HTTPS. Do a,

$ curl -I superkuh.com

to see. Most browsers don't support header linked CSS but most browsers suck shit and people shouldn't use them. I'm looking at you Chrome. This does work in standards based browsers like Firefox and it's forks.


Indieweb, microformats markup, and a minimum webmention implemention

on blog at 2019-12-11-3

The whole indieweb microformats movement seems good to me. It encourages hosting your own and the mark-up is just repurposing the flexible html class attribute tag. I only had to change my post format and perl regex a tiny bit in order to accommodate h-entry style mark-up. Validate me.

Webmentions is a well intentioned track-back like feature for systematized auto notification of responses to posts marked up with the microformat2 h-entry stuff. It requires an endpoint defined in the page that can receive url-form encoded strings that then goes out and actively GETs the other endpoint servers to do things. Without DoS mitigation somehow(?) this doesn't seem wise. There's even a guide to do it manually with curl so I'm going to see if I can whip up a perl script to tail the logs and perform this function without the webserver being involved. But that's for a future post. For now I have to write something to automate converting my old format html format to h-entry tagged.

Update: wrong again, webmentions suck.

It seems like every blog post I've written this year has later turned out to be wrong. Indieweb is not useful, the webmentions aspect of it requires receiving x-www-form-urlencoded data. Why they chose this convoluted and complexity increasing way is beyond me. Embeding (or encoding) it in the URL string itself would've been infinitely easier for everyone with no downsides. But no, with x-www-form-urlencoded variables you need to actually be doing some dynamic scripting to handle it. If not actually some script listening for that location/endpoint then at least a series of complex nginx directives and modules to get x-www-form-urlencoded logged with all the rest of the request. This additional complexity makes running a static website that supports indieweb standards like a tail wagging the dog in terms of the webmentions receiver's relation to the static http site.

microformats2 h-entry markup for web content is still cool though. I'm going to keep doing that.

Update 2: the workaround

Time has passed and it's a new decade now (2020-01-08) but I kept banging away at the problem of form encoded POST data and how to get it into the logs. The trick turned out to be proxying nginx to itself so it'd think it might be passing to a cgi script and have the request body data left in. A big thanks to aaronpk of the freenode #indieweb-dev channel for putting up with my complaints and tipping me off about the nginx proxying to itself path.

# /etc/nginx/nginx.conf
http{
	log_format postdata $request_body;
}
# /etc/nginx/sites-enabled/default.conf
	# use proxying to self to get the HTTP post variables.
	# https://stackoverflow.com/questions/4939382/logging-post-data-from-request-body
	location = /webmention {
		client_max_body_size 10k;
		if ($request_method = POST) {
			access_log /var/log/nginx/postdata.log postdata;
			proxy_pass $scheme://127.0.0.1/logsink;
			break;
		}   
		return 200 $scheme://$host/serviceup.html;
	}
	location /logsink {
		return 200;
	}

[webmention/pingback] Did you respond to this post? What's the URL?